なぜテストする必要があるのですか
完全なテスト システムは、開発の効率を向上させることができます。プロジェクトが十分に複雑な場合、バグを可能な限り減らすには、コード レビューとテストという 2 つの効果的な方法があります。Go 言語は、ユニットを実装するためのテスト パッケージを提供します。テスト機能。
テストルール
単体テストを開始するには、 go ソース コード ファイルを準備する必要があります。ファイルに名前を付けるとき、ファイル名は_test.go
で終わる必要があります。単体テスト ソース コード ファイルは、複数のテスト ケースで構成できます (次のように理解できます)。関数)、および各テスト ケースの名前の前に Test を付ける必要があります。次に例を示します。
func TestXxx( t *testing.T ){
//……
}
テスト ケースを作成するときは、次の点に注意する必要があります。
- テスト ケース ファイルは通常のソース コードのコンパイルには参加せず、実行可能ファイルには含まれません。
- テスト ケースのファイル名は
_test.go
で終わる必要があります。 - テスト パッケージをインポートするには、import を使用する必要があります。
- テスト関数の名前は
Test
またはBenchmark
で始まり、その後に任意の文字列が続きます。ただし、最初の文字は大文字にする必要があります (例: TestAbc())。テスト ケース ファイルには複数のテスト関数を含めることができます。 - 単体テストでは
(t *testing.T)
をパラメーターとして使用し、パフォーマンス テストでは(t *testing.B)
をパラメーターとして使用します。 - テスト ケース ファイルは
go test
コマンドを使用して実行されます。main() 関数はソース コードのエントリ ポイントとして必要ありません。ソース コード ファイル内のTest
で始まり_test.go
で終わる関数はすべて自動的に実行されます。
Go 言語のテスト パッケージでは、単体 (機能) テスト、パフォーマンス (ストレス) テスト、カバレッジ テストの 3 つのテスト方法が提供されます。
単体(機能)テスト
次の図に示すように、同じフォルダーに 2 つの Go 言語ファイルを作成し、それぞれ、demo.go と demt_test.go という名前を付けます。
具体的なコードは次のとおりです。
demo.go:
package demo
//長さと幅から面積を取得
func GetArea(weight int、height int) int {
return weight * height
}
demo_test.go:
package demo
import "testing"
func TestGetArea(t *testing.T) {
area := GetArea(40, 50)
if area != 2000 {
t.Error("テスト失敗")
}
}
テスト コマンドを実行すると、実行結果は次のようになります。
PS D:\code> go test -v
=== RUN TestGetArea
— PASS: TestGetArea (0.00s)
PASS
ok _/D_/code 0.435s
パフォーマンス (ストレス) テスト
demo_test.go のコードを次のように変更します。
package demo
import "test"
func BenchMarkGetArea(t *test。B){
for i:= 0; i <t.N; i ++ {
GetArea(40,50)
}
}
テスト コマンドを実行すると、実行結果は次のようになります。
PS D:\code> go test -bench=”.”
goos: windows
goarch: amd64
BenchmarkGetArea-4 2000000000 0.35 ns/op
PASS
ok _/D_/code 1.166s
上記の情報は、プログラムが2000000000 回実行され、合計 0.35 ナノ秒かかることを示しています。
カバレッジ テストでは、テスト プログラムでどの程度のビジネス コードがカバーされているか (つまり、demo.go のコードがどの程度、demo_test.go でテストされるか) を知ることができ、可能であれば 100% をカバーすることが最善です。
demo_test.go コードを次のように変更します。
package demo
import "test"
func TestGetArea(t * testing.T){
area:= GetArea(40,50)
if area!= 2000 {
t.Error("テストに失敗しました")
}
}
func BenchMarkGetArea(t * testing.B){
for i:= 0; i <t.N; i ++ {
GetArea(40,50)
}
}
テスト コマンドを実行すると、実行結果は次のようになります。
PS D:\code> go test -cover
PASS
coverage: 100.0% of statements
ok _/D_/code 0.437s