reviewer 要求代码测试覆盖率只能高不能低,但是有些部分的代码真的没法单测啊,依赖第三方库并且第三方也没做好 mock ,全用 interface 封装一遍又太麻烦了,好在 reviewer 只看数字,有什么方法拉高单测覆盖率吗
1
jones2000 2023-12-06 12:48:17 +08:00
买付费的第 3 方库,签合同, 让第 3 放提供测试报告。这样你只需要写自己代码的测试就可以了。
|
2
RedisMasterNode 2023-12-06 13:11:27 +08:00
(背景:擅长+喜欢写测试,搞 TDD )
要不你把你的代码形式翻出来大伙儿看看,到底是什么代码单测这么难写? |
3
mtzhjsnv 2023-12-06 13:30:38 +08:00
gomonkey 应该适合你
|
4
seeu2ex 2023-12-06 13:52:43 +08:00
@RedisMasterNode 有些代码的分支测试怎么做,同一份代码写两次吗
|
5
RedisMasterNode 2023-12-06 17:05:08 +08:00
@seeu2ex 分支不如你举个例子?不同分支比如说上面某个变量得值不同,因此下面走了不同分支,测试代码里面不就是 2 个 case ,然后各自 mock 那个变量到不同得值,就能走到不同分支去了?
按我的经验,测试代码里面执行部分基本不会改动的,改来改去都是测试用例部分,举个自己写的例子: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/tailsamplingprocessor/internal/sampling/ottl_test.go 然后也有人说业务代码没法这样简单,那我觉得其实只是本身代码组织得不够合理、每个方法目标不够明确,改改习惯就行。 |
6
dayeye2006199 2023-12-07 05:23:32 +08:00
为啥 mock 要第三方做?难道不是你 mock 第三方吗?
第三方库的覆盖率也会被算进去? |
7
seeu2ex 2023-12-07 09:38:01 +08:00
@RedisMasterNode #5 前端,感觉对过个交互请求导致的网络请求做了结果分支,这样的话岂不是要将前面的交互代码复制一份,再做不同路径值的验证(感觉真正有效的就这部分)
|
8
RedisMasterNode 2023-12-07 10:00:30 +08:00
@seeu2ex 不对,可以明确你要测试的范围和手段,例如单元测试应该以方法或者精简的极小模块为“单元”,针对这个单元的功能测试,例如一个时间转换方法、一个调用后端+数据处理的方法;端到端测试是给定用户输入,触发前端逻辑->调用后端->调用 xxx->返回给用户,检查返回结果是否匹配。
然后如果你觉得测试的时候需要写大量的重复代码,可以考虑优化测试的框架,这个框架是否帮你封装了逻辑,让你只需要管理输入参数即可?用不同输入参数走到不同分支?可以先把测试框架做扎实再写 case ,说白了,要时间的,不是哪天想搞就能简简单单搞 |
9
seeu2ex 2023-12-07 13:29:51 +08:00
@RedisMasterNode #8
|
10
Ainokiseki OP 不好意思这几天一直没看到新消息提醒,以为没有回复
@dayeye2006199 比如我代码依赖某个第三方包的结构体,那显然是没法 mock 的,因为不是 interface ,除非我把所有第三方结构体都手动封装成 interface |