使用xunit生成整数范围的多个测试用例

时间:2019-03-27 14:54:40

标签: c# xunit xunit.net autofixture

是否可以在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);
}

2 个答案:

答案 0 :(得分:0)

以下是进行测试的一个很好的解释: 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)

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

答案 1 :(得分:0)

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

对于生成的值,仅在不引起随机性的情况下才应使用它们。例如,可能是:

  • 对于当前测试输入无关紧要的地方;
  • 进行身份检查时的情况-验证结果是否显示相同值;在这种情况下,您对确切的值不感兴趣。