我没有任何研究论文或统计数据可以提供给您,但是我将结合我在一个团队/组织中的工作经验,这些团队/组织历史上的单元测试覆盖率低至平均水平,并且没有端到端测试,并且逐步通过更多的ATDD(但具有讽刺意味的是,不是传统的TDD)方法将标准移到我们现在的位置。
具体来说,这是项目时间表过去如何发挥作用(并仍然在同一组织中的其他团队/产品上发挥作用)的方式:
- 长达4周的分析和实施
- 2周的回归测试,错误修复,稳定和发布准备
- 修复已知缺陷1-2周
- 2-3周的代码清理和后期制作问题/支持(未知缺陷/计划外停机)
这似乎是荒谬的开销,但它实际上是很常见的,在许多组织中,常常由于缺少或无效的质量检查而被掩盖。我们拥有优秀的测试人员和严格的测试文化,因此这些问题要尽早发现并提前解决(大部分时间),而不是在许多月/年的过程中慢慢解决。55-65%的维护开销是较低的比花在调试的时间80%的普遍接受的标准-这似乎是合理的,因为我们确实有一些单元测试和跨职能团队(包括QA)。
在我们团队最新产品的第一版发布期间,我们已经开始对验收测试进行改造,但还远远不够,我们仍然不得不依靠大量的手动测试。这次发布比其他版本的痛苦要小一些,这部分是因为IMO的偶然性验收测试,部分是因为相对于其他项目,我们的单元测试覆盖率非常高。不过,我们在回归/稳定化上花费了将近2周,在后期制作问题上花费了2周。
相比之下,自该初始发行版以来的每个发行版都具有早期接受标准和接受测试,而我们当前的迭代如下所示:
- 8天的分析和实施
- 2天稳定
- 0-2天的后期制作支持和清理
换句话说,我们将维护费用从55-65%提升到20-30%。相同的团队,相同的产品,主要区别在于验收测试的逐步改进和简化。
每个sprint的维护成本,对于QA分析人员来说是3-5天,对于开发人员来说是1-2天。我们的团队有4个开发人员和2个QA分析人员,因此(不计算UX,项目管理等),最多60个工作日中有7个工作日,而我将凑整15%的实施开销安全的一面。
我们在每个发布期间花费15%的时间来开发自动验收测试,并且在此过程中,我们可以削减70%的每个发布以进行回归测试并修复生产前和生产后的错误。
您可能已经注意到,第二个时间轴比第一个时间轴更精确,也更短。预先接受标准和接受测试使之成为可能,因为它极大地简化了“完成的定义”,并使我们对发布的稳定性更有信心。到目前为止,没有其他团队在两周一次的发布时间表上取得成功,除非进行相当琐碎的维护发布(仅修正错误等)。
另一个有趣的副作用是,我们已经能够根据业务需求调整发布时间表。一次,我们不得不将其延长至大约3个星期,以与另一个版本保持一致,并且能够在提供更多功能的同时做到这一点,而无需花费任何额外的时间进行测试或稳定化。另一时间,由于假期和资源冲突,我们不得不将其缩短到大约1.5周。我们不得不进行较少的开发工作,但是,正如预期的那样,能够花更少的时间进行测试和稳定化而又不会引入任何新的缺陷。
因此,以我的经验来看,验收测试(尤其是在项目或冲刺的早期完成时,以及由产品负责人编写的验收准则进行良好维护时)是您可以做出的最佳投资之一。不同于传统的TDD,这是其他人正确指出的是更专注于创建可测试比代码无缺陷的代码- ATDD确实有助于抓住缺陷很多速度更快; 这在组织上相当于每天都有一支测试人员大军进行完整的回归测试,但价格却便宜得多。
ATDD是否会帮助您进行以RUP或(ugh)Waterfall风格完成的,持续3个月或更长时间的项目?我认为陪审团仍未解决。以我的经验,长期运行的项目中最大和最丑陋的风险是不切实际的期限和不断变化的需求。不切实际的截止日期将导致人们采用快捷方式,包括测试快捷方式,并且对需求的重大更改可能会使大量测试无效,从而要求重写它们并可能增加实施开销。
我非常确定,ATDD对于敏捷模型或非正式敏捷但发布时间表非常频繁的团队来说,将带来可观的回报。我从未在一个长期项目中尝试过它,主要是因为我从未去过或什至没有一个组织愿意在这种项目中尝试过它,因此请在此处插入标准的免责声明。YMMV等。
PS在我们的情况下,“客户”不需要额外的精力,但是我们有专门的全职产品负责人,他实际上在编写接受标准。如果您从事“咨询软件”业务,我怀疑让最终用户编写有用的验收标准可能会困难得多。产品负责人/产品经理似乎是进行ATDD的基本要素,尽管我只能根据自己的经验再说一次,但我从未听说过ATDD在没有人履行职责的情况下会成功地实践。