您是如何调整单元测试以应对不断变化的需求的?

时间:2008-11-23 11:01:12

标签: unit-testing

我有一个项目,我一直在使用TDD和单元测试作为“软件vises”。本质上,我将需求转换为测试,以验证代码是否符合要求。我很少需要返回并编辑单元测试,而不是重点:只应修改“真实”代码。目前,有900个单元测试。

现在黄金所有者已经改变了一些要求。由于以前的要求在现有的单元测试中是如此彻底的编码,似乎改变它们以符合新的要求将会引起灾难。您如何调整单元测试套件来处理这种变化?

6 个答案:

答案 0 :(得分:5)

根据定义,unit-tests不会复制应用程序的要求。它们描述了模块的要求。这是一个区别,即使在具有不同要求的应用程序中也可以重复使用该模块,或者根本不使用该模块。因此,不断变化的需求不会影响实际的单元测试(除了您必须为新模块编写新模块或放弃旧模块,不再需要更改需求的模块)。

另一方面:acceptance-tests处理应用程序级别的要求。所以我想你谈论验收测试。

我会将新要求添加为新的验收测试。但对于旧的,你必须仔细研究它们,如何通过改变的要求使它们无效。

答案 1 :(得分:4)

我会添加新测试并让它们通过。然后你看看哪些测试被破坏了。如果您认为旧测试与新测试相矛盾,那么您可能必须删除旧测试。否则,您可以更改代码以使旧测试也通过。

答案 2 :(得分:2)

  

本质上,我将需求转换为验证代码符合要求的测试

虽然我同意Mnementh的回答,但对我而言,这是关键评论。如果测试是需求的翻译版本,那么如果需求发生变化,测试必须更改。

或者他们正在测试不符合客户要求的东西。

  

据报道约翰·梅纳德·凯恩斯曾说过,“当事实发生变化时,我改变了我的观点。你做了什么,先生?”

我认为这里有一个类似的情况。你的事实已经改变了

答案 3 :(得分:2)

  

由于前者的要求是如此   在现有单位编码   测试,似乎将它们改为   符合新的要求   邀请灾难。

你会这么想的任何具体原因?我感到有些恐惧,或者只是'在工作时不要破坏它'

发生变化。在这种情况下,这意味着更多的工作时间 - 金钱。如果企业没有问题,你也不应该(除非时间表是不人道的:)。如果规格发生了变化,

  • 确保已签入工作版本。
  • 重复步骤1以确定。
  • 扫描您的测试套件。找到你需要拿出来的。找到需要改变的。找到您需要了解的新测试。用一张白纸做笔记
  • 现在一次进行一次测试。除非您没有遵循DRY / Once且仅一次原则,否则您需要进行的任何更改应该在一个地方。如果没有,你应该在之前进行重构..但是为时已晚......在进行更改之前将代码提取到一个地方
  • 重复上一步直至完成

答案 4 :(得分:1)

如果您的单元测试不再符合要求,那么它们就不应该存在 - 毕竟 - 他们现在告诉您的是,您的代码符合不再存在的要求!

每当您对需求进行更改时,您应该更改代表更改的需求的测试,并验证测试现在是否失败(以前它们都已通过,对吧?))

然后改变您的源代码,以便重写的测试现在通过。

答案 5 :(得分:0)

我对你的问题有两个答案,一个是哲学问题,另一个是战术问题。

在哲学方面,将单元测试视为代码非常重要。这意味着良好代码的所有正常特征通常​​都适用于良好的测试:意图揭示,删除重复等。我在单元测试中看到的很多,也许是大多数失败都是因为人们没有对待他们的测试这样,而不是仅仅编码它们,而不是重新访问它们以确定它们是否应该被重构。

根据我的经验,如果你的单元测试是一个阻碍改变的地步,那是因为你的测试中有技术债务。

所以我的战术建议是,在你试图改变你的要求之前,你需要重构你的测试。每个测试都应该有一个唯一的通过/失败的原因,并且其外部的行为应该在共享代码中。这意味着对于任何给定的行为更改,您将有两个地方来更改测试:

  1. 实际验证该行为的测试
  2. 行为在共享夹具代码中使用的位置
  3. 您可能会发现这篇文章很有用:Grow Your Harness Naturally。它实际上是关于功能测试的可重用测试工具,但我发现这些想法在我的单元测试中也非常有用。