显示无盲点的功能测试覆盖率
问题:
为了生成用于以非 Go 语言编写的与已编译的 Go 二进制文件交互的功能测试的覆盖率配置文件,main_test.go 文件包含一个 Test_main 函数,该函数修改 main() 方法以将退出代码发送到通道。但是, exit() 函数中的 if flag.Lookup("test.coverprofile") != nil 条件会在覆盖率结果中产生盲点,因为当请求覆盖率配置文件时 os.Exit(code) 可能永远不会被执行.
解决方案:
为了编写没有盲点的覆盖率配置文件,建议从测试中排除 main.go 文件。这可以使用构建标签来完成,方法是将行 // build !test 添加到 main.go 文件的顶部。这将指示 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中文网其他相关文章!