ホームページ  >  記事  >  バックエンド開発  >  golang テストのテスト方法

golang テストのテスト方法

WBOY
WBOYオリジナル
2023-05-13 12:16:071604ブラウズ

Go 言語は、テストもサポートしており、非常に使いやすい、高速、安全、シンプルなプログラミング言語です。 Golang で開発およびテストする場合、コードの品質と精度が向上し、開発者がプロ​​ジェクト開発中に反復しやすくなります。

この記事では、単体テスト、ベンチマーク テスト、パフォーマンス テスト、境界テストなど、Golang のテスト方法を紹介します。一般的なテスト ケースとテスト手法を共有して、読者が Golang のテスト手法とスキルをより深く理解し、開発効率と品質を向上できるようにします。

1. 単体テスト

1. テスト ケースの基本フレームワーク

テスト ケースの基本フレームワークは次のとおりです:

func TestFunctionName(t *testing.T) {
    // testing function
}

TestFunctionName は、テスト ケースの名前です。 test メソッド。これは Test で始まり、次の FunctionName は任意に名前を付けることができます。 testing.T はテスト コンテキストであり、テスト アクセス メソッドをスケジュールし、テスト ステータスを記録するために使用されます。テスト中に障害やエラーを報告したり、テスト結果をコンソールに出力したりするために使用できます。

コード例:

package main

import "testing"

func Sum(x int, y int) int {
    return x + y
}

func TestSum(t *testing.T) {
    got := Sum(1, 2)
    want := 3

    if got != want {
        t.Errorf("Sum(1,2) = %d; want %d", got, want)
    }
}

プログラムの実行中に、出力結果が期待と一致しない場合、エラー メッセージが出力されます。例:

--- FAIL: TestSum (0.00s)
    main_test.go:11: Sum(1,2) = 4; want 3
FAIL
exit status 1
FAIL        command-line-arguments  0.005s

2. テスト ケースの名前と構成

Golang のテスト メソッド名には、先頭に Test を付ける必要があります。これにより、go test コマンドの実行時に、テスト フレームワークが自動的にメソッドを認識して実行できるようになります。同時に、同じ名前を持つ他のテスト メソッドとの競合を避けるために、テスト メソッドの命名は一意性を確保する必要があります。

テスト ケースをより適切に整理するために、テスト ケースの前に次のような識別可能な識別子を追加できます。

  • TestXxx、BenchmarkXxx、ExampleXxx で例を実行する場合ブラウザで対応する関数を実行し、テスト コマンドではこのテスト メソッドのみが実行されます。例: TestParseShort()
  • TestXxxParallel は並列実行でき、t.Parallel() を使用してテストの効率を向上できます。例: TestFooParallel()
  • 3. テスト ケースの目標と実装

単体テストを通じて、次のような Golang コードの品質と精度を検証できます。

##関数が期待した結果を返すかどうか

実行時処理ロジックに準拠しているかどうか
    ##予期せぬ状況に対処できるかどうか
  • ##コード例:
  • // Add 两个整数x和y
    func Add(x, y int) int {
        return x + y
    }
  • 対応するテスト コード:
  • func TestAdd(t *testing.T) {
        cases := []struct {
            in1, in2, want int
        }{
            {1, 2, 3},
            {0, 0, 0},
            {-1, 1, 0},
        }
        for _, c := range cases {
            got := Add(c.in1, c.in2)
            if got != c.want {
                t.Errorf("Add(%d, %d) == %d, want %d", c.in1, c.in2, got, c.want)
            }
        }
    }
  • Go のテスト フレームワークを使用すると、ループ、分岐、例外エラー処理などの制御構造を備えたテスト ケースを作成できます。コードのテストでは、入力パラメーターを関数に渡し、関数の出力値を期待値と比較することで、コードが設計どおりに動作することを検証します。

2. ベンチマーク テスト

Golang ベンチマーク テストは、さまざまな状況下でのコードのパフォーマンスの違いを比較するために使用されます。ベンチマークではコードを複数回実行し、実行時間を比較します。速度に差がある場合は、どちらの実装が速いかを判断できます。

ベンチマーク テストの基本的な枠組みは次のとおりです。

func BenchmarkFunctionName(b *testing.B) {
    // Testing code
}

このうち、BenchmarkFunctionName はベンチマーク テストのメソッド名を表し、必ず Benchmark で始まる必要があり、次の FunctionName は任意に付けることができます。 testing.B はテスト コンテキストであり、テストのステータスと反復を制御するために使用されます。ベンチマーク テスト中に、これを使用してテストの実行数を制御したり、テストの停止時に発生する可能性のあるエラーやその他の問題を検出したりできます。

コード例:

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(1, 2)
    }
}

プログラムを実行すると、出力結果は次のようになります:

BenchmarkAdd-4        2000000000             0.29 ns/op
PASS
ok      _/Users/test/main    1.028s

このうち、

"BenchmarkAdd " はベンチマーク テストを表します。 名前

"4" は、テスト関数によって並列実行されるゴルーチンの数を示します。

"2000000000" は、テストによって実行される反復の合計数を示します。B. Go 言語における各反復の内部適応バランシング 時間
  • 「0.29 ns/op」は、各反復に必要な平均時間が 0.29 ナノ秒であることを意味します。
  • 3. パフォーマンス テスト
  • パフォーマンス テストは、長期運用中のプログラムのパフォーマンスをテストするために使用されます。例:
  • func TestPerfAdd(t *testing.T) {
        for i := 0; i < 100000; i++ {
            Add(1, 2)
        }
    }
  • テスト ループは、関数を 100,000 回実行して、長時間実行した場合のパフォーマンスの問題をテストします。メモリ リーク、ファイル ハンドル リーク、その他のリソース リークに対してプログラムがどの程度うまく機能するかをテストするのに最適です。

4. 境界テスト

境界テストは、コードが境界条件をどの程度適切に処理するかをテストするために使用されます。例:

func TestBubbleSort(t *testing.T) {
    tests := []struct {
        name string
        in   []int
        want []int
    }{
        {"Sorted", []int{1, 2, 3, 4, 5}, []int{1, 2, 3, 4, 5}},
        {"Reverse", []int{5, 4, 3, 2, 1}, []int{1, 2, 3, 4, 5}},
        {"FewElement", []int{5, 3}, []int{3, 5}},
        {"Duplicate", []int{5, 3, 5, 2, 2}, []int{2, 2, 3, 5, 5}},
    }

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            BubbleSort(tt.in)
            if !reflect.DeepEqual(tt.in, tt.want) {
                t.Errorf("test case %s expects %v but actual is %v",
                    tt.name, tt.want, tt.in)
            }
        })
    }
}

境界テストは、プログラムが期待を満たしているかどうかをチェックできます。エッジ条件の処理、例:

一部の異常な入力 (負の数、0、最大/最小値など) を処理する

プログラムを最速または最も遅い処理にします。状況(データサイズが0や最大値など)

関数の各種パラメータに上限値と下限値を設定し、関数の反応をテストする
  • 概要
  • Golang コードをテストするときは、プログラムのさまざまな部分に有用で包括的なテストを提供するために、テスト ケースの多様性を考慮する必要があります。 Golang テスト フレームワークは単体テスト、ベンチマーク テスト、パフォーマンス テスト、境界テストをサポートしており、実際のニーズに応じて選択できます。それだけでなく、テストメソッドの名前の標準化、テストタスクの合理的な割り当て、繰り返されるテストロジックの抽出、テストの迅速な実行を容易にするなど、いくつかのテストのベストプラクティスに従う必要もあります。これらのテストスキルを習得すれば、読者は Golang を開発する際に、より詳細なコードテストを実行できるようになり、開発のテスト効率とコード品質が向上すると思います。

以上がgolang テストのテスト方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。