【问题标题】:Using xunit to generate multiple test cases with integer range使用 xunit 生成多个整数范围的测试用例
【发布时间】:2019-08-18 04:48:39
【问题描述】:

有没有办法在 xUnit 中自动生成多个测试用例?还是我注定将每个可能的输入都指定为InlineData

在下面的示例中,在 NCrunch 或 VS 测试运行程序中,它看起来像一个随机数被传递给测试。因此,每次运行测试时,它都有可能通过,尽管它应该会失败。

在 NUnit 中,Range 属性实际上根据https://github.com/nunit/docs/wiki/Range-Attribute 生成测试用例的多个排列

public bool RangeTest(int input)
{

    if (input > 10)
    {
        return false;
    }

    return true;
}

[Theory]
[AutoMockData]
public void RangeTestCase([Range(0, 11)] int test)
{
    var result = RangeTest(test);      

    Assert.True(result);
}

【问题讨论】:

    标签: c# xunit xunit.net autofixture


    【解决方案1】:

    下面是如何进行测试的一个很好的解释: https://andrewlock.net/creating-parameterised-tests-in-xunit-with-inlinedata-classdata-and-memberdata/ 在您的情况下,您必须创建一个专用的数据类,它将返回测试日期;

    public class GetTestData : IEnumerable<Int32>
    {
     public IEnumerator<Int32> GetEnumerator()
     {
        yield return 1;
        yield return 2;
        yield return 3;
        yield return 4;
    
       IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
     }
    }
    

    类的用法是:

    [Theory]
    [ClassData(typeof(GetTestData ))]
    public bool RangeTest(int input)
    

    但是对于测试来说,只测试边缘情况是个好主意。您必须避免测试中的随机性。

    【讨论】:

      【解决方案2】:

      AutoFixture 不提供开箱即用的此类功能。有一种方法可以通过创建自定义DataAttribute 来做到这一点,但正如周围的答案所强调的那样,您不应该这样做。这听起来很矛盾,但是在使用 AutoFixture 时应该避免随机性。您仍然应该使用多个实例检查边界值,例如InlineAuto[Moq]Dataattribute,因此每次都可以预见地失败/通过。

      对于生成的值,它们应该只在不会导致随机性的情况下使用。例如,它可能是:

      • 输入对当前测试无关紧要的地方;
      • 当您进行身份检查时的场景 - 您确认 same 值作为结果出现;在这种情况下,您对确切的值不感兴趣。

      【讨论】:

        猜你喜欢
        • 2022-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2019-06-09
        • 2017-08-31
        • 1970-01-01
        • 2022-06-12
        相关资源
        最近更新 更多