整个系统的单元测试应该多久运行一次?

时间:2010-05-21 13:22:11

标签: unit-testing tdd nunit mstest xunit.net

一般来说,我仍然是一个测试新手的单位。

顺便说一下,你也可以在xUnit.net等等论坛上看到这个问题 因为这对我来说是一个重要的问题。我提前为我申请了 交叉发布;你的意见对我而言并非所有人都非常重要 在这个论坛也属于其他论坛。

我正在研究一个已有超过700个单元测试的大十年历史遗留系统 最近写的(700只是一个小小的开头)。这些测试碰巧写成了 在MSTest中,但这个问题适用于所有测试框架AFAIK。

当我跑步时,通过vs2008“ALL TESTS”,最后的计数只有七次测试 这大约是迄今为止所有测试总数的1%。

更多信息:ASP.NET MVC 2 RTM源代码,包括其单元测试,
可在CodePlex上获得;那些单元测试也写在MSTest中 尽管(一个无关紧要的事实)Brad Wilson后来加入了ASP.NET MVC团队 作为其高级程序员。所有2000多个测试都会运行,而不仅仅是少数。

问题:鉴于AFAIK单元测试的目的是识别破损 在SUT中,我认为“最佳实践”始终是正确的 或者至少非常频繁地运行所有测试?

已更新2010-05-22

首先,感谢所有提供优秀答案的人。你的答案 确认我的一般结论,即在每次本地重建之后运行所有单元测试 无论是实践TDD(之前的测试)还是经典的最佳实践 单元测试(测试后)。

imho,这个问题有不止一个最好的答案,但AFAIK SO让 我只选择一个,所以为了公平起见,我给了复选标记 Pete Johns是第一位获得SO最多投票的人 社区。芬兰的Esko Luontola也给出了一个很好的答案(我希望如此) 他没有被火山灰埋葬)和两个非常好的联系 非常值得你的时间imho;绝对是F.I.R.S.T的链接。对我来说是鼓舞人心的; AFAIK,.NET世界中只有xUnit.net提供“任何订单,随时”。 Esko的第二个链接是一个真正优秀的92分钟视频“集成测试是一个骗局” 由J. B.(Joe)Rainsberger(http://jbrains.ca提出,其中有更多内容 值得我的时间)。顺便说一下,Esko的博客也值得一看http://orfjackal.net

5 个答案:

答案 0 :(得分:13)

由于您已将此问题标记为“TDD”,因此每次编译都应执行所开发模块的所有单元测试(并通过,禁止最新的模块,直到您通过)。其他模块中的单元测试不应该因当前模块中的开发而中断,否则它们会测试太多。

还应该有一个持续集成循环,以确保每次检入源控制系统时都运行所有测试。这将在早期陷入破裂。

至少,应该每晚进行每次测试,并且每天早上都要修复任何破损。容忍没有单元测试失败!

答案 1 :(得分:7)

应该可以快速运行单元测试,以便您可以在每次简单更改后运行它们。正如在http://agileinaflash.blogspot.com/2009/02/first.html

所说的那样
  

测试必须快速。如果您在简单的单线程更改后犹豫不决,那么您的测试速度太慢了。使测试速度如此之快,您不必考虑它们。 [...]一个软件项目最终将有成千上万的单元测试,团队成员需要每分钟左右运行它们而不会有罪。你做数学。

就我个人而言,我的疼痛阈值大约是5-10秒;如果编译和运行所有单元测试需要的时间比较长,那么它会严重惹恼我并让我放慢脚步。

如果存在慢速集成测试(which should be avoided),则可以在每次签入时运行它们。最好由开发人员在他签入之前再在持续集成服务器上再次使用。

答案 2 :(得分:3)

最佳做法当然是在办理登机手续时或之前进行单位测试。当然,有可能在办理登机手续之前在机器上通过了单位测试,但是当部分实际代码基础其他更新合谋破坏时单元测试,所以它们也应该在完整的代码上运行。

有一些工具可以帮助您,例如TeamCity,它允许您在签入之前有条件地签入,在哪里运行测试,并在每次检查后运行构建,包括测试(如果这样配置) in。(这种做法叫做持续整合)。

无论最佳做法如何,现实情况是,如果你的测试运行得太晚,就会更难以找到失败的原因,并且随着时间的推移失败的测试将被注释掉,或者甚至会更糟糕的测试保持失败,导致新的失败测试被忽视。

答案 3 :(得分:2)

由于单元测试可以自动化,我建议尽可能频繁地运行它们,特别是当你有这么多时。

最佳做法是将单元测试作为夜间构建过程的一部分运行。

答案 4 :(得分:1)

理想情况下,单元测试应作为每个构建的一部分运行,并在每次检入更改代码之前运行。

但是,通过大量测试,这可能需要很长时间,因此您需要能够对其进行管理。

如果子集被轮换并且整个集合每周运行一次(比如说),那么只运行一个测试的子集可能就足够了,但这仍然留有时间让一个重大变化留在代码库几天。

在签入之前运行所有测试,因为你没有其他方式知道你的更改没有对代码的其他部分产生负面影响。我已经一次又一次地看到,如果没有单元测试,很难发现非常