
如果你经常关注软件开发最佳实践方面的话题,你可能听说过测试驱动开发(TDD-Test Driven Development)和行为驱动开发(BDD-Behavior Driven Development),但是你可能还没弄清楚它们到底是做什么的,甚至连区分起来都有点困难。如果真的是这样,那这篇文章真的值得你往下读一读。

TDD和BDD究竟是什么?它们是做什么的呢?
TDD和BDD其实都是一种敏捷软件开发的技术,本质目的都是为了让我们开发出更高质量的代码,交付更贴合需求的项目。但是要去实践他们,首先要去了解它们是干什么的。简单通俗地说,TDD即测试驱动开发,要求我们在编写代码前先编写测试用例,基于测试用例去编写满足的代码,然后再添加一个测试用例,再调试,再修改代码,依此类推。TDD的基本思想就是在开发功能代码之前,先编写测试用例。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写代码满足这些测试用例,随后循环进行添加其他功能,直到完成全部功能的开发。
在介绍BDD之前,我们需要从TDD的工作原理和步骤再去了解一下TDD,这样有助于我们更好地理解BDD和TDD。
1.先写测试代码,并执行,得到失败结果
2.写刚好让测试通过的代码,并通过测试用例
3.删除重复部分,重构代码,并保证测试通过
4.反复实行这个步骤,测试失败 -> 测试成功 -> 重构
三原则:
1.除非是为了使一个失败的用例通过,否则不允许编写任何代码
2.在一个单元测试中,只允许编写刚好能够导致测试失败的代码
3.只允许编写刚好能够使一个失败的用例通过的代码。
TDD可以在每次迭代后减少测试瓶颈,但是在大型团队中采用这种方案是需要成本的。就像我们平常穿新衣服一样,团队成员习惯和适应新的方法和流程是需要时间的。尽管TDD通过在生命周期的早期识别问题,降低了软件开发的总成本,但是它延长了完成日常编码任务所需的时间。同时,维护TDD相关的资产也需要成本。如果应用程序的设计发生变化,整个TDD的流程可能要重新来过。根据TDD与代码实现的紧密程度,重新开始或者调整整个开发流程的成本可能难以预估。
降低成本,消除采用TDD的障碍

从某种程度上说,采用了TDD的代码绝对好于不采用TDD的代码,但是采用TDD方案的成本在一定程度上限制了很多团队。实施TDD的成本和障碍与项目本身的特点其实是密不可分的。
但是如果说你的团队正在着手开始一个新的项目,那么实施TDD的成本将会低于正常水平,并且在之后,遇到的障碍也会更少。但是这种情况只是很少的情况。绝大多数的团队都是在使用现有的代码库,并且在实施TDD的时候大家都不遵循统一的规范。一边是认为测试要优先于开发的人,一边是认为开发要优先于测试的人。本质原因其实还在于效率,不管如何做,大家都希望按照认为效率高的方式去做事。但是光有了效率,没质量也不行,TDD的实践重点就在于测试早于开发代码,所以说其实有一部分人做的事其实不是TDD。如果有一款工具能在写测试用例的时候帮助开发人员呢?那这样大家就不需要担心会花过多的时间在测试用例上了。那自然就能按照正规的流程去实践TDD了。
以Java开发为例,Parasoft Jtest就是这样一款非常有效的工具。Jtest减少了创建测试用例所需的实践,它分析现有的代码,并提供一种引导式的测试用例创建指导,从而生成完全自动化的、可预测的和可维护的JUnit测试用例。这让团队可以快速将现有的功能覆盖和隔离,大大减少花费在创建测试用例上的时间。
TDD实践带来的另一个麻烦就是,测试套件在不断增长,换句话说,就是代码量不断变大,这就导致了需要更多额外的时间来执行测试。测试套件必须随着应用程序的开发进程同步,以便随时进行验证修改,但是由于测试数量的增加,确定运行的到底是哪个测试几乎是不可能。此外,在提交代码之前运行所有的测试变得非常耗时。这导致团队过于依赖夜间测试运行来进行回归测试,这增加了构建失败的数量,并且对开发团队的反馈速度也大大减缓了。
Jtest通过自动检测受变动的代码影响的测试用例来优化测试工作。这使团队可以在提交代码之前,可以立即识别并只要重新运行受IDE中的更改影响的测试代码。当然了,也可以将Jtest集成到CI工作流中,来加速CI运行的反馈。
简单来说,TDD是一种代码级的实践,本质上是设计测试单独的代码片段,而不一定是需求。而往往,开发人员就会忽略这一点,总是以为采用TDD的思想编写了代码,最后交付的肯定就是客户需要的东西,其实不然,这种交付的产品顶多算是健壮性很好,在满足客户需求方面有很大可能还是存在问题的。而BDD恰好就是解决这个问题的,换句话说,BDD就是解决TDD遗留的问题。
关于BDD的故事,我们下篇文章继续聊。
Parasoft作为AEP(软件自动化错误预防)理论的创始者,Parasoft 的产品和解决方案能够帮助用户大幅缩短开发周期,显著减少开发成本,持续提高软件开发效率,最终优化整体软件质量和用户体验,是全球顶尖的软件质量、服务虚拟化及软件生命周期管理解决方案供应商。
公司成立于1987年,总部位于加利福尼亚州的洛杉矶,有着30多年的丰富的专业技术积累和行业应用经验,产品横跨单元测试、静态分析、动态分析、功能测试、压力测试、信息安全测试、通信协议仿真、应用环境虚拟化等,拥有超过30项软件质量相关专利以及40余项全球各类顶级奖项。
目前在全球34个国家和地区设有分支机构,在美国、波兰、俄罗斯和中国设有研发中心,与麻省理工、牛津等5所世界顶尖大学设有联合创新中心,超过40所中国著名大学合作建立了教育和研究联合实验室。在上海、成都、北京和深圳设有分支机构,拥有覆盖整个中国的合作伙伴网络,提供产品、方案、咨询和技术支援,通过合作伙伴网络提供测试外包、功能安全认证、信息安全认证等合作系统服务。在全球超过15,000家客户,其中包括85%的财富500强公司,88%的财富100强公司。
