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

时间:2015-01-20 23:27:30

标签: refactoring tdd

我打算开始使用TDD。我已经阅读了RED-GREEN-Refactor循环的工作原理。我可以在代码之前编写Test并将其从Red变为Green。虽然我有关于重新分解的基本问题:例如:在进行重新分解的同时,我正在改进我的设计,假设我看到了引入工厂模式的好例子,我在代码中添加了这个。我的测试可能会转到RED,我试图修复它以使用这个新的改进。 但是我要为重新分解时添加的这个新工厂类编写测试?或者它应该像现在一样 我首先为Factory类编写测试 - >红色 添加工厂类 - 使测试成为绿色 重新考虑这个Factory类 修复RED中的其他测试

我在想错了吗?

2 个答案:

答案 0 :(得分:3)

如果您严格遵循经典的Red-Green-Refactor循环,则不应该拥有测试未涵盖的生产代码。您的单元测试应仅通过其公共API验证被测系统的行为,并远离实现细节。

“走向绿色”阶段的目标是尽可能快地实现绿色环保。只要你在这一步中变绿,你所做的任何肮脏的黑客都是可以原谅的。

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

你应该为这个新提取的课程编写新的单元测试吗?不是真的,因为它目前是被测系统的一部分,并且由您的原始单元测试覆盖。

注意:还有其他类型的单元测试有利于在严重隔离的情况下测试每个类别,因此根据您的TDD风格,您的里程可能会有所不同。

回到你的例子:你正在介绍一个工厂类。你在哪里用这个工厂?测试是否涵盖了该代码(同样,如果您严格遵循它应该使用的红绿重构循环)?如果是这种情况,您不必为工厂编写新的单元测试,因为它是间接测试的,可以看作是“实现细节”。

答案 1 :(得分:1)

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

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