单元测试 - xunit 与其他框架的比较
属性#
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
常用属性#
以下是 xUnit 中常用的属性:
- [Fact]:
• 用于标记一个简单的测试方法,不需要参数。 - [Theory]:
• 用于标记一个参数化的测试方法,可以接受多个数据集。 - [InlineData]:
• 用于直接在代码中提供测试数据。
[Theory]
[InlineData(1, 2, 3)]
[InlineData(4, 5, 9)]
public void TestMethod(int a, int b, int expected)
{
Assert.Equal(expected, a + b);
}
- [ClassData]:
• 用于从类中提供测试数据。
public class TestData : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[] { 1, 2, 3 };
yield return new object[] { 4, 5, 9 };
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
[Theory]
[ClassData(typeof(TestData))]
public void TestMethod(int a, int b, int expected)
{
Assert.Equal(expected, a + b);
}
- [MemberData]:
• 用于从类的属性或方法中提供测试数据。
public static IEnumerable<object[]> TestData =>
new List<object[]>
{
new object[] { 1, 2, 3 },
new object[] { 4, 5, 9 }
};
[Theory]
[MemberData(nameof(TestData))]
public void TestMethod(int a, int b, int expected)
{
Assert.Equal(expected, a + b);
}
- [JsonFileData]:
• 自定义属性,用于从 JSON 文件中读取测试数据。
[Theory]
[JsonFileData("path/to/jsonfile.json")]
public void TestMethod(string userGuid, bool isOwner)
{
// 测试代码
}
来源#
作者:【唐】三三
出处:https://www.cnblogs.com/tangge/p/17541082.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2015-07-10 Bootstrap – 1.认识
2013-07-10 jQuery - 5.样式操作