[Test](可选的[Values])和[TestCase](可选的ExpectedResult)之间的区别是什么?

本文关键字:区别 是什么 之间 Values Test TestCase ExpectedResult | 更新日期: 2023-09-27 18:05:39

实际问题在底部。我已经尽力使这篇文章尽可能简短,我希望我已经设法澄清了问题中大部分不清楚的部分。

根据文档,我们有在nUnit(在其他属性中)

    测试
  • TestCase

我一直在阅读文档并使用上述所有内容,因为很长一段时间,所以我非常熟悉它们的行为。然而,有一个想法一直困扰着我,现在我都不好意思问了。

public int Output(int input) { return input + 1; } 

我们可以为像上面这样的简单方法设置测试,我可以想到四种方法。我几乎在任何地方都见过它们中的大多数,但我真的不知道这些是不同的风格导致相同的底层功能,还是存在我根本没有意识到的技术差异。

例如,也许#2可以并行,而另一个不能(这只是一个假的例子,表明可能有我们不知道的魔法)。

只测试属性

[Test]
public void OutputIsWorking()
{
  List<int> inputs = new List<int>{ 1, 2, 3 };
  for(int i = 0; i < inputs.Count; i++)
    Assert.That(inputs[i] + 1, Is.EqualTo(Output(input)));
}

Test和Values属性组合

[Test]
public void OutputIsGreat([Values(1,2,3)] int input)
{
  int output = Output(input);
  Assert.That(input + 1, Is.EqualTo(output));
}

仅TestCase属性

[TestCase(1, 2)]
[TestCase(2, 3)]
[TestCase(3, 4)]
public void DivideTest(int input, int expectation)
{
  int output = Output(input);
  Assert.That(output, Is.EqualTo(expectation));
}

TestCase和expectedreresult属性组合

[TestCase(1, ExpectedResult = 2)]
[TestCase(2, ExpectedResult = 3)]
[TestCase(3, ExpectedResult = 4)]
public void DivideTest(int input)
{
  return Output(input);
}

所以,问题是这些方法是在技术层面上有所不同,还是只是代码目前最喜欢的。我们倾向于减少开发人员需要做出的选择的数量,提供如此广泛的等价物似乎是多余的和令人困惑的。

如果它们不一样,那么我想知道原因。我在文件里没找到。如果它们没有区别,那么我很好奇为什么。我们谈论的是"让人们决定他们喜欢什么"还是"这是一个无法删除的遗产"?

[Test](可选的[Values])和[TestCase](可选的ExpectedResult)之间的区别是什么?

有一些细微的差别。

  • 测试用例计数

    在第一个示例中(仅Test属性),您正在编写单个测试用例。如果输入2测试失败,则整个测试失败,输入3根本不测试

    在所有其他示例中,您正在编写单独的测试用例,因此即使2失败,NUnit仍将测试所有剩余用例,并在测试报告中显示它们。

    当您有几个测试用例时,您还可以选择在NUnit 3上并行执行测试。如果你使用不同的运行器,如NCrunch,你也可以通过使用单独的测试用例轻松获得并行性。

  • 组合

    当您使用ValuesAttribute,并且您有几个参数时,NUnit将执行所有可能的输入值组合作为单独的测试。通过使用TestCaseAttribute,您必须自己编写所有输入。

    您可以使用CombinatorialAttribute来显式地标记它,或者使用PairwiseAttributeSequentialAttribute来获得不同的方法。

其他差异大多只是偏好问题。

使用ExpectedResult使您不必编写断言(它是由NUnit为您隐式插入的),并且必须编写更少的代码可以说是一件好事。我不会自己写"仅TestCase属性"的例子,我宁愿使用ExpectedResult功能,因为我认为这种方式更具可读性(输出参数突出)。

当我想要组合行为时,我更喜欢TestCase而不是Values,但是当你有一个参数时,这只是一个风格问题。对于几个输入参数,您可能无论如何都需要这两种方法。