NUnit与MbUnit与MSTest与xUnit.net


390

.NET有很多单元测试框架。我发现了这个小的功能比较:http : //xunit.github.io/docs/comparisons.html

现在,我要为我们选择最佳的。但是如何?有关系吗?哪一个是最有前途的证据,并且其发展势头良好?我应该关心这些功能吗?虽然xUnit似乎是最现代的并且是专门为.NET设计的,但NUnit似乎再次被广泛接受。MSTest再次已经集成到Visual Studio中...


11
该比较表已过期数年。例如,NUnit还具有Assert.Throws等,并且Assertions表中的所有内容都是旧的API。新的Assert.That(...,Is ....)流利的语法要好得多,并且已经存在了一段时间。
Jim Cooper

11
您是否知道任何最新的表格?
2011年

1
2013年末,从xUnit.net => NUnit迁移。还要注意xUnit.NET(项目)!= xUnit(类别,NUnit是成员)
DeepSpace101 2013年

3
@Sid为什么离开xUnity.net => NUnit?
亚历山大·洛格

Answers:


197

我知道这是一个旧线程,但是我想我应该对xUnit.NET投一个票。尽管提到的大多数其他测试框架几乎都相同,但是xUnit.NET采取了一种非常独特,现代且灵活的单元测试方法。它改变了术语,因此您不再定义TestFixtures和Tests……您可以指定关于代码的事实和理论,从TDD / BDD的角度来看,它与测试的概念更好地集成在一起。

xUnit.NET也非常可扩展。它的FactAttribute和TraitAttribute属性类不是密封的,并提供可重写的基本方法,使您可以控制如何执行这些属性修饰的方法。尽管xUnit.NET以其默认形式允许您编写与NUnit测试治具及其测试方法相似的测试类,但您完全不受限于这种形式的单元测试。你可以自由地扩展以支持BDD风格的关注/背景/观察规格的框架,描绘了这里

xUnit.NET还通过其Theory属性和相应的数据属性直接支持即装即用型测试。适合的输入数据可以从excel,数据库甚至是自定义数据源(如Word文档)(通过扩展基本数据属性)加载。这使您可以利用单个测试平台进行单元测试和集成测试,在减少产品依赖性和所需的培训方面可以发挥巨大作用。

其他测试方法也可以使用xUnit.NET实施...可能性是无限的。结合另一个非常具有前瞻性的模拟框架Moq,两者共同创建了一个非常灵活,可扩展且功能强大的平台,用于实施自动化测试。


35
尽管一年多前确实如此,但是NUnit自此添加了大多数有问题的属性。在NUnit中,您可以使用任何一种方式编写测试。
Mark Levison

8
与其说哪些属性可用,不如说是如何使用它们。xUnit.NET是从头开始设计的,是一个高度灵活且可扩展的框架,它不会将您锁定在任何特定的测试方法中,并且不需要您定期更新核心框架以获取最新功能。
jrista 2010年

9
1.属性上明显不同的名称没有多大意义。2. NUnit是可扩展的,并且继续可扩展:3. nunit支持用于测试的数据行参数。以前,它们在扩展中受支持:) 4. Nunit与Moq结合可以创建相同的东西。5.对于BDD,我要说说specflow,它可以轻松地与许多单元测试框架集成。
涂鸦

8
我喜欢xUnit的声音,但是它具有zilch文档:(
Panic Panic

10
xUnit没有任何文档!例如:尝试找出Trait真正的功能,或者是否可以将不同的测试归入单个父级测试中(例如,全部tests包含在中testfixture)。nUnit创建了一个很好的层次结构视图,而不是xUnit的测试平面视图。再加上术语没有意义-事实和理论?现实点!这些更好地称为测试和数据。
DeepSpace101 2012年

134

NUnit可能是第3方工具最受支持的。它也比其他三个更长。

我个人不太关心单元测试框架,模拟库更重要(恕我直言)(并且将您锁定在更多内容中)。只需选择一个并坚持下去即可。


3
您最喜欢的模拟库是什么?
dplante

31
我喜欢起订量,RhinoMocks也很好。
亚历山大·科耶夫尼科夫2009年

5
检查Pex和Moles也可能值得,因为痣部分对于嘲笑特别有用。
Charles Prakash Dasari

4
具有FakeItEasy的MSPec ...使测试用例更具可读性
Robie

5
我选择了带有NSubstitute和AutoFixture的MSpec。
Daniel Hilgarth 2012年

108

我不会选择MSTest。尽管它可能是Microsoft支持的框架的最新证明,但它并不是最灵活的解决方案。没有一些技巧,它就不会独立运行。因此,很难在不安装Visual Studio的情况下在TFS以外的其他生成服务器上运行它。实际上,Visual Studio测试运行程序要比Testdriven.Net +其他任何框架都要慢。并且由于此框架的版本与Visual Studio的版本相关,因此更新较少,如果必须使用较旧的VS,则必须与较旧的MSTest绑定。

我认为您使用哪个其他框架并不重要。从一个切换到另一个真的很容易。

我个人根据同事的喜好使用XUnit.Net或NUnit。NUnit是最标准的。XUnit.Net是最精简的框架。


36
我一直被拖着脚踢并尖叫到这个相同的结论。我真的想使用MSTest,因为它与Visual Studio集成在一起,但这也是它的弱点。我需要在非Microsoft构建服务器上运行测试,并且没有办法只是为了得到它而在上面安装Visual Studio。遗憾的是,Microsoft生产了出色的工具,然后又使它们几乎无法实现。
Tim Long 2010年

11
+1表示糟糕的MSTest。归根结底,使用哪个单元测试框架都没有关系,只要不使用MSTest即可
-Mike Mooney

21

考虑用另一个测试框架补充而不是替换MSTest。您可以保持Visual Studio MSTest集成,同时获得功能更强大的测试框架的好处。

例如,我将xUnit与MSTest一起使用。添加对xUnit.dll程序集的引用,然后执行类似的操作。令人惊讶的是,它行之有效!

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Assert = Xunit.Assert;  // <-- Aliasing the Xunit namespace is key

namespace TestSample
{
    [TestClass]
    public class XunitTestIntegrationSample
    {
        [TestMethod]
        public void TrueTest()
        {
            Assert.True(true);  // <-- this is the Xunit.Assert class
        }

        [TestMethod]
        public void FalseTest()
        {
            Assert.False(true);
        }
    }
}

这项技术也可能适用于NUnit,MBUnit或其他答案中提到的其他测试框架,但我还没有尝试过。
马特·克劳奇

1
您认为我可以通过这种方法使参数化测试与MSTest一起使用吗?
DevDave 2013年

@DevDave否。在他的示例中,他只是使用了另一个程序集中的类。如果要进行参数化测试,则需要专门构建用于扩展MSTest的另一个测试框架。
zoran404

3
Suprisingly, it just works!您只是从另一个程序集中调用了静态函数。您为什么对它起作用感到惊讶?另外,如果您只需要断言为什么不使用为此专门制造的程序集?
zoran404 '18

9

Nunit在C ++中的混合模式项目中不能很好地工作,所以我不得不放弃它


3
我对这个答案并不感到骄傲,但是我放弃了该项目的单元测试。我使出写了很多的验证程序运行时检测错误的
埃里克

2
我希望在混合模式下使用NUnit,但也发现它不够用,最后我选择了googletest,它是一个出色的C ++单元测试框架,可以轻松设置。
chillitom

8

在小规模/个人规模上这没什么大不了的,但是在较大规模上它可以迅速变成更大的事情。我的老板是一家大型的Microsoft商店,但出于多种原因,我不会/不能购买Team System / TFS。当前,我们使用Subversion + Orcas + MBUnit + TestDriven.NET,它运行良好,但是获取TD.NET却是一个巨大的麻烦。MBUnit + TestDriven.NET的版本敏感性也是一个很大的麻烦,并且拥有一个额外的商业物品(TD.NET)来进行法律审查和采购以进行处理和管理也不是一件容易的事。我的公司像许多公司一样,对MSDN订阅模型感到满足并感到满意,它只是不习惯于为数百名开发人员处理一次性采购。换句话说,在我看来,完全集成的MS产品虽然不一定总能达到最佳效果,但却是一项重大的增值服务。

我认为我们会坚持目前的步骤,因为它可以正常工作,而且我们已经在组织上克服了困难,但是我确实希望MS在此领域提供出色的产品,以便我们可以稍微巩固和简化我们的开发人员体系。


2
ReSharper在这个领域确实提供了引人注目的产品!
松鼠2009年

7
您的答案很奇怪,而且似乎自相矛盾。您说您是一家大型的Microsoft商店,但不会使用TFS(这很重要-没有它,您将无法获得垂直集成的好处),而是使用MSDN订阅模型,但使用的是非-MS方法。老实说,我迷路了。不幸的是,答案太过时了。
nicodemus13 2012年

6

这没什么大不了的,在它们之间切换很容易。集成的MSTest也没什么大不了的,只需抓住testdriven.net。

就像之前的人说的选择一个模拟框架一样,目前我最喜欢的是Moq。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.