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

11|单元测试(二):四象限法让你的单测火力全开

你好,我是柳胜。
上一讲,我们写了 OrderServiceTest 测试类,来测试 FoodCome 的 OrderService 类。这样不管开发代码还是测试代码,都是简单清楚的。这是因为 FoodCome 的开发人员对代码有一个好的设计,实现了 Controller、Service、Repository 等 Class 的职能划分,OrderService 类里专注订单管理,我们写出的 OrderServiceTest 才能集中火力测试。
但是好的设计不是天上掉下来的,有的团队在刚一开始写的代码结构性并不好,这有可能是项目的问题,需求不明确、赶进度,也有可能是开发人员的技术功底不扎实、抽象能力不够。所以,在软件生命周期内,需要持续重构,才能打磨出好的设计。
今天我们就用一个例子,来看看好的代码设计是怎么打磨出来的,而且,我们要从测试的角度来评估设计的效果,那就是单元测试容易写、覆盖率高、干净易懂,这又叫代码可测试性。
作为自动化测试架构师,你需要掌握观察和评估代码可测试性的能力,有能力推动你的开发团队做好代码设计,走向单元测试。

从一个需求说起

有一天,老板给 FoodCome 订餐系统提了一个需求,希望用户在页面上可以修改自己的邮箱地址。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

通过本文,读者可以了解到如何通过四象限法评估代码的可测试性,并从一个实际需求出发,展示了如何通过重构提高代码的可测试性。同时,文章还强调了持续重构的重要性,以打磨出更好的设计。这对于开发人员和自动化测试架构师来说,是一篇具有实际指导意义的技术文章。 文章首先介绍了一个简单的需求,即用户在页面上修改邮箱地址,但在FoodCome平台上有特定的业务逻辑。接着,作者通过引入四象限法来评估代码的可测试性,指出原始代码的User Class属于复杂代码象限,难以进行单元测试。随后,作者提出了版本V2的改进方案,将业务逻辑和外部依赖的交互分离,创建了一个新的UserController Class来专注管理外部依赖,同时对User Class进行了重构。最终,作者总结了版本V2的改进,指出现在的代码具有更好的可测试性,User Class和UserController Class都可以进行测试。 通过三个版本的代码例子,读者也应该发现了,单元测试并不是眉毛胡子一把抓。首先,应该关注业务逻辑能否在单元测试里充分测试,这是跟自动化测试高度关联的地方。而Mock的目标,则是辅助业务逻辑能够更早更快地测试。文章最后提出了一个思考题,制定单元测试覆盖率100%的目标有价值么?如果让你制定目标,你会怎么做? 总的来说,本文通过实际案例和代码示例,向读者展示了如何通过四象限法评估代码的可测试性,并通过重构提高代码的可测试性,强调了持续重构的重要性,对于开发人员和自动化测试架构师具有实际指导意义。

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

全部留言(5)

  • 最新
  • 精选
  • lisa
    辩证来看,单元测试的行覆盖率是有价值的,但是制定100%的覆盖率是一种错误的管理手段。测试的本质是发现问题,防止问题外漏,所以无论是单元测试还是其他测试,都是从代码的风险出发来设计用例,而不是从行覆盖的角度出发。

    作者回复: 非常到位!在度量模块里,我们也会提到,如果用单一的维度来度量工作的话,会诱导工作机械化,甚至弄虚作假。

    2022-04-14
    9
  • swordman
    如果一定要定一个覆盖率目标,领域代码这部分的覆盖率,会更有价值。这又引出一个新问题,如何判断设计时做了领域代码和依赖代码的拆分。除了和开发人员一起检查以外,我觉得可以加一个测试用例使用Mock函数的自动扫描:如果做了拆分,领域代码部分的用例,是无需做Mock的,如果测试用例高频的使用Mock函数,说明产品代码本身,并没有把复杂代码分解干净。(这是我个人的理解,恳请老师指正)

    作者回复: 这是一个很好的思路!你已经开始考虑怎么度量“好的代码结构”了!

    2022-05-14
    4
  • 羊羊
    以前学习设计模式,其中有一条法则:迪米特法则,也叫做“不和陌生人说话”。一直都不知道这条法则到底如何应用,目的是什么。看到老师的代码可测性改造,才明白,符合了迪米特法则的代码,可以显式外部依赖项,方便测试时 Moke 外部依赖。

    作者回复: 有悟性,谢谢分享!我又温习了一下迪米特法则,大道至简,殊途同归。😄

    2022-07-29归属地:日本
    2
  • Rachel
    感觉这节主要分析了开发的逻辑。。。实际上如果开发没那么多,还是很多问题

    作者回复: 所以说,如果测试的目的是为了发现bug,会发现这是个无间痛苦,各种各样的bug层出不穷。但是,如果测试能够推动开发改善,这就会进入到一个积极的循环中去。

    2022-07-27归属地:日本
    2
  • 太匆匆
    单纯追求覆盖率没有意义,追求关键代码覆盖到就可以了。领域代码应该就是这部分关键代码了

    作者回复: 很到位!

    2022-04-16
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部