2009-04-28 54 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

相關問題