go testテストキャッシュ無効化
背景
プロジェクト開発はユニットテストを行い、テストcasesを走るとき、走るたびにログの後にマークが付いていることを発見した.コードの実装はすでに修正されている(例えば異なるデータを返す)が、
go test -v case_test.go
を再実行し、前回の結果が一致することが分かったが、実際にはこのようなテストはあまり意味がない.go test
の原理はこれまで知られていませんが、内部がどのようにrunされているのか、テストキャッシュをどのように無効にするかを見たいと思っています.もんだいぶんせき
Go公式ドキュメント testパケットの動作原理を詳細に説明します.
go test
が実行されると、各パケットとすべての接尾辞がコンパイルされます*test.go名前のファイル(一部のユニットテストとベンチマークテストを含む)は、生成されたバイナリプログラムをリンクして実行し、各テスト関数の出力ログを印刷します.Go testは2つのモードをサポートしています.
go test
が呼び出されたときにパラメータ(例えばgo test
またはgo test -v
)を付けなかった.このモードでは、キャッシュは無効になります.現在のディレクトリのコードとテストがコンパイルされ、テストバイナリが実行されます.go test
が実行されたときに、ファイルパス(例えばgo test math
、go test ./...
)を指定します.このモードでは、パスにリストされている各テストファイルがコンパイルされ、テストされます.go test
は、不必要な繰り返しテストを回避するために、成功したテスト結果をキャッシュします.再度テストを実行すると、キャッシュ内の対応するテスト結果がOKかどうかを確認し、OKがテストバイナリファイルを実行せずに前の出力を再表示する場合があります.このとき、go test
は'(cached)'識別子を印刷します.振り返って、プロジェクトのテストスクリプトを見てみましょう.
CGO_ENABLED=1 go test -v --mod=vendor ./pkg/...
Package list modeで実行しているので、単測に合格した後の二次テストではcacheを歩きます.
ソリューション
テストでキャッシュを無効にするには、次の3つの方法があります.
go test
--count=1
パラメータ(推奨、効率が高い)を追加します.例:CGO_ENABLED=1 go test -v --count=1 --mod=vendor ./pkg/...
go clean -testcache // Delete all cached test results
GOCACHE=off
を設定するとキャッシュが無効になります.小結
Goプロジェクトのテストでは、
go test
の行動表現に注目し、単測の結果が実際と異なる場合は、go test
を使用する姿勢が正しいか、パラメータを忘れたかを考慮しなければなりません.リファレンス