我想編寫一個可調用的函數來接受兩個對象,並將這些對象的30多個屬性與斷言進行比較。問題是,需要爲大約20個現有的單元測試和大多數未來的測試完成這項工作,並且每次寫出30個以上的斷言既耗費時間又耗費空間。是否可以參數化一個nunit測試
我目前有一個非單元測試函數,用於比較對象,並返回一個帶有「pass」或失敗消息的字符串,並使用一個斷言來驗證每個單元測試的結果。然而,它非常混亂,我覺得我正在反對適當的單元測試方法。
有沒有一種方法可以從單元測試中調用一個函數來調用assert來檢查條件?
我想編寫一個可調用的函數來接受兩個對象,並將這些對象的30多個屬性與斷言進行比較。問題是,需要爲大約20個現有的單元測試和大多數未來的測試完成這項工作,並且每次寫出30個以上的斷言既耗費時間又耗費空間。是否可以參數化一個nunit測試
我目前有一個非單元測試函數,用於比較對象,並返回一個帶有「pass」或失敗消息的字符串,並使用一個斷言來驗證每個單元測試的結果。然而,它非常混亂,我覺得我正在反對適當的單元測試方法。
有沒有一種方法可以從單元測試中調用一個函數來調用assert來檢查條件?
要回答的最後一部分,當然你可以斷言的另一個函數內。通過提高例外,測試運行漁獲斷言的工作,並解釋是失敗的,所以有一個測試,像這樣將正常工作:
public void CheckAsserts(string value)
{
Assert.IsNotNull(value);
}
[TestCase("yes!")]
public void MyTest(string value)
{
CheckAsserts(value);
}
是的,單元測試就像任何其他代碼一樣。
特別是,請查看NUnit.TestCaseAttribute
。
如果您使用的是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。
問題是,我的測試用例不是靜態的。我有一個手動填充的對象,並從數據庫中填充一個我想要比較的對象。 – NewNetProgrammer 2011-01-27 16:01:55
`expected`應該是參數化測試的返回類型,您應該提供帶有返回值而不是參數的測試用例。 – 2012-01-12 21:27:57
你需要TestCase的屬性:
[TestCase("string1",...)
public void test_UnitTest(string Parameter)
{
...
Assert.AreEqual(Parameter, result)
}
注意,這僅與基本數據類型,如字符串和整數工程 - 你不能實例化自己的類,並將其用作參數。
問題是我用我自己的類對象與30多個屬性,我想比較。 – NewNetProgrammer 2011-01-27 16:05:20
可以使用TestCase
屬性:
[TestCase("hostname1parameter")]
[TestCase("hostname2parameter")]
public void Example_TestHostName(string hostname)
{
...
}
您也可以使用C#反省中受益。這使您可以獲取字段的名稱,而無需在代碼中指定它們。然後你可以通過名字來調用它們。
System.Attribute [] attrs = System.Attribute.GetCustomAttributes(t);
這使您可以編寫適用於您尚未編寫的類的某些測試。
我已經看過,但看不到如何設置動態參數。我想比較20個手動填充的對象與數據庫中的自動填充對象。使用斷言(不是測試用例)創建一個void函數並從我的單元測試中調用它可以很好地工作。謝謝 – NewNetProgrammer 2011-01-27 16:04:51