我有一个项目,我一直在使用TDD和单元测试作为“软件vises”。本质上,我将需求转换为测试,以验证代码是否符合要求。我很少需要返回并编辑单元测试,而不是重点:只应修改“真实”代码。目前,有900个单元测试。
现在黄金所有者已经改变了一些要求。由于以前的要求在现有的单元测试中是如此彻底的编码,似乎改变它们以符合新的要求将会引起灾难。您如何调整单元测试套件来处理这种变化?
答案 0 :(得分:5)
根据定义,unit-tests不会复制应用程序的要求。它们描述了模块的要求。这是一个区别,即使在具有不同要求的应用程序中也可以重复使用该模块,或者根本不使用该模块。因此,不断变化的需求不会影响实际的单元测试(除了您必须为新模块编写新模块或放弃旧模块,不再需要更改需求的模块)。
另一方面:acceptance-tests处理应用程序级别的要求。所以我想你谈论验收测试。
我会将新要求添加为新的验收测试。但对于旧的,你必须仔细研究它们,如何通过改变的要求使它们无效。
答案 1 :(得分:4)
我会添加新测试并让它们通过。然后你看看哪些测试被破坏了。如果您认为旧测试与新测试相矛盾,那么您可能必须删除旧测试。否则,您可以更改代码以使旧测试也通过。
答案 2 :(得分:2)
本质上,我将需求转换为验证代码符合要求的测试
虽然我同意Mnementh的回答,但对我而言,这是关键评论。如果测试是需求的翻译版本,那么如果需求发生变化,测试必须更改。
或者他们正在测试不符合客户要求的东西。
据报道约翰·梅纳德·凯恩斯曾说过,“当事实发生变化时,我改变了我的观点。你做了什么,先生?”
我认为这里有一个类似的情况。你的事实已经改变了
答案 3 :(得分:2)
由于前者的要求是如此 在现有单位编码 测试,似乎将它们改为 符合新的要求 邀请灾难。
你会这么想的任何具体原因?我感到有些恐惧,或者只是'在工作时不要破坏它'
发生变化。在这种情况下,这意味着更多的工作时间 - 金钱。如果企业没有问题,你也不应该(除非时间表是不人道的:)。如果规格发生了变化,
答案 4 :(得分:1)
如果您的单元测试不再符合要求,那么它们就不应该存在 - 毕竟 - 他们现在告诉您的是,您的代码符合不再存在的要求!
每当您对需求进行更改时,您应该更改代表更改的需求的测试,并验证测试现在是否失败(以前它们都已通过,对吧?))
然后改变您的源代码,以便重写的测试现在通过。
答案 5 :(得分:0)
我对你的问题有两个答案,一个是哲学问题,另一个是战术问题。
在哲学方面,将单元测试视为代码非常重要。这意味着良好代码的所有正常特征通常都适用于良好的测试:意图揭示,删除重复等。我在单元测试中看到的很多,也许是大多数失败都是因为人们没有对待他们的测试这样,而不是仅仅编码它们,而不是重新访问它们以确定它们是否应该被重构。
根据我的经验,如果你的单元测试是一个阻碍改变的地步,那是因为你的测试中有技术债务。
所以我的战术建议是,在你试图改变你的要求之前,你需要重构你的测试。每个测试都应该有一个唯一的通过/失败的原因,并且其外部的行为应该在共享代码中。这意味着对于任何给定的行为更改,您将有两个地方来更改测试:
您可能会发现这篇文章很有用:Grow Your Harness Naturally。它实际上是关于功能测试的可重用测试工具,但我发现这些想法在我的单元测试中也非常有用。