如何在 Golang 中获得 100% 的代码覆盖率?

How to get 100% code coverage in Golang?

我无法获得 100% 的代码覆盖率,因为我无法在 Golang 中测试 Fatals。

我发现了一些问答,包括 , but I am lost as the answers to the posts are contradictory. On the one hand it is possible to check the code coverage in Golang. 另一方面,有些人提倡忽略测试,例如log.Fatal(err),导致代码覆盖率小于100%.


尝试次数

作为解决方法,我将所有 log.Fatal 替换为 panic 并且感谢 我能够测试所有的恐慌并实现 100% 的代码覆盖率。


问题

虽然我能够获得 100% 的代码覆盖率,但我并不高兴,因为我基本上是在滥用 panic 来获得 100% 的代码覆盖率。根据 使用 panic

when the program, or its part, has reached an unrecoverable state

根据这个定义,我的代码中有多个片段可能会引发恐慌,而应该使用 log.Fatal

我可以建议的一个技巧是不要调用 log.Fatal,而是使用相同的签名创建你自己的致命函数:

var fatal func(...interface{}) = log.Fatal

包裹中的任何地方。它可以不导出,因此其他包无法设置或使用它。然后在您的测试中,您可以将其替换为:

fatal = func(v ...interface){
    panic(fmt.Sprint(v...))
}

或者任何你想做的。

当我需要测试 time.Now 或类似的东西时,我会使用这种技巧。

出于这个原因,我发现它对除 main 之外的所有函数和程序包都很有用 return 错误而不是直接调用 log.Fatal 。然后它可以是 main 决定是否退出错误。尝试获得 100% 的测试覆盖率,尽管在很多情况下可能会减少 returns,所以称它足够好也可以。