在单元测试中使用RowTest是一个好习惯

时间:2009-04-28 11:45:39

标签: c# .net unit-testing

NUnit和MbUnit具有RowTest属性,允许您将不同的参数集发送到单个测试中。

[RowTest]
[Row(5, 10, 15)]
[Row(3.5, 2.7, 6.2)]
[Row(-5, 6, 1)]
public void AddTest(double firstNumber, double secondNumber, double result)
{
  Assert.AreEqual(result, firstNumber + secondNumber);
}

我曾经是这个功能的忠实粉丝。我到处都用它。但是,最近我不确定在单元测试中使用RowTest是否是个好主意。以下是更多原因:

单元测试必须非常简单。如果有错误,你不想花很多时间来弄清楚你的测试测试。当您使用多行时,每行都有不同的发送参数集,并测试不同的行。

此外我正在使用TestDriven.NET,这允许我从我的IDE,Visual Studio运行我的单元测试。使用TestDrivent.NET我无法指示运行特定的行,它将执行所有行。因此,当我调试时,我必须注释掉所有其他行,只留下我正在使用的那一行。

以下是今天如何编写测试的示例:

[Test]
public void Add_with_positive_whole_numbers()
{
   Assert.AreEqual(5, 10 + 15);
}

[Test]
public void Add_with_one_decimal_number()
{
   Assert.AreEqual(6.2, 3.5 + 2.7);
}

[Test]
public void Add_with_negative_number()
{
   Assert.AreEqual(1, -5 + 6);
}

说我仍然偶尔会使用RowTest属性,但只有当我认为在我稍后需要处理它时它不会减慢我的速度时。

您认为在单元测试中使用此功能是个好主意吗?

1 个答案:

答案 0 :(得分:6)

是的。它基本上是使用不同的输入一遍又一遍地执行相同的测试...省去了为每个不同的输入组合重复自己的麻烦。
因此坚持'一次且仅一次'或干燥原则。因此,如果您需要更新此测试,则只需更新一个测试(与多个)测试。

每一行应该是来自不同集合的代表性输入 - 即此输入与所有其他行不同w.r.t.这个函数的行为。 RowTest实际上是NUnit的一个要求很高的功能 - 源自MBUnit ...我认为Schlapsi将其写成NUnit扩展,然后升级为std发布状态。 NUnit GUI还将GUI中一个节点下的所有RowTest分组,并显示哪个输入失败/通过..这很酷。

“需要调试”的一个小缺点是我个人可以忍受的事情......毕竟暂时评论了许多Row属性(首先我发现ScenarioX后大部分时间都能看到这个功能失败并解决它而不需要逐步通过)或反过来只是复制测试并暂时将其传递给固定(有问题的)输入