NUnit 參數化測試介紹

在測試中針對同一個方法(method) 通常會需要反覆測試,而為了避免重複撰寫測試案例,我們可以使用 NUnit 中的參數化測試(Parameterized Test),將會變動的內容抽取出來,只留下固定的程式碼, 不只能夠減少撰寫測試案例的工作量,同時也可以增加測試的彈性和可讀性。

下面將示範參數化測試的幾種方式:

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);
}
    

留言