我刚刚开始使用NUnit进行测试,并且我已经阅读了“单元测试艺术”中关于保持测试自包含以及通过测试代码的单一路径的建议。
我已成功使用参数化测试为函数创建10个测试,但现在我想在稍微不同的条件下重复相同的测试 - 即改变一个不是测试参数但使用相同输入和期望的变量相同的结果。如果我没有使用测试框架,它将是一个嵌套循环:
for each initial condition
for each set of inputs
run the test
end loop
end loop
显然我可以添加“初始条件”作为测试参数,但之后我会进行20次测试,而我真正想要的是条件A中的10次测试然后条件B中的10次测试是否有公认的方法以更有条理的方式重复测试,所以我不必列出每个组合?
答案 0 :(得分:1)
我建议查看NUnit's TestCaseSource和TestCaseData类。
这允许您提供将在每次测试运行时实例化的类型。从这里,您可以组合提供测试数据的类。我之前已经看到过这种方式已成功完成了#34; Scenario"类。
答案 1 :(得分:0)
您可以使用NUnit Theory:
Datapoint
和Datapoints
相当于输入集:理论数据
理论的主要数据来源是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));
}
}