2009-10-12 146 views
109

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

我听说NUnit的,但我不知道这件事情很多事情......

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

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

+12

也考虑的xUnit一个例子,但是不管你做什么有一个看起来TestDriven.net – 2009-10-12 12:25:00

+0

@Ian +1 TDD。 – magnus 2010-01-11 21:43:01

+0

另请参阅http://stackoverflow.com/questions/707444/nunit-vs-team-system-unit-test – 2010-02-17 09:44:22

回答

90

NUnit的具有超过MS试验

  1. 套件属性几个优点 - 可以聚集试验和分别执行它们(用于与例如快速和慢速测试大项目)
  2. 可读Assert方法,例如Assert.AreEqual(expected, actual) vs Assert.That(actual, Is.EqualTo(expected))
  3. NUnit有频繁的版本更新 - MS-Test每个VS版本只有一个版本。
  4. 许多集成选手包括ReSharper的和TestDriven.NET
  5. 预期异常消息断言 - 可以通过属性来完成在NUnit的,但必须在MS-测试
  6. [TestCase]使用的try-catch来完成! NUnit允许参数化测试。
+29

异常也可以通过MS-Test中的属性断言:ExpectedExceptionAttribute。 – 2009-10-12 12:11:28

+7

我将使用NUnit与Assert.Throws <>(),因为这遵循AAA原则,这是不通过属性的方式。 – 2009-10-12 12:26:53

+0

@Stefan Steinegger,MSTest预计的异常属性,但它无法验证消息文本 – Elisha 2009-10-16 14:27:18

1

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

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

+0

所以你的意思是说,nunit不会带来任何比微软单元测试框架更多的东西吗? – Tim 2009-10-12 11:30:18

+0

它的确如此,请参阅我的链接,例如我的帖子(上图)。 – bastijn 2009-10-12 11:34:36

+0

我使用的是NUnit,并不真正了解微软的单元测试框架,所以我不能说什么更好。我认为你很有可能会在SO上找到一些有关这些差异的话题。 – 2009-10-12 11:35:22

18

NUnit的可以用来结合视觉工作室。这是一个框架,不是一个单独的程序。所以你可以关心一下,看看它是否适合你:)。

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

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

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

另外,使用SO的搜索可以找到很多。例如,This topic列出了NUnit优于MS标准测试的优点。

1

我不知道别人,但NUnit的提供了很好的图形界面和控制台运行单元测试,你也可以生成NUnit测试的执行结果的报告,该报告将给出whethere测试失败或通过细节以及您的单元测试需要几点时间

3

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

+1

不要忘记视觉工作室快递版本。 – chobo2 2009-10-14 22:41:39

+0

单元测试程序集项目的后构建步骤 - \ path \ to \ nUnit $(TargetFileName) – 2009-10-15 06:27:30

63

从我目前的角度来看(8个月的开发与大约10名开发人员平均后)我会使用MSTest的建议,原因如下

  • 本身的框架是相当 缓慢。我的意思不是你写的测试代码 - 这是在你的控制之下。 我的意思是运行那些 测试框架是缓慢的,无论是运行 测试套件,单测试等
  • 需要保持一个测试元数据文件 总是导致并发症 当几个开发人员在工作 它(重新创建例如元数据 等)。每个其他测试套件不需要 需要一个元数据文件。这是一种 很好组织你的测试,但你 可以通过 名称空间,类和方法名称实现相同。
  • 做持续集成,如果你想在你的生成机器上运行单元测试,你将需要在该机器上安装Visual Studio。

换句话说,如果我必须在8个月前再次决定,我可能会采用NUnit。我可能没有集成测试结果报告,但开发人员将拥有更加无缝的测试经验。

+0

+1,这里的体验相同。 – 2009-10-12 12:13:09

+6

+1,避免MSTest,除非你没有选择。各种开源框架更好(xUnit,NUnit,MbUnit等)。 – Brannon 2009-12-17 09:54:55

46

这里是我的经验与MS测试

  • 我们正在运行MS测试与周围3800测试。
  • 只需开始执行测试需要很长时间,这在运行单个测试时很痛苦。
  • 大约需要1GB内存来执行测试。不,这不是由于我们测试中的内存泄漏。我们经常遇到OutOfMemoryExceptions。
  • 因为它使用了那么多资源,所以我们开始从批处理文件执行测试。那么整合整合有什么好处呢?
  • 它是越野车和不稳定:
    • 举例来说,如果你删除[忽略]从测试属性,它不承认它,因为它的地方缓存有关测试的信息。您需要刷新测试列表,有时可以解决问题,或重新启动VS.
    • 它随机不会将引用程序集复制到out目录。
    • 部署项目(要使用的附加文件)无法正常工作。他们被随意忽略。
  • vsmdi和testrunco​​nfig文件中隐藏着(在测试代码中不可见)信息。如果你不关心它,它可能无法正常工作。
  • 在功能上它可能与NUnit相当,但如果您考虑使用VS测试版,则它非常昂贵。

增加:我们现在有一些更多的测试,甚至不能说有多少。由于OutOfMemoryExceptions和其他不稳定性问题,无法从Visual Studio中运行它们。我们从脚本运行测试。在Visual Studio中查看测试结果很容易,但是当解决方案打开时,VS会崩溃(每次)。所以我们需要使用文本搜索来搜索失败的测试。再也没有集成工具的优势了。


另一个更新:我们使用VS 2013现在。很多事情都改变了。自从我们开始以来,他们第三次重写了MS Test测试跑步者。这导致了很多突变,但新版本都没有做得更好。我们很高兴我们没有使用MS Test的奇特功能,因为它们都不再受支持。这真是一个耻辱。我们仍然使用脚本来构建和运行所有的单元测试,因为它更方便。 Visual Studio需要几分钟才能开始运行测试(编译后的时间测量,直到第一次测试开始)。他们可能会通过更新修复它,这可能是我们项目的一个特定问题。但是,运行相同的测试时,Resharper要快得多。

结论:至少与Resharper结合使用时,MS Test很有用。我希望他们能够最终发现测试运行者应该如何编写,并且下次更新Visual Studio时不会做这种突破性更改。

+0

我最近开始在没有调试的情况下运行它们,使它更快*更像NUnit的使用方式,但它仍然很糟糕。看起来糟糕的性能与Visual Studio在调试时做了些时髦的事情有关。 (也就是说,使用“ctrl + F5”而不是“F5” - 你仍然可以很好的与VS) – Arafangion 2010-12-13 08:06:35

+0

3,800“整合”!幸运的是,想象一下29,948,NUNIT在这一点上变得非常痛苦.. – 2014-05-04 05:47:46

+0

好的回答,节省了我的时间 – FindOutIslamNow 2017-09-30 03:08:15

5

最大的优势MS-Test通过NUnit是MS-Test可以使用反射生成模拟对象。 我发现它非常有用

+10

http://code.google.com/p/moq/,http://www.nmock.org/,http ://stackoverflow.com/questions/37359/what-c​​-mocking-framework-to-use – 2010-02-17 09:41:03

-11

如果您使用Visual Studio您必须使用NUnit进行单元测试,并且如果您正在运行java(Netbeans),则必须使用JUnit进行单元测试。

下面是一个简单的计算器单元测试

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using SimpleCalculator; 
using NUnit.Framework; 

namespace CalculatorTest 
{ 
    [TestFixture] 
    public class Class1 
    { 
     public Calculator _calculator; 
     [TestFixtureSetUp] 
     public void Initialize() 
     { 
      _calculator = new Calculator(); 
     } 
     [Test] 
     public void DivideTest() 
     { 
      int a = 10; 
      int b = 2; 
      int expectedValue = a/b; 
      int actualvalue = _calculator.Divide(a, b); 
      Assert.AreEqual(expectedValue, actualvalue,"Failure"); 

     } 
    } 
} 
+2

当然你不*必须使用NUnit,它只是一个框架,没有人强迫你使用它。如果你觉得无聊,你甚至可以自己写。 – HimBromBeere 2016-05-20 10:24:38