在測試中針對同一個方法(method) 通常會需要反覆測試,而為了避免重複撰寫測試案例,我們可以使用 NUnit 中的參數化測試(Parameterized Test),將會變動的內容抽取出來,只留下固定的程式碼, 不只能夠減少撰寫測試案例的工作量,同時也可以增加測試的彈性和可讀性。
下面將示範參數化測試的幾種方式:
下方範例將參數 3 作為答案,驗證前兩項參數相乘的結果。
(執行結果和上方範例相同)
(執行結果和上方範例相同)
下面將示範參數化測試的幾種方式:
TestCase
TestCase 內的參數會依序填入的測試方法內的參數中,並依照 TestCase 的數量產生測試案例。下方範例將參數 3 作為答案,驗證前兩項參數相乘的結果。
[TestCase(1, 6, 6)]
[TestCase(2, 7, 14)]
[TestCase(3, 8, 24)]
public void Test1(int x, int y, int answer)
{
Assert.AreEqual(answer, x * y);
}
Sequential
如果覺得 TestCase 不直觀,也可以使用 Sequential 搭配 Values,每個 Values 的內容會依序傳入參數中。若 Values 的長度不一,會依據最長的為準,其他填入 null。(執行結果和上方範例相同)
[Test, Sequential]
public void Test1(
[Values(1, 2, 3)] int x,
[Values(6, 7, 8)] int y,
[Values(6, 14, 24)] int answer
)
{
Assert.AreEqual(answer, x * y);
}
Combinatorial
使用 Combinatorial 加上 Values 可以將所有組合都使用過一遍,很適合用在填表時測試所有下拉式選單
[Test, Combinatorial]
public void Test1(
[Values("A", "B", "C")] string option1,
[Values(1, 2, 3)] int option2
)
{
Console.WriteLine(option1 + " " + option2);
}
ValueSource
如果想要傳入物件怎麼辦?可以直接將上面的 Values 替換為 ValueSource 來使用。需要先建立靜態的變數,就可以讓 ValueSource 使用了,下面示範兩種使用方式:(執行結果和上方範例相同)
private static IEnumerable<string> Values1()
{
yield return "A";
yield return "B";
yield return "C";
}
private static IEnumerable<int> Values2()
{
return new[] { 1, 2, 3 };
}
[Test, Combinatorial]
public void Test1(
[ValueSource(nameof(Values1))] string option1,
[ValueSource(nameof(Values2))] int option2
)
{
Console.WriteLine(option1 + " " + option2);
}
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com