TDD /单元测试 - 可以打破现有测试

时间:2014-09-03 13:29:25

标签: unit-testing tdd

re-factor的{​​{1}}阶段,可以将多个现有测试分解为一次。例如,要更改类的构造函数,并且必须修改使用该类的测试。

测试断言测试代码的TDD,但是测试behaviour的实现实际上是在测试代码本身。

  

我想避免多次测试打破单元测试应尽可能干,这意味着如果构造函数发生更改(如果可能),则需要进行单次更新。

4 个答案:

答案 0 :(得分:4)

理想情况下,您应该尝试将测试的设置代码保存在一个公共位置,以便所有测试都可以要求从“权威来源”测试某种类型的实例。因此,第一步是重构测试以从共享帮助器方法获取实例,而不是自己调用new

然后,您可以重构构造函数以获取更多参数。现在,你有一个地方可以解决。

我经常称这个助手为TestDataFactory。它对对象模型有一点了解,因此您可以向它询问Foo的实例,它将在大多数字段中返回一个包含大量有用测试数据的实例。

答案 1 :(得分:0)

这种情况一直发生在我身上,构造函数或在多个地方调用的任何其他东西。我不认为这是一个大问题,我通常只是纠正任何意外失败的测试,然后继续进行我所在的测试。

有些人已经考虑过避免这种情况的技术,特别是对于长时间运行的重构,你不想在非编译状态下花费数小时。参见Joshua Kerievsky创造的"Limited Red"的概念。

答案 2 :(得分:0)

正如@Arron已经说过,第一步是尽早重新计算并移动代码,使用您要测试工厂方法的方法来实例化对象。

e.g。

var sut = CreateSUT();
var result = sut.MethodUderTest();
Assert.IsTrue(result);

对于更复杂的对象,您可能需要考虑使用类似测试数据构建器模式的模式。这个blog很好地描述了模式。

答案 3 :(得分:0)

我与上面提到的大部分内容都是一致的,但我通常会这样做有点不同。我不想打破我目前正在研究的范围之外的测试。但是,我也不想基于一些非理性的“代码管理恐惧”限制我的重构(我认为这样的精神问题会产生更大的质量问题)。

所以我通常做的是我用新的行为添加新代码,保持旧代码一段时间(弃用它),只需要足够长的时间以使新功能稳定下来。然后我同时处理一次扫描中的所有其他测试,确保你只能修复它。

在C#中(作为示例)具有默认值的可选参数可以真正帮助我,但除此之外我只是重载或创建新的ctor /方法。

这样做可以让我更专注于手头的任务(测试),但更重要的是,它在重构时也让我无情。重构感觉更自然,破坏性更小。

一个校长我真的不适用于单元测试是DRY。我不建议任何人将这种想法带到测试世界。 DRY倾向于创建难以遵循的测试用例。我宁愿在测试中有很多代码,但比DRY更容易理解。