从被测系统中提取类时,应该重构单元测试吗?


13

我写的这个类做了几件事(也许这违反了单一责任原则)。我现在该项目的其他部分需要意识到一块是逻辑的,我要揭露它是提取的一类了我原来的被测系统的方式。

我期望无需更改任何测试代码即可执行此操作,但是当我完成操作时,您可能会说该测试不再是单元测试。它将测试原始类我提取的类。换句话说,我将有一个测试用例,但有两个系统正在测试中。

完成后是否应该重构测试代码?IE:创建一个ExtractedClassTest并将所有相关测试从OriginalClassTest移入其中?这似乎有点冒险:我可能会在此过程中失去一些覆盖面,它可能不像移动测试那样简单,并且我最终会重写一些我知道曾经可以使用但无法再使用的测试代码,等等

另一方面,如果按原样保留OriginalClassTest,则可以看到这是测试维护问题。找到ExtractedClass的测试在哪里会有些混乱。您的第一印象将是它不存在。随着时间的推移,随着大量生产代码的重构,这可能会成为一个严重的问题。

我是TDD的新手,所以我需要专家的建议。谢谢!

Answers:


7

看完这个惊人的演讲 “伊恩·库珀:TDD,哪里都出了问题”之后,我将不同意@pdr。我认为您应该只保留原始测试。无需中断,编写或更改任何测试即可重构被测系统的能力,首先就是编写测试的全部目的。

如果要测试提取的类,则要测试实现而不是行为。结果,将来我的代码将更难以重构:即使行为仍然有效,这些新测试也可能会失败。


6

在开发过程中,两者兼而有之。保留旧测试以确保您没有破坏任何东西,编写新测试(从头开始)以帮助您按原样设计类。

最后,仔细检查并删除旧测试中已消失的所有内容。在分析时要小心;不要删除某些东西,因为您认为它应该已经不存在了。向自己(或其他人,或橡皮鸭)演示为什么不再需要它了。中断测试并确保另一个测试也随之中断。

旧测试中剩下的所有内容都应根据具体情况进行处理,但是大多数情况下,它们应重写为新的结构。

因为您是对的,所以您不想离开维护噩梦。但是您不希望比以前拥有更少的路径覆盖率。


1
我只是这样做了,我不得不说这很令人沮丧。即使我的更改很简单,也需要大约2个小时来确保我正确地重构了测试,并且覆盖范围仍然相同。很明显,我应该在新测试中添加一些额外的测试,以确保我正在检查事物。我觉得提取类并测试两个系统会更有效。如此大量的工作是否表明我的测试成绩很差?
Daniel Kaplan 2013年

1
@tieTYT:不坐在那里看着你很难回答。有时,TDD似乎需要付出更多的工作。其他时候,您会想起您为什么要打扰。而其他时候,是您使事情变得更加艰难。学会分辨差异是精通TDD的重要部分。
pdr

您是否认为在这种情况下我不应该重构测试,或者您认为这不太可能?
丹尼尔·卡普兰

1
@tieTYT:不太可能,是的。不可能,不。
pdr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.