如何处理 TDD 的重构阶段

Posted

技术标签:

【中文标题】如何处理 TDD 的重构阶段【英文标题】:How to handle the refactoring phase of TDD 【发布时间】:2011-04-14 00:59:57 【问题描述】:

在 TDD 会话过程中,假设我编写了一个失败的测试,然后让它通过。我通过提取原始单元中的代码进行重构,使用提取类和移动方法等重构。现在进一步假设我的原始测试不再涵盖提取的代码,因为原始代码现在模拟了它的依赖关系,这对于单元测试是正确的。

返回并对提取的代码进行改进测试是否合适?还是我在重构过程中最终得到未经测试的代码时犯了一个错误?感觉就像我的代码库正在扩展,我必须重构,我正在对重构的代码进行大量测试。这感觉真的很尴尬。我重构错了吗?

【问题讨论】:

【参考方案1】:

现在进一步假设我的原始测试不再涵盖提取的代码,因为原始代码现在模拟了它的依赖关系,这对于单元测试是正确的。

模拟依赖项通常是一件好事,但并非总是如此,而且我不会说模拟所有依赖项是“正确的单元测试”。

在 TDD 的重构步骤中,您应该更改生产代码中不影响测试通过的内容。而且您不应该同时更改测试。

您可能希望稍后修改您的测试,以便独立于原始代码对提取的代码进行测试,并在原始测试中模拟。

【讨论】:

所以可以改造测试吗? 当然。但他们应该继续工作并提供相同的覆盖范围,直到您这样做。重构不会导致您突然发现代码。 我认为我的重构之一是变相​​的新代码,因此它未经测试。【参考方案2】:

这可能表明您的单元测试不够细粒度。就像,您已经编写了集成测试并通过了测试,现在您正在实施单元测试。

或者也许在重构之后你试图对你不应该测试的东西进行测试,比如私有方法。无论如何,重构不应该改变你的代码覆盖率。

【讨论】:

并非如此,但它们是很好的诊断尝试。检查@Don Roby 的 cmets 了解发生了什么。

以上是关于如何处理 TDD 的重构阶段的主要内容,如果未能解决你的问题,请参考以下文章

ENode框架Conference案例分析系列之 - 事件溯源如何处理重构问题

如何处理MySQL每月5亿的数据

分析类加载的链接阶段-准备 属性是如何处理的

网络音频合成:如何处理在攻击或释放阶段更改滤波器截止?

了解开发人员如何处理棕地项目

您如何处理 Apache Pig 中的空输入文件或丢失的输入文件?