不同条件下的单元重复测试组



我刚刚开始使用NUnit进行测试,我在"单元测试的艺术"中读到关于保持测试自包含和通过测试代码的单一路径的建议。

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

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

显然,我可以添加"初始条件"作为测试参数,但这样我就有20个测试,而我真正想要的是在条件a中进行10次测试,然后在条件b中进行相同的10次测试。是否有一种公认的方法可以以更结构化的方式重复测试,这样我就不必列出每个组合?

我建议查看一下NUnit的TestCaseSource和TestCaseData类。

这允许您提供将在每次测试运行中实例化的类型。从这里开始,您可以组合提供测试数据的类。我以前在"Scenario"类中成功地看到过这一点。

你可以使用NUnit Theory:

  • DatapointDatapoints相当于输入集:

理论数据

理论的主要数据源是一个或多个数据点属性。NUnit将使用所需类型的任何字段,它们是用其中一个属性进行注释,为每个属性提供数据理论参数。NUnit组装individual的值参数组合,为理论提供测试用例。

除了datpoint和datpoints属性之外,还有可能使用任何一种方法来提供可识别的数据正常参数化测试。我们建议不要有这种能力过度使用,因为它与测试之间的区别背道而驰以实例和理论为基础。然而,它可能是有用的,以便保证包含一个特定的测试用例。

  • 假设相当于初始条件:

理论本身负责确保提供的所有数据满足它的假设。它是通过假设来做到这一点的。构造,它的工作原理与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));
    }
}

最新更新