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 コマンドの実行時に、テスト フレームワークが自動的にメソッドを認識して実行できるようになります。同時に、同じ名前を持つ他のテスト メソッドとの競合を避けるために、テスト メソッドの命名は一意性を確保する必要があります。
テスト ケースをより適切に整理するために、テスト ケースの前に次のような識別可能な識別子を追加できます。
単体テストを通じて、次のような 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) } } }
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 言語における各反復の内部適応バランシング 時間func TestPerfAdd(t *testing.T) { for i := 0; i < 100000; i++ { Add(1, 2) } }
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 サイトの他の関連記事を参照してください。