如何在功能测试中显示完整覆盖
问题:
功能测试执行编译二进制代码,为未发现的盲点留出空间。
代码片段:
<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中文网其他相关文章!