你真的需要单元测试吗?

本文探讨了单元测试并非主要用于查找Bug,而是驱动开发的一种手段。在谷歌的实践中,单元测试作为敏捷开发的一部分,提升了代码质量和团队协作效率。然而,单元测试的边际收益存在递减现象,尤其在短期项目和特定环境下,投入与产出可能不成正比。Android平台的单元测试尤为困难,而某些代码可能并不适合进行单元测试。了解单元测试的局限性有助于更好地决定何时引入单元测试。
摘要由CSDN通过智能技术生成

单元测试不是用来找Bug的

当你看到网上诸多关于单元测试的赞美时,仔细看看你就会发现很多说的其实是TDD(Test-Driven Development,测试驱动开发),不幸的是大多数人并没有注意区分这两个概念。在Writing Great Unit Tests: Best and Worst Practices中,Steven Sanderson强烈表达了自己的观点:Unit testing is not about finding bugs。简单来说,当先写代码后写单元测试的时候,单元测试就成了一种发现Bug的手段,但作者根据其几十年的开发经验指出这种手段其实是十分低效的,因为即使每个功能模块都能正常工作,但是仍然不能保证模块之间、模块与用户环境之间能正确交互,而后者往往是Bug的主要来源。单元测试或许能找到一些Bug,但相比集成测试和系统测试就显得十分低效了。
既然如此,那么单元测试为何又备受追捧呢?在How Google Tests Software中,三位谷歌的专家介绍了谷歌的软件测试之道,总而言之就是谷歌会在开发之初设计好单元测试(其实是用代码表达需求),在开发中不断迭代以通过全部的测试(其实是完成全部需求),最终交付给测试人员的软件已经经过一轮测试,如果还有集成后的Bug,就可以交给专业的测试人员发现了。这是一种典型的敏捷开发,可以看到单元测试扮演更多的是驱动开发的角色。
作为技术标杆的谷歌已经全面引入了单元测试,那么我作为一个普通开发者为什么还要提出一番质疑呢?请看下一节。

单元测试的边际收益

在经济学领域,有一个著名的边际收益递减规律,指在投入生产要素后,每单位生产要素所能提供的产量增加发生递减(二阶导数为负)的现象。在本文讨论的场景中,投入产出如下(引自:软件开发过程中值不值得写单元测试? - voidint’s blog):

成本(投入)
* 编写单元测试用例所额外付出的时间,短期内会拖慢项目进度。

收益(产出)
* 提升代码质量。监督开发人员写出更加易于测试和可维护的代码。
* 提升开发团队内部的协作效率。其他开发人员可以通过阅读单元测试用例来理解代码原作者的意图。
* 保证功能实现的长期稳定。代码一旦发生与原功能意图不相符的变化,通过跑单元测试可以体现出来,即可以防止功能被无意识地破坏。
* 提高自动化测试占比,降低其他测试方式上的投入。

在经济学中,边际收益递减现象常出现于产量的短期分析中。结合对同事的咨询以及自己的调研,这个现象

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值