Unit test, NUnit or Visual studio?

我使用 Visual Studio (有时候是 resharper)来运行我的单元测试。

我听说过 NUnit 但是我对它知之甚少。

我应该关心它吗? 它能提供比视觉工作室更好的东西吗?

我应该使用 NUnit 吗? 为什么?

65377 次浏览

NUnit 是一个单元测试框架,也得到了 resharper 的支持。我认为你使用的是微软的单元测试框架,所以 NUnit 只是微软产品的替代品;)

这里是 NUnit 主页的链接: http://nunit.org

NUnit can be used in combination with visual studio. It is a framework not a separate program. So you could care an see if it suits you :).

alt text http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

“安装完插件后,你会在工具菜单下找到一个新的子菜单。”

有关导入它的更多信息,请参见 http://nunitit.codeplex.com/

同时,通过搜索 SO 可以发现很多问题。例如,This topic列出了 NUnit 相对于 MS 标准测试的优势。

与 MS-Test 相比,NUnit 几乎没有什么优势

  1. Suite 属性-可以聚合测试并分别执行它们(例如,对于具有快速和慢速测试的大型项目来说非常有用)
  2. 可读断言方法,例如 Assert.AreEqual(expected, actual)Assert.That(actual, Is.EqualTo(expected))
  3. NUnit 有频繁的版本更新-MS-Test 只有一个 VS 版本。
  4. Many integrated runners including Resharper and TestDriven.NET
  5. 预期的异常消息断言-可以在 NUnit 中使用属性来完成,但必须在 MS-Test 中使用 Try- 捕捉来完成
  6. NUnit 允许参数化测试。

我不知道其他的,但是 NUnit 提供了很好的 GUI 和控制台来运行你的单元测试,你也可以生成 NUnit 测试执行结果的报告,它会给出测试失败或通过的细节,以及你的单元测试花了多长时间

NUnit 使用 VS 的标准版本。

从我目前的角度来看(经过8个月的开发,平均有10个开发人员) ,我建议 反对使用 MSTest,原因如下

  • The framework in itself is quite 慢,我不是说测试代码 你写作,那是在你的控制之下。 我是说运行这些的框架 测试很慢,无论它是否运行 测试套件、单个测试等。
  • 需要保留 Test-Metadata 文件 这总是导致并发症 当几个开发人员在工作的时候 on it (recreating e.g. the metadata 其他的测试套件都没有 需要一个元数据文件 很高兴组织你的测试,但你 可以达到同样的效果 命名空间、类和方法名。
  • 进行持续集成时,如果要在生成计算机上运行单元测试,则需要在该计算机上安装 VisualStudio。

换句话说,如果我必须在8个月前再做决定,我可能会选择 NUnit。我可能没有集成的测试结果报告,但是开发人员会有一个更加无缝的测试体验。

Here is my experience with MS Test

  • 我们正在运行的 MS 测试与约3800测试。
  • 这些测试需要很长时间才能开始执行,这在运行单个测试时非常痛苦。
  • 执行测试需要大约1GB 的内存。不,不是因为我们测试中的内存泄漏。我们经常会遇到 OutOfMemory 异常。
  • Because it uses that much resource, we are starting to execute the tests from batch-files. So what's the whole integration good for?
  • It is buggy and unstable:
    • 例如,如果从测试中删除[ Ignore ]属性,它就不会识别它,因为它会在某个地方缓存有关测试的信息。您需要刷新测试列表,这有时可以解决问题,或者重新启动 VS。
    • 它不会随机地将引用程序集复制到输出目录。
    • 部署项(要使用的附加文件)不能正常工作。它们被随机忽略。
  • There is hidden (not visible in the test code) information in vsmdi and testrunconfig files. If you don't care about it, it might not work.
  • 在功能上,它可能与 NUnit 相当,但是如果您考虑使用 VS 测试版,那么它就非常昂贵。

补充: 我们现在有更多的测试,甚至不能说有多少。由于 OutOfMemory 异常和其他不稳定性问题,再也不可能在 VisualStudio 中全部运行它们了。我们根据脚本运行测试。在 VisualStudio 中很容易查看测试结果,但是当解决方案打开时,VS 崩溃(每次)。因此,我们需要使用文本搜索来搜索失败的测试。集成工具已经没有任何优势了。


Another Update: We are using VS 2013 now. A lot of things changed. They rewrote the MS Test test runner for the third time since we started. This caused a lot of breaking changes, but neither new version was doing anything better. We are glad that we didn't use the fancy features of MS Test, because they are all not supported anymore. It's really a shame. We are still using scripts to build and run all unit tests, because it is handier. Visual Studio required a few minutes to start running tests (time measures after compilation until first test starts). They probably fixes it with an update and this might be a specific problem of our project. However, Resharper is much quicker when running the same tests.

结论: 至少与 Resharper 联用,MS 试验是有效的。我希望他们最终能发现测试运行程序应该如何编写,并且在我们下次更新 Visual Studio 时不会做这种突破性的更改。

Biggest advantage MS-Test over NUnit is MS-Test can generate mock objects using Reflection. 我觉得很有用

NUnit中,测试不是并行执行的。相反,似乎所有测试都在一个线程上执行。在 MSTest 中,每个测试在一个单独的线程上实例化,这导致运行被交错。因此,如果测试 A 的成功依赖于测试 B,那么它很可能会失败,因为测试 B 很可能会在测试 A 运行时开始运行。