单元测试,NUnit还是Visual Studio?

119

我正在使用Visual Studio(有时还用Resharper)来运行我的单元测试。

我听说过NUnit,但我不太了解它……

我应该关心它吗?它能比Visual Studio提供更好的东西吗?

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


12
请考虑使用xunit,但无论您做什么,请查看TestDriven.net。 - Ian Ringrose
请参见:https://dev59.com/EnRB5IYBdhLWcg3wJUeu - David Schmitt
尝试使用xunit.net。它是一个开源的、适用于.NET应用程序的优秀单元测试框架。 - Mukesh Arora
9个回答

104

NUnit相对于MS-Test具有一些优势:

  1. 套件属性——可以聚合测试并单独执行它们(例如,在具有快速和慢速测试的大型项目中非常有用)
  2. 易读的Assert方法,例如: Assert.AreEqual(expected, actual) 相对于 Assert.That(actual, Is.EqualTo(expected))
  3. NUnit经常进行版本更新,而MS-Test仅在每个VS版本中进行一次更新。
  4. 许多集成运行器,包括Resharper和TestDriven.NET
  5. 期望的异常消息断言——NUnit可以使用属性完成,但在MS-Test中必须使用Try-Catch完成。
  6. [TestCase]! NUnit允许参数化测试。

32
在MS-Test中,也可以通过属性ExpectedExceptionAttribute来断言异常。 - Stefan Steinegger
9
我会使用NUnit和Assert.Throws<>(),因为这符合AAA原则,而属性方式则不符合。 - Oliver Hanappi
25
#3不是一个特性,它是一个问题,#5是100%错误的;MS Test具有ExpectedException属性,并且一直都有。 - Randolpho
4
据我回忆,他们故意不支持消息文本检查,因为文本被认为不重要并且可以是任意的。也就是说,这不会影响程序的流程。 - Rob Kent
7
"#3不是一个特性,它是一个问题" - 这听起来并不像敏捷思维的方式... - SamuelKDavis
显示剩余5条评论

73

从我目前的角度来看(与平均有10名开发人员一起开发了8个月后),我建议不要使用MSTest,理由如下:

  • 这个框架本身相当缓慢。我不是指你编写的测试代码 - 那在你的控制之下。我的意思是运行这些测试的框架很慢,无论是运行测试套件、单个测试等。
  • 需要保持一个测试元数据文件,这总会导致复杂性,尤其是当多个开发人员在上面工作时(例如重建元数据等)。其他任何测试套件都不需要元数据文件。通过命名空间、类和方法名,也可以达到同样的效果。
  • 如果要在构建机器上运行单元测试,需要进行持续集成,则需要在该机器上安装Visual Studio。

换句话说,如果我再次决定8个月前,我可能会选择NUnit。我可能没有集成的测试结果报告,但开发人员将拥有更流畅的测试体验。


6
如果可以选择,建议避免使用MSTest。各种开源框架更好一些(例如xUnit、NUnit和MbUnit等)。 - Brannon

50

这是我使用MS Test的经验:

  • 我们有大约3800个测试用例在运行MS Test。
  • 测试启动花费时间过长,单独运行一个测试非常痛苦。
  • 执行测试需要约1GB内存。不是因为我们的测试存在内存泄漏问题。经常会遇到OutOfMemoryExceptions异常。
  • 由于它使用了这么多资源,我们开始从批处理文件中执行测试。那么整个集成的作用何在?
  • 它存在一些漏洞和不稳定性:
    • 例如,如果您从测试中删除 [Ignore] 属性,则它不会识别该测试,因为它在某个地方缓存了关于测试的信息。您需要刷新测试列表,有时可以解决问题,或者重新启动VS。
    • 它随机地无法将参考程序集复制到出口目录中。
    • 部署项(要使用的其他文件)根本不能正常工作。它们会被忽略。
  • vsmdi和testrunconfig文件中存在隐藏的(在测试代码中看不到的)信息。如果您不关心它,它可能不起作用。
  • 功能上可能与NUnit相当,但如果考虑使用VS测试版本,它会非常昂贵。

补充:我们现在有更多的测试用例,无法再从Visual Studio中运行所有测试了,因为会出现OutOfMemoryExceptions和其他不稳定性问题。我们从脚本中运行测试。在VS中查看测试结果非常容易,但是当打开解决方案时,VS会崩溃(每次都会)。因此,我们需要使用文本搜索来查找失败的测试。集成工具已经没有任何优势了。


另一次更新:我们现在使用的是VS 2013。很多东西都改变了。自从我们开始以来,他们已经第三次重写了MS Test测试运行程序。这导致了很多破坏性的改变,但是新版本并没有做任何更好的事情。我们很高兴我们没有使用MS Test的花哨特性,因为它们现在都不再得到支持了。真的很遗憾。我们仍然使用脚本来构建和运行所有单元测试,因为这更方便。Visual Studio需要几分钟才能开始运行测试(测量时间从编译到第一个测试开始)。他们可能会用一次更新来修复这个问题,这可能是我们项目的特定问题。然而,当运行相同的测试时,Resharper要快得多。

结论:至少与Resharper结合使用时,MS Test是有用的。我希望当我们下次更新Visual Studio时,他们最终能找到如何编写测试运行器,并且不会做出这种破坏性的更改。


最近我开始不使用调试来运行它们,这样会使速度快得多,更像 NUnit 的使用方式,但仍然很难用。似乎调试时 Visual Studio 会做一些奇怪的东西导致性能变差。(也就是说,使用“ctrl+F5”而不只是“F5”-你仍然可以得到与 VS 的良好“集成”) - Arafangion

18

NUnit可以与Visual Studio结合使用。它是一个框架而非单独的程序,因此您可以尝试一下看是否适合您:)。

alt text
(来源:codeplex.com)

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

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

此外,使用SO的搜索功能可以找到很多信息。例如,此主题列出了NUnit相较于MS标准测试的优势。


6

MS-Test相对于NUnit最大的优势在于,MS-Test可以使用反射来生成模拟对象。我发现这非常有用。


12
好的,我会尽力完成任务。以下是需要翻译的内容:http://code.google.com/p/moq/ http://www.nmock.org/ http://stackoverflow.com/questions/37359/what-c-mocking-framework-to-use
  1. http://code.google.com/p/moq/ Moq是一个流行的基于.NET平台的开源单元测试框架,它使用Lambda表达式和Linq-to-Objects等语言特性来创建强类型、可读性高的Mock对象。它还提供了一组丰富的API,可以轻松地设置Mock对象的行为和期望。
  2. http://www.nmock.org/ NMock也是一个.NET平台上的流行的开源单元测试框架,可以帮助您创建Mock对象并设置其行为和期望。与Moq不同的是,NMock使用一种不同的语法来创建Mock对象,它基于反射和动态代理来实现。
  3. http://stackoverflow.com/questions/37359/what-c-mocking-framework-to-use 这个问题涉及到选择一个适合C#项目的Mocking框架的建议。根据问题的回答和投票,Moq是最受欢迎的选择之一,因为它易于学习和使用,并具有灵活的API。其他备选项包括Rhino Mocks和NMock。
- David Schmitt

3

NUnit可以与VS的标准版一起使用。


1
不要忘记 Visual Studios 的 Express 版本。 - chobo2
单元测试程序集项目的后生成步骤 -- \path\to\nUnit $(TargetFileName) - Steve Gilham

1
NUnit是一个单元测试框架,也被Resharper支持。我想你正在使用微软的单元测试框架,所以NUnit只是微软产品的替代品 ;)
这里是NUnit官网链接: http://nunit.org

那么你的意思是nunit除了微软单元测试框架之外没有其他的东西? - Tim
确实如此,例如在我的帖子中(上面)可以看到我的链接。 - bastijn
我正在使用NUnit,对于微软的单元测试框架并不了解,所以我不能说哪个更好。我认为你很有可能在SO上找到关于它们之间差异的一些主题。 - Oliver Hanappi
它提供了一些有用的结构,例如[TestCase],用于使用不同参数运行一个测试方法,[Theory] - 用于构建更精细的规范和其他内容。它还支持非常好的流畅语法来进行断言。最后但并非最不重要的是,它的使用范围比MSTest广泛得多,因此如果您遇到问题,您将有更好的获取支持/信息的机会。 - elder_george

1

我不确定其他人,但 NUnit 提供了漂亮的 GUI 和控制台来运行您的单元测试,您还可以生成 NUnit 测试执行结果的报告,其中会详细说明测试是否失败或通过以及单元测试所需的时间。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接