单元测试 - xunit

发布时间 2023-07-10 14:29:06作者: 【唐】三三

属性

NUnit 3.x MSTest 15.x xUnit.net 2.x 评论
[Test] [TestMethod] [Fact] 标记测试方法。
[TestFixture] [TestClass] 不适用 xUnit.net 不需要测试类的属性;它在程序集中的所有公共(导出)类中查找所有测试方法。
Assert.That
Record.Exception [ExpectedException] Assert.Throws
Record.Exception xUnit.net 取消了 ExpectException 属性,转而使用 。见注1Assert.Throws
[SetUp] [TestInitialize] 构造 函数 我们认为使用通常是不好的。但是,您可以将无参数构造函数实现为直接替换。见注2[SetUp]
[TearDown] [TestCleanup] IDisposable.Dispose 我们认为使用通常是不好的。但是,您可以实现为直接替换。见注2[TearDown]``IDisposable.Dispose
[OneTimeSetUp] [ClassInitialize] IClassFixture<T> 要获得每个类的夹具设置,请在测试类上实现。见注3IClassFixture<T>
[OneTimeTearDown] [ClassCleanup] IClassFixture<T> 要获得每个类的夹具拆卸,请在测试类上实现。见注3IClassFixture<T>
不适用 不适用 ICollectionFixture<T> 若要获取每个集合的夹具设置和拆卸,请在测试集合上实施。见注3ICollectionFixture<T>
[Ignore("reason")] [Ignore] [Fact(Skip="reason")] 在属性上设置 Skip 参数以暂时跳过测试。[Fact]
[Property] [TestProperty] [Trait] 在测试上设置任意元数据
[Theory] [DataSource] [Theory]
[XxxData] 理论(数据驱动测试)。见注4

属性注释

注1:长期使用已经发现了它的各种问题。首先,它没有具体说明哪一行代码应该引发异常,这允许微妙且难以跟踪的故障显示为通过测试。其次,它不提供完全检查异常本身详细信息的机会,因为处理超出了测试的正常代码流。 允许您测试一组用于引发异常的特定代码,并在成功期间返回异常,以便您可以针对异常实例本身编写进一步的断言。[ExpectedException]``Assert.Throws

注2:xUnit.net 团队认为,每个测试的设置和拆卸会产生难以遵循和调试的测试代码,通常会导致在运行每个测试之前运行不必要的代码。有关详细信息,请参阅 http://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html

注 3:xUnit.net 提供了一种使用 and 接口来思考每个灯具数据的新方法。运行器将创建夹具数据的单个实例,并在运行每个测试之前将其传递给构造函数。所有测试共享相同的夹具数据实例。运行完所有测试后,运行器将处理夹具数据(如果它实现了 )。有关更多信息,请参阅共享上下文IClassFixture<T>``ICollectionFixture<T>``IDisposable

注4:xUnit.net 附带对称为理论的数据驱动测试的支持。用属性(而不是 )标记测试,然后使用一个或多个属性(包括 和 )修饰测试。有关更多信息,请参阅入门[Theory]``[Fact]``[XxxData]``[InlineData]``[MemberData]

断言

NUnit 使用约束模型。所有断言都以约束开头,后跟约束。在下表中,我们比较了 NUnit 约束、MSTest 断言和 xUnit 断言。Assert.That

NUnit 3.x (约束) MSTest 15.x xUnit.net 2.x 评论
Is.EqualTo AreEqual Equal MSTest 和 xUnit.net 支持此方法的通用版本
Is.Not.EqualTo AreNotEqual NotEqual MSTest 和 xUnit.net 支持此方法的通用版本
Is.Not.SameAs AreNotSame NotSame
Is.SameAs AreSame Same
Does.Contain Contains Contains
Does.Not.Contain DoesNotContain DoesNotContain
Throws.Nothing 不适用 不适用 确保代码不会引发任何异常。见注5
不适用 Fail 不适用 xUnit.net 替代方案:Assert.True(false, "message")
Is.GreaterThan 不适用 不适用 xUnit.net 替代方案:Assert.True(x > y)
Is.InRange 不适用 InRange 确保值在给定的包含范围内
Is.AssignableFrom 不适用 IsAssignableFrom
Is.Empty 不适用 Empty
Is.False IsFalse False
Is.InstanceOf<T> IsInstanceOfType IsType<T>
Is.NaN 不适用 不适用 xUnit.net 替代方案:Assert.True(double.IsNaN(x))
Is.Not.AssignableFrom<T> 不适用 不适用 xUnit.net 替代方案:Assert.False(obj is Type)
Is.Not.Empty 不适用 NotEmpty
Is.Not.InstanceOf<T> IsNotInstanceOfType IsNotType<T>
Is.Not.Null IsNotNull NotNull
Is.Null IsNull Null
Is.True IsTrue True
Is.LessThan 不适用 不适用 xUnit.net 替代方案:Assert.True(x < y)
Is.Not.InRange 不适用 NotInRange 确保值不在给定的包含范围内
Throws.TypeOf<T> 不适用 Throws<T> 确保代码引发确切的异常

属性注释

注5:旧版本的 xUnit.net 提供了一个后来被删除的。它揭示了自己是一种反模式;每一行代码本身都是一个隐式的“不抛出”检查,因为任何抛出的异常都会导致测试失败。简单地“不抛出”通常不足以验证,因此预计会存在其他断言。Assert.DoesNotThrow

来源