Golang Go语言中如何有效提高测试覆盖率

发布于 1周前 作者 sinazl 来自 Go语言

reviewer 要求代码测试覆盖率只能高不能低,但是有些部分的代码真的没法单测啊,依赖第三方库并且第三方也没做好 mock ,全用 interface 封装一遍又太麻烦了,好在 reviewer 只看数字,有什么方法拉高单测覆盖率吗


Golang Go语言中如何有效提高测试覆盖率
11 回复

买付费的第 3 方库,签合同, 让第 3 放提供测试报告。这样你只需要写自己代码的测试就可以了。

更多关于Golang Go语言中如何有效提高测试覆盖率的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


(背景:擅长+喜欢写测试,搞 TDD )

要不你把你的代码形式翻出来大伙儿看看,到底是什么代码单测这么难写?

gomonkey 应该适合你

有些代码的分支测试怎么做,同一份代码写两次吗

分支不如你举个例子?不同分支比如说上面某个变量得值不同,因此下面走了不同分支,测试代码里面不就是 2 个 case ,然后各自 mock 那个变量到不同得值,就能走到不同分支去了?

按我的经验,测试代码里面执行部分基本不会改动的,改来改去都是测试用例部分,举个自己写的例子:
https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/tailsamplingprocessor/internal/sampling/ottl_test.go

然后也有人说业务代码没法这样简单,那我觉得其实只是本身代码组织得不够合理、每个方法目标不够明确,改改习惯就行。

为啥 mock 要第三方做?难道不是你 mock 第三方吗?
第三方库的覆盖率也会被算进去?

#5 前端,感觉对过个交互请求导致的网络请求做了结果分支,这样的话岂不是要将前面的交互代码复制一份,再做不同路径值的验证(感觉真正有效的就这部分)

不对,可以明确你要测试的范围和手段,例如单元测试应该以方法或者精简的极小模块为“单元”,针对这个单元的功能测试,例如一个时间转换方法、一个调用后端+数据处理的方法;端到端测试是给定用户输入,触发前端逻辑->调用后端->调用 xxx->返回给用户,检查返回结果是否匹配。

然后如果你觉得测试的时候需要写大量的重复代码,可以考虑优化测试的框架,这个框架是否帮你封装了逻辑,让你只需要管理输入参数即可?用不同输入参数走到不同分支?可以先把测试框架做扎实再写 case ,说白了,要时间的,不是哪天想搞就能简简单单搞

不好意思这几天一直没看到新消息提醒,以为没有回复
比如我代码依赖某个第三方包的结构体,那显然是没法 mock 的,因为不是 interface ,除非我把所有第三方结构体都手动封装成 interface

在Golang(Go语言)中,有效提高测试覆盖率可以从以下几个方面入手:

  1. 全面编写测试用例:为项目中的每个功能编写测试用例,覆盖各种可能的输入和输出,包括正常情况、边界情况和异常情况。
  2. 使用表驱动测试:将输入数据和预期输出数据存储在表格中,以减少重复代码,提高测试的可读性和可维护性。
  3. 测试边界条件:重点测试输入值的最大值、最小值和中间值,以发现潜在的边界问题。
  4. 使用Mock对象:模拟外部依赖项,使测试更加独立和可重复。
  5. 利用覆盖率工具:使用Go语言内置的覆盖率工具(如go test -cover)和第三方工具(如GoCov、coveralls)来生成详细的覆盖率报告,分析并优化未覆盖区域。
  6. 编写集成测试:验证多个组件之间的交互,确保整个系统的正确性和稳定性。
  7. 遵循测试金字塔原则:编写大量单元测试、一定数量的集成测试和较少的端到端测试,以确保测试的稳定性和可维护性。

综上所述,通过全面编写测试用例、利用表驱动测试、测试边界条件、使用Mock对象、利用覆盖率工具、编写集成测试以及遵循测试金字塔原则等方法,可以有效提高Golang项目的测试覆盖率。

回到顶部