NUnit中有什么我能做的,我不能在MSTest中做的?

这个问题在很多不同的论坛上有过各种forms的问题,但是,恕我直言,我还没有find一个真正回答得很清楚的地方,所以我要重新devise一下,再次提出。

我在一个基本的微软商店工作。 我们使用TFS,我们所有的开发人员都有MSDN订阅,包括VS的Team Suite版本。 所以我们有权访问MSTest。

我已经阅读了各种NUnit与MSTest的比较,开发人员社区似乎非常压倒性地selectNUnit。 但是,至less在我们的情况下,所给出的理由似乎并不令人感到压倒性的或是令人信服的。 (NUnit更新更频繁,NUnit更快,NUnit不需要TFS等)

如果我select的话,我可以使用NUnit,但是在没有正式支持的情况下使用开源软件必须得到保护。 我需要一个相当令人信服的理由来这样做。

我基本上必须回答certificate使用NUnit优先于MSTest是这样的:有没有什么我可以在NUnit中做的,我无法在MSTest中做类似的工作?

  • NUnit包含一个[TestCase]属性,允许实现参数化testing。 这在MSTest中不存在 – 它可以通过可扩展性来完成。
  • MsTest的ExpectedException属性有一个错误,即使它是错误的,预期的消息也不会真正被声明 – testing会通过。
  • NUnit附带一个Assert.Throws API,允许在特定的代码行上testingexception,而不是整个方法。 MSTest也有类似的function(由同一个人为NUnit执行),但不附带MSTest。
  • NUnit包含开箱即用的Assert API版本。 MSTest有这样做的第三方扩展,但没有与MSTest一起发货。
  • NUnit允许抽象类成为testing装置(所以你可以inheritancetesting装置)。 MsTest允许这样做,但将抽象类限制在一个程序集中。
  • NUnit允许非公共类作为testing装置(截至最新版本)
  • NUnit是为了unit testing而创build的。 MSTest是为testing而创build的,也是一些unit testing。
  • NUnit包含PNunit(使用NUnit运行并行testing)。 MSTest在可以通过XMLconfiguration的Visual Studio 2010中增加了这个function

罗伊,一堆你的信息已经过时了,特别是与2010年相关的信息。

Nunit包含允许实现参数化testing的[TestCase]属性。 这在MSTest中不存在

这可以在2010年使用unit testing的可扩展性来实现。

MSTest的ExpectedException属性有一个错误,即使它是错误的,预期的消息也不会真正被声明 – testing会通过。

纠正那还在那里

NUnit有一个Assert.Throws API允许在一个特定的代码行上testing一个exception,而不是整个方法(你可以很容易地自己实现这个)

Jim同时为MSTest创build了一个Assert.Throws版本,NUnit已经包含在后续版本中,MSTest还没有,尽pipe如此,仍然可以使用。

NUnit包含一个stream畅的Assert API版本(如前所述 – Assert.That ..)

其中有几个由第三方为MSTest实施

NUnit要快得多

看到杰米的评论,他已经设法让MSTest运行得更快:-)

NUnit可以在32位和64位运行testing(MSTest只能在32位IIRC运行)

不是在2010年,64位支持内置。

NUnit允许抽象类成为testing装置(所以你可以inheritancetesting装置)。 MsTest不。

这可行,但不会影响组件的使用限制。

NUnit允许非公共类作为testing装置(截至最新版本)

还在那儿

NUnit是为了unit testing而创build的。 MSTest是为testing而创build的,也是一些unit testing。

正确的说,MSTest和Nunit是一样的,但MSTest是一个广义的框架。

NUnit包含PNunit(使用NUnit运行并行testing)。 MSTest只会在2010年增加这个function

正确的是有一个XMLconfiguration设置,允许控制并行度。

NUnit拥有更丰富的断言API 。 例如,api特别优雅(stream畅,均匀)

Assert.That(Is.Unique, myResults); // assert: myResults is a collection of unique items 

如果你已经看到了JUnit的Hamcrest扩展,你会认识到这种风格。

它也有一套不断扩展的function ,例如性能testing和一个优秀的VS插件 。

我可以通过MSTest向你指出一些挫折的博客:

  • MSBuild,NAnt,NUnit,MSTest和挫败感
  • 用MSTest == FAIL清理构build服务器

公平的说,这些人正试图在非TFS构build服务器上设置MSTest。 他们的一些问题不会适用于您的情况。

我们主要是微软的商店,并使用TFS进行源代码pipe理。 但是,我们使用TeamCity进行持续集成。 我们喜欢它,它与TFS相当好地融合在一起。 我从来没有使用MSTest; 我们已经使用NUnit多年了,没有理由改变。

MSTest应该与Team Suite紧密集成,因为你的公司已经为此付出了昂贵的费用,这对于他们来说是有利的。

NUnit具有较less的供应商locking,并具有丰富的API。 正如serg10指出的,Assert.That语法特别强大和优雅。

最后,你可以编写好的unit testing,而不需要所有奇特的function。 其中一些甚至可能阻碍(这是xUnit.net背后的理论)。 我build议你的团队在一个testing框架上进行标准化; 避免在MSTest中有一些代码和NUnit中的其他代码。

我认为编写好的testing比你select的框架更重要。 考虑阅读unit testing的艺术:用.NET中的例子 ,写一些testing,然后看看MSTest是否足够满足你的团队的需求。

编辑:unit testing的附录B对微软的unit testing框架有一些很好的评论。 它提到YUnit是扩展MSTest有多繁琐的一个例子。 但是,由于集成的紧密性,作者确实build议MSTest用于Team System用户。

我在MsTest和NUnit之间有一个很好的方法。 您可以使用MSTest框架来运行您的testing(每个testing的TestClass属性和TestMethod属性),但使用NUnit Assert API。

只是这样做:

 using Microsoft.VisualStudio.TestTools.UnitTesting; using Assert = NUnit.Framework.Assert; 

现在你可以使用Assert.That(..),并且还有TFS自动构build和testing报告。 你的testing可以在VS,TestDriven.net或者Resharper中运行,没关系,testing会失败或者正确传递,失败的输出将按照NUnit框架。

看到这里: http : //alsagile.com/archive/2010/03/09/stop-the-war-between-nunit-and-mstest-make-them.aspx

  1. MSTesttesting运行者是非确定性的 ,这应该足以吓跑你使用它。 我无法使用集成testing运行器从TFS 2010持续运行MSTest; 它打破了跨项目构build和跨构build代理的几个不同的错误消息(并且不一致)。
  2. MSTest有时(不一致)中断,因为它泄漏内存 – 内存不足exception仍然发生在我们身上,即使使用最新版本的Visual Studio。 这个问题的解决方法是可怕的。
  3. 我有MSTest的其他小调查,并一般使用MSTest的一堆解决方法: http ://www.pseale.com/blog/TFSAsYourBuildCIServerOnlyPositiveTakeaways1Of2.aspx

我发现这个问题,因为我从MSTest切换到NUnit,因为我们不能相信我们的CI构build的结果,因为MSTest。 切换到NUnit将允许我们(最终)相信CI构build失败是真实的,而不是另一个MSTest故障。 这是真正的答案 – 只有使用NUnit(或其他非MSTesttesting运行器),我们才能相信我们的CI构build

我一直在TestDriven.Net 3.0中为MSTest提供一stream的支持。 在之前的版本中,MSTest支持非常基础(似乎很less有人使用MSTest)。

从TestDriven.Net 3.0 Beta 2开始,对MSTest的所有unit testing相关属性都有相当全面的支持。 甚至还支持使用DataSource属性的数据驱动testing。 您的testing也将以接近NUnit的速度执行!

如果你使用MSTest,那么当使用TestDriven.Net 3.0 Beta 2(或更高版本)执行任何unit testing时,我都会感兴趣。

请尝试您的MSTest项目,让我知道你如何得到: http : //www.testdriven.net/download.aspx

注意,它不支持DeploymentItem或HostType属性。 您可以使用“复制到输出目录”项目设置而不是DeploymentItem。

您可以更改NUnit中的代码,因为它是开源的。 你不能用MSTest做到这一点。

请参阅http://fluentassertions.codeplex.com 。 你可以做类似的东西

 "ABCDEFGHI".Should().StartWith("AB").And.EndWith("HI").And.Contain("EF").And.HaveLength(9); new[] { 1, 2, 3 }.Should().HaveCount(4, "because we thought we put three items in the collection")) dtoCollection.Should().Contain(dto => dto.Id != null); collection.Should().HaveCount(c => c >= 3); dto.ShouldHave().AllPropertiesBut(d => d.Id).EqualTo(customer); dt1.Should().BeWithin(TimeSpan.FromHours(50)).Before(dt2); Action action = () => recipe.AddIngredient("Milk", 100, Unit.Spoon); action .ShouldThrow<RuleViolationException>() .WithMessage("Cannot change the unit of an existing ingredient") .And.Violations.Should().Contain(BusinessRule.CannotChangeIngredientQuanity 

@Dave Hanna MS Test可以直接使用,因此只需要less一个组件就可以担心部署和保持更新。 它也通过devise与Visual Studio和其他Microsoft产品集成。

stream利的语法很好,但它不是function差异,所以我会忽略它。 更不用说,你可以在MS Test中使用扩展库。

性能。 99%的testing性能受到被测系统的控制,所以即使两个库的性能差异达到100%,也会导致整体性能的差异。

开放源代码与非开放源代码:使用开源库的好处是很小的。 频繁地将更改拉入中继线或者有足够的资源来更新修改的分支时,例外情况是例外。

你可以很容易地在Mono上运行Linux上的NUnittesting,我不认为你可以用MSTest进行testing。

请仔细阅读ExpectedExceptionAttribute文档,没有声明testingexception消息,所以它不是一个没有声明的错误。

第二个参数是断言消息当预期的exceptiontypes不被抛出时显示什么,而不是预期的exception消息。 即像Assert.IsTrue(condition,message)中的第二个参数。