NUnit和xUnit.net有什么区别?开发两个而不是一个有什么意义?
我读到 xUnit 是由 NUnit 的发明者开发的:
xUnit.net 是 .NET Framework 的单元测试工具。 由 NUnit的原始发明者编写
另一方面:
NUnit 是一个适用于所有 .Net 语言的单元测试框架。当前的生产版本 2.6 版是这个基于 xUnit 的单元测试工具的第七个主要版本
那么真相在哪里?
在撰写此答案时,最新的 NUnit 版本是 v3.5,xUnit.net 是 v2.1。
这两个框架都很棒,它们都支持并行测试运行(尽管方式不同)。NUnit自 2002 年以来一直存在,它被广泛使用、有据可查并拥有一个庞大的社区,而xUnit.net更现代、更符合 TDD、更可扩展,并且在 .NET Core 开发中也是趋势。它也有据可查。
除此之外,我注意到的主要区别是 xUnit.net 运行测试方法的方式。因此,在NUnit中,我们有一个测试类和一组测试方法。NUnit 创建一个新的测试类实例,然后从同一个实例运行所有的测试方法。而xUnit.net 为每个测试方法创建一个新的测试类实例。因此,不能使用字段或属性在测试方法之间共享数据,这是一种不好的做法,因为我们的测试方法会相互依赖,这在 TDD 中是不可接受的。因此,如果您使用 xunit.net,您可以确定您的测试方法是完全隔离的。
如果您愿意在您的测试方法之间共享一些数据,xUnit 会让您这样做。因此,默认情况下,所有测试方法都是完全隔离的,但您可以在特定情况下有意打破这种隔离。我喜欢这种态度,这就是为什么我更喜欢它。
xUnit 优点:
xUnit 通过避免旧的“SetUp”和“TearDown”方法遵循了一个新概念。它迫使我们像 .NET 开发人员一样使用 IDisposable 和构造函数。xUnit 也有明确的上下文共享概念。
xUnit 缺点:
获取测试上下文的可用性尚未实现。
xUnit 的一个好处是它可以在不同的类中找到测试并并行运行它们。如果您有很多测试用例,这可以节省大量时间。
您当然可以关闭它,或控制它的操作(线程数、每个类的线程、每个程序集的测试等)。
使用两个测试项目查看此示例解决方案,一个使用 xUnit,另一个使用 NUnit。
您可以在此处阅读有关 xUnit 中并行测试的更多信息。
有一个特性让我从 XUnit (2.x) 切换到 NUnit (3.x),那就是:
XUnit 不适用于Console.WriteLine()
,而 NUnit 可以。
当我发现在 XUnit 中工作没有简单的方法时,我无法形容我有多沮丧Console.WriteLine
,尤其是当我试图让一小段代码工作时。
我认为这是一个标准的基准用户案例,您应该始终使标准输出与您的测试框架一起工作。我知道这不是一个好习惯,我知道还有其他选择,比如输出处理程序和其他东西。尝试Console.WriteLine
的用户尤其是新用户,未能将任何内容打印到屏幕上是非常非常令人失望和沮丧的。