8

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

顺便说一句,您可能还会在 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(测试前)还是经典单元测试(测试后)。

恕我直言,这个问题有不止一个最佳答案,但 AFAIK SO 让我只选择一个,所以为了公平起见,我给 Pete Johns 打上了复选标记,因为他是第一名并获得了最多的选票SO社区。芬兰的 Esko Luontola 也给出了一个很好的答案(我希望他没有被火山灰掩埋)和两个非常好的链接,恕我直言;绝对是 FIRST 的链接对我来说是鼓舞人心的;AFAIK,.NET 世界中只有 xUnit.net 提供“任何订单,任何时间”。Esko 的第二个链接是由 JB (Joe) Rainsberger 提供的真正出色的 92 分钟视频“集成测试是骗局”(http://jbrains.ca,其中有更多值得我花时间的内容)。顺便说一句,Esko 的博客也值得一游http://orfjackal。

4

5 回答 5

14

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

还应该建立一个持续集成循环,以确保在每次签入源代码控制系统时运行所有测试。这将及早捕获破损。

至少,每晚的构建都应该运行每一个测试,并且在早上的第一件事就是修复任何破损。不允许任何单元测试失败!

于 2010-05-21T13:31:06.443 回答
7

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

测试必须很快。如果您在简单的单行更改后犹豫是否运行测试,那么您的测试太慢了。使测试如此之快,您不必考虑它们。[...] 一个软件项目最终会有数以万计的单元测试,并且团队成员需要每分钟左右都运行它们而不感到内疚。你做数学。

就我个人而言,我的疼痛阈值约为 5-10 秒;如果编译和运行所有单元测试需要更长的时间,它会严重困扰我并减慢我的速度。

如果有缓慢的集成测试(应该避免),它们可以在每次签入时运行。最好由开发人员在他签入之前,然后再次在持续集成服务器上。

于 2010-05-21T13:32:06.330 回答
3

最佳实践当然是在签入时或签入之前运行单元测试。当然,单元测试有可能在签入之前在机器上通过,但是当实际代码库的一部分其他更新合谋破坏单元测试时,所以它们也应该在完整的代码上运行。

有一些工具可以帮助您解决这个问题,例如 TeamCity,它允许您有条件地签入,它会在签入前为您运行测试,并在每次签入后运行构建,包括配置的测试。(这种做法称为持续集成)。

无论最佳实践如何,现实情况是,如果您运行测试太晚,则更难追踪失败的原因,并且随着时间的推移,失败的测试将被注释掉,或者更糟糕的测试将被允许保留为失败,导致新的失败测试被忽视。

于 2010-05-21T13:39:03.103 回答
2

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

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

于 2010-05-21T13:24:12.880 回答
1

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

但是,对于大量测试,这可能需要很长时间,因此您需要能够管理它。

如果子集被轮换并且整套测试每周运行一次(比如说),那么只运行一个测试子集可能就足够了,但这仍然会为代码库中的重大更改留出几天的时间。

必须在签入之前运行所有测试,因为您无法知道您的更改没有对代码的其他部分产生不利影响。我一次又一次地看到这个,没有单元测试很难发现。

于 2010-05-21T13:25:07.683 回答