NUnit - 在不同条件下重复测试组

时间:2015-08-10 16:55:00

标签: unit-testing nunit

我刚刚开始使用NUnit进行测试,并且我已经阅读了“单元测试艺术”中关于保持测试自包含以及通过测试代码的单一路径的建议。

我已成功使用参数化测试为函数创建10个测试,但现在我想在稍微不同的条件下重复相同的测试 - 即改变一个不是测试参数但使用相同输入和期望的变量相同的结果。如果我没有使用测试框架,它将是一个嵌套循环:

for each initial condition
    for each set of inputs
        run the test
    end loop
end loop

显然我可以添加“初始条件”作为测试参数,但之后我会进行20次测试,而我真正想要的是条件A中的10次测试然后条件B中的10次测试是否有公认的方法以更有条理的方式重复测试,所以我不必列出每个组合?

2 个答案:

答案 0 :(得分:1)

我建议查看NUnit's TestCaseSource和TestCaseData类。

这允许您提供将在每次测试运行时实例化的类型。从这里,您可以组合提供测试数据的类。我之前已经看到过这种方式已成功完成了#34; Scenario"类。

答案 1 :(得分:0)

您可以使用NUnit Theory

  • DatapointDatapoints相当于输入集
  

理论数据

     

理论的主要数据来源是Datapoint或Datapoints   属性。 NUnit将使用所需类型的任何字段   使用其中一个属性进行注释,为每个属性提供数据   理论参数。 NUnit汇集了个人的价值观   组合论证为理论提供测试案例。

     

除了Datapoint和Datapoints属性之外,还有可能   使用任何方法提供可识别的数据   正常的参数化测试。我们建议不要这样做   过度使用,因为它与测试之间的区别背道而驰   基于实例和理论。但是,它可能是有用的   保证包含特定的测试用例。

  • 假设相当于初始条件
  

<强>假设

     

理论本身有责任确保提供所有数据   符合其假设。它是通过使用Assume.That(...)来做到这一点的。   构造,它像Assert.That(...)一样工作,但不会导致   失败。如果特定测试不满足该假设   case,该案例返回Inconclusive结果,而不是Success   或失败。

     

对一组测试用例执行理论的总体结果是   确定如下:

     
      
  • 如果所有测试用例都违反了这些假设,那么理论本身就会被标记为失败。
  •   
  • 如果任何断言失败,理论本身就会失败。
  •   
  • 如果至少有一些案件通过了规定的假设,并且没有断言失败或例外,则理论通过。
  •   

NUnit网站的代码示例:

public class SqrtTests
{
    [Datapoint]
    public double zero = 0;

    [Datapoint]
    public double positive = 1;

    [Datapoint]
    public double negative = -1;

    [Datapoint]
    public double max = double.MaxValue;

    [Datapoint]
    public double infinity = double.PositiveInfinity;

    [Theory]
    public void SquareRootDefinition(double num)
    {
        Assume.That(num >= 0.0 && num < double.MaxValue);

        double sqrt = Math.Sqrt(num);

        Assert.That(sqrt >= 0.0);
        Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
    }
}