2009-04-28 121 views
2

NUnit和MbUnit有一个RowTest属性,允许您将不同的参数集发送到单个测试中。在单元测试中使用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属性,但只有当我认为它不会给我慢下来的时候,我需要后来这个工作。

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

回答

6

是的。它基本上一次又一次地用不同的输入执行相同的测试......节省您为每个不同的输入组合重复自己的麻烦。
因此坚持'一次又一次'或DRY原则。所以如果你需要更新这个测试,你只需更新一个测试(vs多个)测试。

每一行都应该是来自不同集合的代表性输入 - 即该输入不同于其他所有的w.r.t.这个函数的行为。 RowTest实际上是NUnit的一大特色 - 起源于MBUnit ...我认为Schlapsi将它写成了NUnit扩展,然后被提升为std分布状态。 NUnit GUI还将所有RowTests分组在GUI中的一个节点下,并显示哪个输入失败/通过..哪个很酷。

'需要调试'的一个小缺点是我个人可以忍受的事情。它毕竟暂时地注释了一些Row属性(首先大部分时间我可以在我找到情景X失败并解决它,而不需要穿越)或相反,只是复制测试,并通过它固定(有问题)的输入临时

+1

我也提到了..它凝胶与我固有的懒惰。 – Gishu 2009-04-28 12:06:18

相关问题