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

时间:2016-09-04 08:33:44

标签: c# testing automated-tests nunit

实际问题在底部。我已经尝试尽可能地缩短这个职位,我希望我能够解决问题中大部分不明确的部分。

根据文档,我们有nUnit(以及其他属性)

我一直在阅读文档,并且长时间使用以上所有内容,所以我非常熟悉它们的行为方式。然而,有一种想法一直困扰着我,到现在为止,我很尴尬地问。

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]
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和ExpectedResult属性合并

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

所以,问题是这些方法是否在技术层面上有所不同,或者它是否恰好是目前最喜欢的代码。我们更愿意降低开发人员需要做出的选择,并且提供如此广泛的等价物似乎是多余的和令人困惑的。

如果他们不同,那么我想知道如何。我在文档中找不到。如果他们没有区别,那么我很好奇为什么。我们是在谈论&#34;让人们决定他们喜欢什么&#34;或者更确切地说,#34;这是遗留下来的东西,不能被删除&#34;?

1 个答案:

答案 0 :(得分:4)

有一些微妙的差异。

  • 测试用例计数

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

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

    当您有多个测试用例时,您也可以在NUnit 3上选择加入parallel test execution。如果您使用不同的运行程序(如NCrunch),您还可以通过使用单独的测试用例轻松获得并行性。

  • 组合

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

    您可以使用CombinatorialAttribute明确标记,或使用PairwiseAttributeSequentialAttribute进行其他方法。

其他差异主要只是偏好。

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

当我想要组合行为时,我赞成TestCase超过Values,但是当你拥有组合行为时,这只是一种风格问题一个参数。使用多个输入参数,您可能无论如何都需要两种方法。