articles
articles copied to clipboard
单元测试系列 -- 作用远超你想象
单元测试概念
在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 -- 维基百科
我们会发现,一些优秀的开源项目,都有较全面的单元测试,但是我们维护的业务系统,却少有单元测试的踪影,难道单元测试实施成本真的这么高吗,下面我们将讨论单元测试有什么优点。
防止产生遗留代码
《修改代码的艺术》中说作者认为,遗留代码就是那些没有编写相应测试的代码,没有编写测试的代码是糟糕的代码。不管我们有多细心地去编写它们,不管它们有多漂亮、面向对象或封装良好,只要没有编写测试,我们实际上就不知道修改后的代码是变得更好还是更糟了。反之,有了测试,我们就能迅速、可验证地修改代码的行为。
降低开发维护成本
当提到单元测试应用到业务系统开发流程时,也许大多数听到的反馈是成本太高,开发周期过长,维护困难。 我们得出这样的结论,也许是因为没搞清楚成本的概念,软件的成本远远不止开发成本,我理解的成本应该像下面这条公式的。
软件成本=开发成本(20%)+ 维护成本(30%)+ 异常成本(50%)
如果你正在维护一套开发超过两年的系统,当你需要添加一个需求或者改动旧代码的时候,你总是小心翼翼的,你不得不认真的理解整块代码,生怕一个改动,会导致旧的功能无法运行。
你担心的事情,总是会发生的,不知道会在什么时候,也许是在业务最关键的时刻爆发,造成业务中断,给企业造成的损失将会远远超出开发成本。
如果你的业务代码包含完整的单元测试,你的公式就变为下面:
软件成本=开发成本(20%)+ 单元测试成本(10%)+ 维护成本(10%)+ 异常成本(10%)
虽然开发过程中需要时间来编写单元测试代码,但是在以后改动需求的时候,你就可以大胆的修改了,单元测试可以帮助你控制软件的质量,你也可以信心满满的把应用部署到线上,万一出现意外,也可以通过单元测试帮助你定位问题。
下面为引用《单元测试的艺术》中的一个段落,两个团队分别使用和不使用单元测试,各项指标的差异。
下面为《有效单元测试》中关于bug修复成本的片段
提升代码质量
单元测试另外一个很重要的作用是提升代码的质量,表面上单元测试的代码和业务代码是没有关联的,但实际上,测试代码会反推业务代码变得健壮。 我们写业务代码,是否会经常碰到一个函数上百行代码的情况,函数把整个业务逻辑都写在一起,没有分层和分模块。
如果要对上百行的函数进行单元测试,是非常困难的,你需要写非常多的mock代码和非常多的分支判断。 为了能够通过测试,你需要对函数进行拆分,将函数变成一个个小的工作单元。 越是小的工作单元,越是容易进行测试,在编写单元测试的过程中,相当于对代码进行了一次重构。
支持自动化持续集成
自动化持续集成通常包含自动化单元测试,用来保证软件的质量,如果没有单元测试保障代码的可工作性,对于持续发布的软件,会有较大风险。 同时,因为每次提交都进行测试和构建,出现异常时距离开发时间较近,问题的修复成本会比较低,软件的技术债务会被有效的控制。