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

问题描述 投票:0回答:2

有没有办法在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
2个回答
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)

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


0
投票

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

至于生成的值,只有在不产生随机性时才应使用它们。例如,它可能是:

  • 输入对当前测试无关紧要的地方;
  • 进行身份检查时的情况 - 验证结果是否显示相同的值;在这种情况下,您对价值究竟是什么并不感兴趣。
© www.soinside.com 2019 - 2024. All rights reserved.