ソフトウェア テストでは、コード カバレッジはテスト中に実行されるコードの割合を測定します。ただし、特定のコード パスがカバーされていないため、カバレッジ レポートに盲点が生じる可能性があります。このようなシナリオの 1 つは、機能テストのために製品コードからコンパイルされたバイナリを使用するときに発生します。
次の例を考えてみましょう:
<code class="go">package main import ( "fmt" "math/rand" "os" "time" ) 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>
問題:
exit() 関数は、カバレッジ プロファイルの書き込みを許可せずにプロセスを終了します。その結果、os.Exit() を含む行はカバレッジ レポートでカバーされず、盲点が生じます。
考えられる解決策:
1。テスト コードで os.Exit() を使用しないでください:
終了機能を別の関数に移動し、運用コードとテスト コードの両方でその関数を使用します。これにより、終了する前にカバレッジ プロファイルをキャプチャできるようになります。
2.終了する前に time.Sleep() を使用します:
カバー プロファイルを書き込めるように、os.Exit() を呼び出す前に time.Sleep() 遅延を挿入します。ただし、これにより処理が遅くなる可能性があります。バイナリが運用とテストの両方に使用される場合のコード。
3.カバレッジから Main 関数を除外:
main 関数はプロセスを終了するだけなので、ビルド タグを使用してカバレッジ分析から除外できます。これにより、死角が確実に排除されます。
リファクタリングの例:
<code class="go">package main import ( "fmt" "math/rand" "os" "time" ) //+build !test func main() { os.Exit(exitFunc()) } func exitFunc() int { rand.Seed(time.Now().UTC().UnixNano()) for { i := rand.Int() fmt.Println(i) if i%3 == 0 { return 0 // Exit with code 0 } if i%2 == 0 { fmt.Println("status 1") return 1 // Exit with code 1 } time.Sleep(time.Second) } }</code>
メイン関数をカバレッジから除外することで、死角なしで 100% カバレッジを達成します。 .
注:
複雑なシナリオの場合は、経験豊富な開発者に相談して、コードの機能やテストの効率を損なうことなくカバレッジの盲点を排除するための最適なアプローチを決定することをお勧めします。
以上が## os.Exit() を使用するときに死角なしで 100% のコード カバレッジを達成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。