如何采用TDD并确保遵守?
我是一名高级工程师,在另外四人的团队中工作,开发一个本土内容管理应用程序,该应用程序驱动着一个大型美国职业体育网站。大约两年前,我们开始了这个项目,并选择Java作为我们的平台,尽管我的问题不是特定于Java的。自从我们开始以来,我们的队伍中出现了一些变动。我们每个人在决定执行细节方面都有很大程度的自由度,尽管重要的决定是通过协商一致方式作出的。
我们的项目是一个相对年轻的项目,但是我们已经处于没有一个开发人员对该应用程序一无所知的地步。造成这种情况的主要原因是我们发展速度快,其中大部分发生在我们这项运动赛季揭幕战的紧要关头。事实上,我们的测试覆盖率基本上是0。
我们都了解TDD的理论优势,并原则上同意,如果我们多年来一直坚持使用这种方法,这种方法将改善我们的生活和代码质量。这从未站稳脚跟,现在我们负责一个未经测试的代码库,它仍然需要大量的扩展,并在生产中积极使用,并被公司结构所依赖。
面对这种情况,我只看到两种可能的解决方案:(1)追溯性地为现有代码编写测试,或者(2)尽可能多地重写应用程序,同时狂热地遵守TDD原则。我认为(1)基本上是不切实际的,因为我们在项目中有一个地狱般的依赖关系图。我们的组件几乎都不能单独测试。我们不知道所有的用例;在测试推送期间,由于业务需求或作为对不可预见问题的反应,用例可能会发生变化。由于这些原因,我们无法真正确定一旦完成测试,我们的测试将会变成高质量的。存在将团队带入虚假安全感的风险,即微妙的错误会在没有人注意到的情况下悄悄潜入。鉴于投资回报率的前景黯淡,我自己或我们的团队很难向管理层证明这种努力是合理的。
方法(2)更具吸引力,因为我们将遵循测试优先原则,从而生成几乎100%覆盖的代码。即使最初的努力最初导致覆盖代码孤岛,这也将为我们在实现项目范围的覆盖过程中提供一个重要的滩头阵地,并有助于解耦和隔离各种组件。
这两种情况下的缺点是,我们团队的业务生产力可能会显着减慢,或者在任何测试推送期间完全蒸发。在业务驱动的危机期间,我们负担不起这样做,尽管随后是相对平静的,我们可以利用它来达到我们的目的。
除了选择正确的方法((1),(2)或其他未知的解决方案)之外,我还需要帮助回答以下问题:从长远来看,我的团队如何确保我们的努力不会因未维护的测试和/或随着业务需求的不断增长而无法编写新测试而浪费?我在这里对各种各样的建议持开放态度,无论它们涉及胡萝卜还是大棒。
无论如何,感谢您阅读有关这种自我造成的困境的信息。