自动化测试高手课
柳胜
原甲骨文高级开发经理
16849 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 34 讲
开篇词 (1讲)
自动化测试高手课
15
15
1.0x
00:00/00:00
登录|注册

26|见微知著:单元测试度量避坑

你好,我是柳胜。
通过前面的学习,我们不难发现单元测试的 ROI 又高,速度又快。在我看来,单元测试是一块没有充分发挥价值的蓝海。可惜很多公司不重视单元测试,也不愿意投入;有的公司虽然做了单元测试,但发现效果不明显,时间久了,单元测试也就流于形式。
想要真正在团队、乃至公司推动单元测试,就要见到效果,进入到一个有反馈刺激的正循环里。一旦进入到这样的循环,哪怕起点再低,也能一步步优化提升,走向成熟。因此,在这个循环机制中,反馈尤为重要。那这个反馈来自哪里呢?没错,是合理有效的度量。
这一讲,我会结合例子带你一步步推导,如何用度量驱动单元测试的落地和提升。

失效的单元测试覆盖率

如何度量单元测试的效果?很多人会脱口而出——“单元测试覆盖率”。而且,还能讲出很多覆盖率的方法论,语句覆盖率、分支覆盖率、判定覆盖率等等。但是,单元测试的高覆盖率一定会有高的代码质量么?
我们先看看单元测试覆盖率是怎么产生的,看看它的原理是什么,然后再判断单元测试覆盖率这个指标有什么问题。
后面是一段代码例子。有这样一个名为 add 的函数,它的入口是 a,b 两个整形参数。如果 a 小于 2,计算结果就是 a+b 的负数,a 大于 2,就返回 a+b。看起来逻辑很简单,是吧?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

文章标题为“见微知著:单元测试度量避坑”,主要探讨了单元测试的度量和提升方法。作者首先指出单纯依赖代码覆盖率来衡量单元测试效果存在局限性,举例说明了即使覆盖率达到100%,仍可能存在Bug泄漏的情况。接着,文章介绍了如何度量单元测试的质量,提出了单元测试Bug泄漏率的概念,并探讨了其计算方法和实际应用。最后,作者提出了变异测试作为一种新的方法,用以评估单元测试的质量。通过本文的阐述,读者可以了解到单纯依赖代码覆盖率来衡量单元测试效果的局限性,以及如何通过新的方法来度量和提升单元测试的质量。 文章深入探讨了变异测试的原理和实现,介绍了变异测试覆盖率的概念以及如何借助测试框架实现自动化。通过具体例子演示了如何自动地生成变异,运行测试,并得出变异测试覆盖率的整个过程。变异测试覆盖率能够度量出测试案例设计的质量,包括遗漏的测试案例和冗余重复的测试案例,从而满足了对单元测试质量度量设计的要求。最后,文章留下了两道思考题,引发读者对变异测试思路的拓展和对代码迭代的理解。 总之,本文通过深入探讨单元测试度量和提升方法,特别是变异测试的原理和实现,为读者提供了一种新的方法来评估单元测试的质量,帮助读者重新审视单元测试的有效性,并为推动单元测试在组织中落地提供了思路和方法。

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

全部留言(7)

  • 最新
  • 精选
  • 余明栋
    乘负1和除负1要怎么捕获呢,从数学上讲是等价的,如果不是1还可能用倒数产生精度差异,但是1的话没想到什么思路,大神有什么方向提点吗

    作者回复: 如果代码存在无法杀死的变异,可以考虑优化代码啦。😄

    2022-06-21
    2
    4
  • 变异测试由于模块规模大,导致编译出的变异体过多,并且测试案例数量数量大,造成进行变异测试落地非常困难,请教一下有什么可行的方法进行合理落地吗

    作者回复: 非常好的问题。 第一,变异测试不适宜用于全部代码。你需要选出一部分业务逻辑集中的代码。比如数据计算,转换,或者算法等。 第二,变异测试能不能发挥大作用,关键在于变异的类型。你可以查看PItest产生的变异类型,是不是和业务逻辑能匹配。如果不匹配,你可能需要自开发一些适合自己场景的变异,这时你可以分析已存的重点Bug,思考他们能不能在单元测试阶段捕捉到,如果能捕捉,应该用什么变异。

    2022-06-09
    4
  • 朝如青丝暮成雪
    1. 变异测试的思路是否仅限于单元测试?可以用在其它测试场景中么? 不仅可以应用于单元测试,UI 自动化或平时手动测试都可以用到。 2.“每一次代码迭代,就是一次变异”,这句话你怎么理解? 每次代码的改动,都是对单元测试代码的考验,能不能真正做到拦截bug,这些都需要写单元测试的时候认真思考。

    作者回复: 说得非常好!谢谢分享。关于”每一次代码迭代,就是一次变异“,软件的迭代就像人的诞生,成长,衰老一样,每个人每天都在发生变化,这些变化都可以叫做变异,只不过有些变异是我们预期的,有些变异是不被期望发生的。我们做测试的目的,是要捕捉那些“不预期”的变异。

    2022-05-20
    2
  • 朝如青丝暮成雪
    单元测试 Bug 泄漏率 = 单元测试泄漏的 Bug/ (单元测试泄漏的 Bug+ 单元测试捕捉到的 Bug) 这个公式应该是这样的吧😂

    作者回复: 是的。就是“泄漏”两个字难定义和落地 :)

    2022-05-20
    1
  • juney-jun
    1.关于老师说的乘以-1和除-1怎么捕获,只能从代码层面优化,调整一下-1的位置 即可: public service{ public static int add(int a, int b){ if(a <= 2){ return -1*(a+b); }else{ return a + b; } } }
    2022-11-14归属地:上海
    1
  • ifelse
    学习打卡
    2024-03-01归属地:浙江
  • Geek_eb7eec
    谢谢老师的分享!以前没有用过变异测试,又一次扩展了思路!我有两个问题想请教一下老师: 1> 变异测试和negative testing的区别在哪儿? 它们之间不是隶属关系,但是会有重叠,对吗? 是不是可以认为在变异测试中会覆盖到一些negative的测试案例? 2> 如果需要单元测试的是一个权限控制模块,还可以使用变异测试吗?还是设计出合适的positive cases和negative cases就可以了呢? 期待老师的指教!
    2022-12-06归属地:美国
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部