为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
明月笑刀无情 2021-11-22 18:41:23
我无法获得 100% 的代码覆盖率,因为我无法在 Golang 中测试 Fatals。我找到了一些问答,包括这个,但我迷路了,因为帖子的答案是矛盾的。一方面可以在 Golang 中检查代码覆盖率。另一方面,有些人主张忽略 eg 的测试log.Fatal(err),导致代码覆盖率小于100%.尝试作为一种解决方法,我全部替换log.Fatal为panic并感谢这个答案,我能够测试所有的恐慌并实现 100% 的代码覆盖率。问题虽然我能够获得 100% 的代码覆盖率,但我并不高兴,因为我基本上是在滥用panic以获得 100% 的代码覆盖率。根据这个答案apanic使用:当程序或其部分达到不可恢复状态时根据这个定义,我的代码中有多个片段可以引发恐慌,而log.Fatal应该使用 a 。
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

出于这个原因,我发现除了 main 之外的所有函数和包返回错误而不是直接调用 log.Fatal 都很有用。然后它可以是主要的决定是否退出错误。尽管在很多情况下尝试获得 100% 的测试覆盖率可能会导致收益递减,因此称其为足够好也可以。


查看完整回答
反对 回复 2021-11-22
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

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


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

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


fatal = func(v ...interface){

    panic(fmt.Sprint(v...))

}

或者你想做的任何事情。


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


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信