【问题标题】:XUnit - Mixing theory data mechanisms, input and expected dataXUnit - 混合理论数据机制、输入和预期数据
【发布时间】:2019-08-13 08:47:14
【问题描述】:

在使用 XUnit 创建 Theory 测试用例时,我希望能够同时包含每个用例的参数和预期结果。我使用了 InlineData 属性,但是对于繁重的配置加载,这不是最佳的,并且不允许重用。

[InlineData(1,2,3,4,5,6,7,...)]

因此,我已将测试配置移到单独的类中,现在使用 MemberData 和 MemberType 加载它们。

[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Configuration config)
{
    ...
}

但是,这不允许我像使用基本标签时那样指定预期结果,即

[InlineData("Input1", "Input2", "Input3", "ExpectedResult")]

我不想在配置数据中包含预期结果,因为这将在多个测试中重复使用。

有没有人解决这个挑战?

因此,潜在的挑战是拥有复杂的测试数据,可以在多个地方使用,但又想要分离预期的结果。因此,在计算器(不好的例子)中,您可以拥有作为测试数据的数字列表。然后可以将这些传递到加法或乘法或减法测试中。这是我想要分离输入和预期输出数据的地方。

【问题讨论】:

  • 不打算积极关闭 ;) 话虽如此,我认为您的难题有答案 - 如果您的问题不同,请告诉我,我很乐意重新打开
  • 嗨鲁本,不完全是。我已经在使用复杂类型,我想做的是在测试之间重用测试数据,而不是重复。尽管这需要不同的断言和预期的结果。所以问题更多是关于将复杂的配置数据与简单的预期结果混合在一起。我更新了问题的最后一段以反映这一点。
  • 半相关:stackoverflow.com/questions/22093843/…(按上述重新打开)
  • 一般来说,我会创建一个产生对象[]的成员数据,但在内部将其分解为输入+结果的生成器,即for (inputs,out) in expecteds -> yield appendarray( inputs, output)
  • 你为什么不直接创建一个单独的方法,比如DataClass.Test1,它在内部从帮助类调用Data 方法,并将它与特定测试的预期结果结合起来?这样您就可以重用您的Data,同时更改每次测试的预期结果。或者我只是没明白你的意思。

标签: c# xunit xunit.net


【解决方案1】:

这里有一个建议:

  1. 创建一个类来生成测试数据:
    internal static class TestData
    {
        public static IList<T> Get<T>(int count = 10)
        {
            // I'm using NBuilder here to generate test data quickly.
            // Use your own logic to create your test data.
            return Builder<T>.CreateListOfSize(count).Build();
        }
    }

现在,您的所有测试类都可以利用它来获取相同的测试数据集。所以,在你的数据类中,你会做一些类似于

public class DataClass
{
    public static IEnumerable<object[]> Data()
    {
         return new List<object[]>
                {
                    new object[] { TestData.Get(), this.ExpectedResult() }
                };
    }
} 

现在您可以按照原来的方法进行:

[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Data input, Configuration expected)
{
    ...
}

如果您的测试没有改变输入数据,您可以将它们收集到一个夹具中并通过构造函数注入输入数据。这将加快测试速度,因为您不必为每个测试生成输入数据。查看shared context了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多