如何在 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,所以称它足够好也可以。
我无法获得 100% 的代码覆盖率,因为我无法在 Golang 中测试 Fatals。
我发现了一些问答,包括 log.Fatal(err)
,导致代码覆盖率小于100%
.
尝试次数
作为解决方法,我将所有 log.Fatal
替换为 panic
并且感谢
问题
虽然我能够获得 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,所以称它足够好也可以。