由外而内的 TDD:我应该检查未通过的验收测试吗?

Outside-In TDD: Should I check in failing acceptance tests?

因此,您从失败的验收测试开始,然后通过单元测试构建功能,直到验收测试通过。但是当您通过单元测试时,您是否应该签入源代码管理?如果这样做,是否将验收测试标记为忽略(如果是,在何处?在代码中或在构建服务器上)?这如何适应持续集成?

不,您不应该签入失败的测试,在 持续集成 环境中,您应该始终保持代码可发布,根据定义,失败的验收测试表明该代码目前不可发布。

While it’s failing, an acceptance test demonstrates that the system does not yet implement that feature; when it passes, we’re done.
Growing Object-Oriented Software Guided by Tests by Steve Freeman and Nat Pryce

如果您担心失去进度,或者想保留您的更改,请暂时将它们存储为一个搁置集,这样您的更改就在服务器上,并且在您无法开始工作时可供其他开发人员使用继续该功能,但同样地,该团队有一个工作构建,另一个开发人员可以从中分支以进行其他更改,或者可以将他们完成的功能与之集成。

我不会说得这么强烈,但这几乎可以概括 -

43. Share code only when ready. Never check in code that’s not ready for others. Deliberately checking in code that doesn’t compile or pass its unit tests should be considered an act of criminal project negligence.
Practices of an Agile Developer by by Venkat Subramaniam and Andy Hunt.

我不会将 失败 验收测试推送到源代码管理,无论是在主分支还是功能分支上。失败的测试会使分支的构建变红,使我更难注意到我的更改可能意外导致的其他测试失败。但通过源代码控制共享正在进行的工作也很有帮助,因此我们需要一种方法来做到这一点,同时保持构建绿色。

我最近使用的测试框架通过提供将测试标记为未实现的方法来解决这个问题:

  • 在 Cucumber 步骤定义中调用 pending 会跳过其余的步骤和场景,并打印一条警告来提醒您。 Cucumber 的默认配置也会忽略标记为 @wip 的场景,尽管该机制不会产生提醒警告。
  • 同理,RSpec has several ways to skip examples.

如果您的测试框架没有任何此类功能,您始终可以在提交之前注释掉正在进行的测试。我通常不会将进行中的测试推送到 master,但它们在进行中的功能分支上没问题。