【问题标题】:What's the difference between [Test] (optional [Values]) versus [TestCase] (optional ExpectedResult)?[Test](可选 [Values])与 [TestCase](可选 ExpectedResult)有什么区别?
【发布时间】:2016-09-04 08:33:43
【问题描述】:

实际问题在底部。我已经尝试使帖子尽可能简短,我希望我已经设法纠正了问题中大部分不清楚的部分。

根据文档,我们在 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 和 Values 属性相结合

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

仅测试用例属性

[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);
}

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

如果它们不同,那么我想知道如何。我在文档中没有找到。如果它们没有区别,那么我很好奇为什么。我们是在谈论“让人们决定他们喜欢什么”还是“这是无法删除的遗留问题”?

【问题讨论】:

  • 我想这有点离题,但当我读到“我们更愿意减少开发人员需要做出的选择的数量”时,我会感到担心。世界是复杂的,有一些选择是肯定要做出的。 NUnit 团队非常努力地限制——甚至消除——不必要的选择。 我们是开发人员。如果您使用“我们”表明您不是其中之一,那么请停止尝试“限制开发者的选择”。如果你是一个人,这只是一种说话方式,我提前道歉。
  • @Charlie 非常有趣的一点。让我详细说明我的意思,因为我确信我们同意这一原则。首先 - 我 am 是一名开发人员。几十年来。现在,我的意思是我,作为一名开发人员,喜欢获得一组选项,然后决定使用我的技能、经验、教育和智力来选择最佳选项。然后,我会应用它。如果有标准或经过验证的方法,例如计算一个凸包,我想使用 it,因为我知道,在这种情况下,最佳方法是 那个,我不必做出任何选择.我只是应用已知最好的东西。

标签: c# testing automated-tests nunit


【解决方案1】:

有一些细微的差别。

  • 测试用例计数

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

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

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

  • 组合

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

    您可以使用CombinatorialAttribute 明确地标记它,或者使用PairwiseAttributeSequentialAttribute 来实现不同的方法。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 2021-12-02
    • 2021-06-26
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多