c# - xUnit.net 中的测试参数化类似于 NUnit

标签 c# .net unit-testing nunit xunit.net

xUnit.net框架中有没有类似NUnit的以下特性的方法?

[Test, TestCaseSource("CurrencySamples")]
public void Format_Currency(decimal value, string expected){}

static object[][] CurrencySamples = new object[][]
{
    new object[]{ 0m, "0,00"},
    new object[]{ 0.0004m, "0,00"},
    new object[]{ 5m, "5,00"},
    new object[]{ 5.1m, "5,10"},
    new object[]{ 5.12m, "5,12"},
    new object[]{ 5.1234m, "5,12"},
    new object[]{ 5.1250m, "5,13"}, // round
    new object[]{ 5.1299m, "5,13"}, // round
}

这将在 NUnit GUI 中生成 8 个独立的测试

[TestCase((string)null, Result = "1")]
[TestCase("", Result = "1")]
[TestCase(" ", Result = "1")]
[TestCase("1", Result = "2")]
[TestCase(" 1 ", Result = "2")]
public string IncrementDocNumber(string lastNum) { return "some"; }

这将生成 5 个单独的测试并自动比较结果 (Assert.Equal())。

[Test]
public void StateTest(
    [Values(1, 10)]
    int input,
    [Values(State.Initial, State.Rejected, State.Stopped)]
    DocumentType docType
){}

这将生成 6 个组合测试。无价之宝。

几年前,我试用了 xUnit 并喜欢上了它,但它缺少这些功能。没有他们就活不下去。有什么变化吗?

最佳答案

xUnit提供了一种通过称为数据理论的东西运行参数化测试的方法。该概念等同于 NUnit 中的概念,但开箱即用的功能并不完整。

这是一个例子:

[Theory]
[InlineData("Foo")]
[InlineData(9)]
[InlineData(true)]
public void Should_be_assigned_different_values(object value)
{
    Assert.NotNull(value);
}

在此示例中,每次将指定值作为参数传递时,xUnit 将为每个 InlineDataAttribute 运行一次 Should_format_the_currency_value_correctly 测试。

数据理论是一个扩展点,您可以使用它来创建运行参数化测试的新方法。完成此操作的方法是创建新属性,这些属性检查并可选择根据测试方法的参数和返回值采取行动。

您可以在 AutoFixture 中找到关于如何扩展 xUnit 的数据理论的一个很好的实例。的 AutoDataInlineAutoData理论。

关于c# - xUnit.net 中的测试参数化类似于 NUnit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9110419/

相关文章:

c# - 异步可插入协议(protocol)

c# - User32.dll ToUnicodeEx函数的使用

c# - 以优雅的方式使用多态性进行碰撞检测

python - 模拟补丁功能

c# - 如何通过 Expression.Lambda<Func<T,propertyInfo.DeclaringType>> 实现值 getter

C# XAML MVVM Treeview 控件数据绑定(bind)

.net - CLR SQL 程序集 : Get the Bytestream?

ruby - 如何对严重依赖于其他类的类进行单元测试?

c# - 为单元测试 stub ASP.NET Page.Form

c# - 使用 FromUri 将复杂对象传递给 ASP.NET Web API