機能テストで完全なカバレッジを表示する方法
問題:
機能テストがコンパイル済みで実行されるバイナリ コード。未発見の死角の余地を残します。
コード スニペット:
<code class="go">package main import ( "fmt" "math/rand" "os" "time" ) var exitCode int func Test_main(t *testing.T) { go main() exitCode = <-exitCh } func TestMain(m *testing.M) { m.Run() // can exit because cover profile is already written os.Exit(exitCode) } func main() { rand.Seed(time.Now().UTC().UnixNano()) for { i := rand.Int() fmt.Println(i) if i%3 == 0 { os.Exit(0) } if i%2 == 0 { os.Exit(1) } time.Sleep(time.Second) } }</code>
解決策:
1.ビルドタグを使用してメイン関数を除外:
<code class="go">//+build !test package main func main() { os.Exit(doFunc()); }</code>
タグを使用してビルド:
go test -c -coverpkg=. -o example -tags test
2.機能をテスト可能なコードに抽出:
機能を他のクラスに抽出してメイン関数をテストすることを避けます。 func TestMain を使用して、メイン スレッドでのコードの実行を制御します。
3.モッキングの使用:
依存関係のモックを作成して、特定のコード パスを分離し、テスト容易性を向上させます。
4.カバレッジのタイムアウト:
テストにタイムアウトを追加して、アプリケーションが終了する前にカバレッジ ツールにプロファイルを書き込む時間を与えます。
タイムアウトの例:
<code class="go">func exit(code int) { exitCh <- code time.Sleep(1 * time.Second) // Allow time for coverage data to be written os.Exit(code) }</code>
利点:
以上が## 機能テストで完全なカバレッジを達成するには: コードと実行の間のギャップを埋めるには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。