2011-01-27 42 views
19

我想編寫一個可調用的函數來接受兩個對象,並將這些對象的30多個屬性與斷言進行比較。問題是,需要爲大約20個現有的單元測試和大多數未來的測試完成這項工作,並且每次寫出30個以上的斷言既耗費時間又耗費空間。是否可以參數化一個nunit測試

我目前有一個非單元測試函數,用於比較對象,並返回一個帶有「pass」或失敗消息的字符串,並使用一個斷言來驗證每個單元測試的結果。然而,它非常混亂,我覺得我正在反對適當的單元測試方法。

有沒有一種方法可以從單元測試中調用一個函數來調用assert來檢查條件?

回答

17

要回答的最後一部分,當然你可以斷言的另一個函數內。通過提高例外,測試運行漁獲斷言的工作,並解釋是失敗的,所以有一個測試,像這樣將正常工作:

public void CheckAsserts(string value) 
{ 
    Assert.IsNotNull(value); 
} 

[TestCase("yes!")] 
public void MyTest(string value) 
{ 
    CheckAsserts(value); 
} 
4

是的,單元測試就像任何其他代碼一樣。

特別是,請查看NUnit.TestCaseAttribute

+0

我已經看過,但看不到如何設置動態參數。我想比較20個手動填充的對象與數據庫中的自動填充對象。使用斷言(不是測試用例)創建一個void函數並從我的單元測試中調用它可以很好地工作。謝謝 – NewNetProgrammer 2011-01-27 16:04:51

32

如果您使用的是NUnit 2.5.5或更高版本,則可以使用TestCase屬性。

普通的單元測試與[測試]裝飾,但我們可以替換如下:

[TestCase("0", 1)] 
[TestCase("1", 1)] 
[TestCase("2", 1)] 
public void UnitTestName(string input, int expected) 
{ 
    //Arrange 

    //Act 

    //Assert 
} 

這類型的事情會做的方式 - 顯然需要不同PARAMS。

看這個求助:http://nunit.org/?p=testCase&r=2.5

+0

問題是,我的測試用例不是靜態的。我有一個手動填充的對象,並從數據庫中填充一個我想要比較的對象。 – NewNetProgrammer 2011-01-27 16:01:55

+0

`expected`應該是參數化測試的返回類型,您應該提供帶有返回值而不是參數的測試用例。 – 2012-01-12 21:27:57

0

你需要TestCase的屬性:

[TestCase("string1",...) 
public void test_UnitTest(string Parameter) 
{ 
    ... 
    Assert.AreEqual(Parameter, result) 
} 

注意,這僅與基本數據類型,如字符串和整數工程 - 你不能實例化自己的類,並將其用作參數。

+0

問題是我用我自己的類對象與30多個屬性,我想比較。 – NewNetProgrammer 2011-01-27 16:05:20

1

可以使用TestCase屬性:

[TestCase("hostname1parameter")] 
[TestCase("hostname2parameter")] 
public void Example_TestHostName(string hostname) 
{ 
    ... 
} 
0

您也可以使用C#反省中受益。這使您可以獲取字段的名稱,而無需在代碼中指定它們。然後你可以通過名字來調用它們。

System.Attribute [] attrs = System.Attribute.GetCustomAttributes(t);

這使您可以編寫適用於您尚未編寫的類的某些測試。

相關問題