nUnit vs xUnit?

时间:2012-03-19 11:07:41

标签: c# .net nunit xunit

nUnitxUnit.net之间的差异在哪里? 开发其中两个有什么意义,不仅仅是一个?

我读过xUnit是由nUnit的发明者开发的:

  

xUnit.net是.NET Framework的单元测试工具。 撰写   NUnit的原始发明者

另一方面:

  

NUnit是所有.Net语言的单元测试框架   当前的产品版本2.6,是第七个主要版本   这个基于xUnit的单元测试工具

那么事实在哪里?

5 个答案:

答案 0 :(得分:23)

答案有点旧,所以我决定提供更新: 在撰写本回答时,最新的NUnit版本是v3.5,xUnit.net是v2.1

这两个框架都很棒,它们都支持并行测试运行(不同的方式), NUnit 自2002年以来一直存在,它被广泛使用,文档齐全,并且一个庞大的社区,而 xUnit.net 更现代化,更具TDD,更具可扩展性,也是.net核心开发的趋势。它也有很好的记录。

除此之外,我注意到的主要区别是xUnit.net运行测试方法的方式。所以,在 NUnit 中,我们有一个测试类和一组测试方法。 NUnit创建测试类的新实例,然后从同一实例运行所有测试方法。而 xUnit.net为每个测试方法创建测试类的新实例。。因此,不能使用字段或属性在测试方法之间共享数据,这是一种不好的做法,因为我们的测试方法将相互依赖,这在TDD中是不可接受的。因此,如果您使用xunit.net,您可以确保您的测试方法完全隔离。

如果您愿意在测试方法中分享一些数据,xUnit会允许您这样做。因此,默认情况下,所有测试方法都是完全隔离的,但您可以在特定情况下故意破坏此隔离。我喜欢这种态度,这就是为什么我更喜欢它。

根据提到的关于测试类实例化的不同之处并行测试运行功能在2个框架中的工作方式不同。在NUnit.net中,单个类的测试方法将在单个线程中运行(不是并行),但它在单独的线程中运行每个类的测试。而xUnit.net在并行性方面没有限制,因为它为每个测试方法创建一个新实例。

答案 1 :(得分:21)

您将单个工具(xUnit.net)的名称与一整套单元测试框架(xUnit的名称, x 的名称混淆在一起语言/环境,例如JUnit,NUnit,......)。

答案 2 :(得分:1)

xUnit优点: xUnit遵循新概念,避免使用旧的“SetUp”和“TearDown”方法。它迫使我们使用IDisposable和构造函数,因为我们应该像.NET开发人员一样。 xUnit也有明确的上下文共享概念。

xUnit缺点: 获取测试上下文的可用性尚未实现。

答案 3 :(得分:1)

xUnit的一个好处是它可以在不同的类中找到测试,它可以并行运行。如果您有许多测试用例,这可以节省大量时间。

你当然可以关闭它,或者控制它的操作(线程数,每个类的线程数,每个程序集的测试数等等)

查看此sample solution with two test projects, one using xUnit the other NUnit

您可以在xUnit here

中阅读有关并行测试的更多信息

答案 4 :(得分:0)

让我从 XUnit (2.x) 切换到 NUnit (3.x) 的一个特性是:

XUnit 不适用于 Console.WriteLine(),而 NUnit 可以。

当我发现没有简单的方法让 Console.WriteLine 在 XUnit 中工作时,我无法形容我有多沮丧,尤其是当我试图让一小段代码工作时。

我认为这是一个标准的基准用户案例,您应该始终使标准输出与您的测试框架一起工作。我知道这不是一个好习惯,我知道还有其他选择,比如输出处理程序和其他东西。尝试 Console.WriteLine 的用户尤其是新用户,未能将任何内容打印到屏幕上是非常非常令人失望和沮丧的。