在 TDD 重构期间何时为改进的设计编写测试

When to write tests for improved design during refactoring in TDD

我打算开始使用 TDD。我已经阅读了 RED-GREEN-Refactor 循环的工作原理。我很乐意在代码之前编写测试并将其从红色变为绿色。尽管我对重构有一些基本问题:例如:在进行重构时,在改进设计时,假设我看到了引入工厂模式的好案例,并将其添加到代码中。我的测试可能会变成 RED,我试图修复它以使用这个新的改进。 但是我要在哪里为我在重构过程中添加的这个新工厂 Class 编写测试?或者应该像现在这样 我首先为 Factory class 编写测试 -> RED 添加工厂 class - 使测试变为绿色 重构这个工厂 class 修复 RED

中的其他测试

我是不是想错了?

如果重构或设计改进需要更改被测代码的外部行为或添加新行为,则不适合 TDD 周期的重构阶段。

可以通过为工厂编写测试来开始新的循环。当工厂完成后,可以在不同的TDD周期中在被测代码中引入工厂。

如果您严格遵循 class 典型的红-绿-重构循环,您将永远不会拥有未被测试覆盖的生产代码。您的单元测试应该只通过 public API 验证被测系统的行为,并远离实现细节。

"get to green" 阶段的目标是尽快到达绿色。只要您在这一步达到绿色,您所做的任何肮脏的黑客攻击都是可以原谅的。

在重构阶段,您可以(并且应该)清理您的代码。如果这意味着引入一个新的 class 来梳理出不真正属于初始 class 的独立行为,一定要去做。这些更改都是 "safe",因为您用单元测试覆盖了原始代码。由于重构不应该改变代码的行为,因此该栏应保持绿色。

你应该为这个新提取的 class 编写新的单元测试吗?不一定,因为它目前是被测系统的一部分,并且包含在您的原始单元测试中。

注意:还有其他类型的单元测试有利于在高度隔离的情况下对每个 class 进行测试,因此根据您的 TDD 类型,您的里程可能会有所不同。

回到你的例子:你正在引入一个工厂class。你在哪里使用这个工厂?该代码是否被测试覆盖(同样,如果您严格遵循红-绿-重构循环,它应该)?如果是这种情况,您不必为工厂编写新的单元测试,因为它是间接测试的,可以看作是 "implementation detail".