在 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".
我打算开始使用 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".