死角のない機能テストのカバレッジを表示
問題:
を生成するにはコンパイル済み Go バイナリと対話する非 Go 言語で記述された機能テストのカバレッジ プロファイルの場合、main_test.go ファイルには、終了コードをチャネルに送信するように main() メソッドを変更する Test_main 関数が含まれています。ただし、exit() 関数の if flag.Lookup("test.coverprofile") != nil 条件は、カバレッジ プロファイルが要求されたときに os.Exit(code) が実行されない可能性があるため、カバレッジ結果に盲点を作成します。 .
解決策:
死角のないカバレッジ プロファイルを作成するには、テストから main.go ファイルを除外することをお勧めします。これは、ビルド タグを使用して、main.go ファイルの先頭に // build !test という行を追加することで実現できます。これにより、テスト ビルド中にファイルを無視するように Go コンパイラーに指示されます。
次は、このアプローチを組み込んだコード例の修正バージョンです。
<code class="go">// dofunc.go package main import ( "fmt" "math/rand" "time" ) var seed int64 = time.Now().UTC().UnixNano() func doFunc() int { rand.Seed(seed) var code int for { i := rand.Int() fmt.Println(i) if i%3 == 0 { code = 0 break } if i%2 == 0 { fmt.Println("status 1") code = 1 break } time.Sleep(time.Second) } return code } // main.go //+build !test package main import "os" func main() { os.Exit(doFunc()) } // dofunc_test.go package main import ( "testing" "flag" "os" ) var exitCode int func TestMain(m *testing.M) { flag.Parse() code := m.Run() os.Exit(code) } func TestDoFuncErrorCodeZero(t *testing.T) { seed = 2 if code := doFunc(); code != 0 { t.Fail() } } func TestDoFuncErrorCodeOne(t *testing.T) { seed = 3 if code := doFunc(); code != 1 { t.Fail() } }</code>
使用法:
main.go をテストから除外することで、exit() 関数はカバレッジ分析の一部ではなくなり、カバレッジ プロファイルは、機能テスト。
以上がコンパイルされた Go バイナリと対話する機能テストで死角のない包括的なカバレッジ プロファイルを実現するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。