程序员的测试课
郑晔
开源项目 Moco 作者
18911 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 23 讲
加餐 (1讲)
结束语 (1讲)
程序员的测试课
15
15
1.0x
00:00/00:00
登录|注册

10 | 为什么 100% 的测试覆盖率是可以做到的?

你好,我是郑晔!
上一讲我们谈到了测试覆盖率,讲了如何在实际的项目中利用测试覆盖率发现没有覆盖到的代码。最后,我们留下了一个问题:测试覆盖率应该设置成多少?我给出的答案是 100%,但这显然是一个令很多人崩溃的答案。别急,这一讲我们就来说说怎样向着 100% 的测试覆盖率迈进。
很多人对测试覆盖率的反对几乎是本能的,核心原因就是测试覆盖率是一个数字。我在《10x 程序员工作法》中曾经说过,要尽可能地把自己的工作数字化。本来这是一件好事,但是,很多管理者就会倾向于把它变成一个 KPI(Key Performance Indicator,关键绩效指标)。KPI 常常是上下级博弈的地方,上级希望高一点,下级希望低一点。所以,从本质上说,很多人对测试覆盖率的反对,首先是源于对 KPI 本能的恐惧。
抛开这种本能的恐惧,我们先来分析一下,如果我们想得到更高质量的代码,测试肯定是越多越好。那多到什么程度算最多呢?答案肯定是 100%。如果把测试覆盖率设置成 100%,就没有那么多扯皮的地方了。比如,你设成了 80%,肯定有人问为啥不设置成 85%;当你设置成 85% 的时候,就会有人问为啥不是 90%,而且他们的理由肯定是一样的:测试覆盖率越高越好。那我设置成 100%,肯定不会有人再问为啥不设置成更高的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

这篇文章深入探讨了如何实现100%的测试覆盖率,强调了其重要性以及对自己编写的代码进行全面测试的必要性。作者指出,100%的测试覆盖率并不意味着代码没有问题,而是程序员对自己编写代码的一种质量保证。为了实现这一目标,文章提出了一些具体做法,包括良好的软件设计和编码习惯、测试和代码同步编写、以及对影响测试覆盖的第三方代码进行隔离等。此外,文章还强调了隔离层的重要性,并提出了一些实现100%测试覆盖率的技术要求。总的来说,本文对于想要了解如何实现100%测试覆盖率的读者来说,具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《程序员的测试课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • 码农Kevin亮
    请教老师,我正好遇到这么一个现实问题: getter/setter我理解是不需要测的,如果为了达到100%覆盖的目标,意味着需要单独把充血实体类拆成贫血实体与业务操作两个类。是这样么?

    作者回复: 首先,我在《代码之丑》里讲过,setter是不应该存在的,getter的使用也需要谨慎。其次,getter需要确认是真getter,还是有逻辑的,有逻辑的是需要覆盖的。最后,getter可以不写,不仅是不写测试,甚至是不写代码,Java程序可以使用Lombok这个程序库,只用Annotation,没有代码就不用纠结是否覆盖了。 解决了你前面的问题,后面的就不是问题了。

    2021-08-28
    8
  • davix
    請問100%覆蓋會不會導致過度測試導致難以重構?

    作者回复: 往前看,这也是我为什么要先讲做好设计,做好单元测试的原因,有了这些基础,才是 100%覆盖。

    2021-08-25
    5
  • 码农Kevin亮
    接前面的提问。我实践过,即使是用lombok,在覆盖率统计里也是有行数统计出来的。不知道是不是我不会设置呢。所以假如lombok并不能使得覆盖率扫描避开这些代码,那老师对于把充血模型单独拆出一个贫血实体然后排除扫描的方式,来满足100%覆盖率的作法有何评价呢?

    作者回复: 在 lombok.config 里有这么一段代码: lombok.addLombokGeneratedAnnotation = true

    2021-08-29
    3
  • coyang
    老师好,我遇到以下两种不好测试的情况: 1.死循环的逻辑 2.static函数 以上两种情况怎么保证覆盖率100%呢?

    作者回复: 死循环,把逻辑部分挪出来,单独测试。把循环的地方单独隔离出来,排除在覆盖率之外。 static 函数,要是没有任何字段,只是纯逻辑,就可以直接测试,就像一个程序库去测试。要是有复杂的关联,还是最好先考虑改造吧,把依赖解开,改造成一个正常的函数再做测试。这类似于遗留系统,后面我会提到,遗留系统改造主要是分离和隔离。

    2021-08-26
    2
    3
  • asusual
    TDD写出来的代码一般情况覆盖率都是100%

    作者回复: TDD 比较容易 100%

    2021-08-26
    3
  • 大碗
    请问老师对“第三方代码”的界定为是不是自己编写的代码,第一种常见的是非公司的类库,比如Jackson,这种好理解。第二种是服务A调用服务B的api.jar,第三种两个人编写服务A的两个模块C,D,编写C的人调用了别人D的方法,后面两种也属于调用第三方代码么?

    作者回复: 我指的就是你没法控制的代码。

    2021-08-25
    3
  • sylan215
    我们说的代码覆盖率的要求,是针对自己写的代码,如果有第三方代码的引用,一定要做好封装和隔离。 「补测试」几乎是不可能的,所以再次强调,一定要测试和代码一起写。 不管是第三方代码隔离,还是自己代码的可测性,都要去我们要做好设计,可测试的设计。 代码覆盖率是一种质量保证的手段,可以帮我们从代码角度来查漏补缺,覆盖率高并不代表代码没问题。

    作者回复: 很好的总结

    2021-09-07
    2
  • Gojustforfun
    “我前面也强调过,任务的关键是小,比如,小到半个小时就可以提交一次,这样,你写测试的负担相对来说是小的”,请问这里的“提交”指的是git commit(提交到本地库)还是git push(提交到远程库)。 我个人的理解是git commit,完成某个功能的最后一个子任务后,将该功能的多个git commit合并再git push合并后的commit。不知这样做是否可以?有什么问题?还需要注意什么?谢谢

    作者回复: 我没有做区分,能 commit 和能 push 对我来说是一回事,就是一次提交,一个完整任务的完成。push 才是终点,重点是把自己的代码是和别人的代码合在一起,否则,合并的工作量会增大。

    2021-08-25
    3
    2
  • 北风一叶
    追求100%的 测试覆盖率

    作者回复: 有了目标,剩下就是前进的动力了

    2021-09-15
    1
  • davix
    請問mock中用verify 的多少影響覆蓋率嗎

    作者回复: 不会

    2021-08-26
    1
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部