Kurs TDD cz. 9: Testy kombinatoryczne i sekwencyjne

Naturalnym krokiem po omówieniu testów parametryzowanych jest przejście do testów kombinatorycznych i sekwencyjnych. Do dyspozycji mamy dwa atrybuty NUnita — [Combinatorial] oraz [Sequential]. Sprawa jest bardzo prosta, więc zrozumienie działania tych dwóch funkcjonalności nie przysporzy żadnych problemów.

Bieżący kod z tego kursu znajduje się na GitHubie: https://github.com/dariusz-wozniak/TddCourse/.

Testy kombinatoryczne

Kombinatoryczne testy wykonywane są na zestawie wszystkich możliwych przypadków. Wartości przekazywane są w atrybucie parametru [Values]. Tak naprawdę, użycie atrybutu [Combinatorial] jest opcjonalne – gdy metoda będzie miała co najmniej dwa parametry opatrzone atrybutem [Values], test kombinatoryczny będzie domyślnym dla takiego scenariusza.

Przykład użycia testu kombinatorycznego:

[Test]
[Combinatorial]
public void Divide_DividendIsPositiveAndDivisorIsNegative_ReturnsNegativeQuotient(
    [Values(1, 2, 3, 4)] int dividend,
    [Values(-1, -2, -3)] int divisor)
{
    var calc = new Calculator();
    float quotient = calc.Divide(dividend, divisor);

    Assert.That(quotient < 0);
}

W powyższym przykładzie chcemy udowodnić, że jeśli dzielna jest dodatnia, a dzielnik ujemny, to wynik ma być ujemny. Dla wartości dzielnej aplikujemy cztery wartości, dla dzielnika 3, a zatem 4 x 3 = 12 przypadków:

(1,-1)
(1,-2)
(1,-3)
(2,-1)
(2,-2)
(2,-3)
(3,-1)
(3,-2)
(3,-3)
(4,-1)
(4,-2)
(4,-3)

Testy sekwencyjne

W teście sekwencyjnym dane wykonywane są w porządku, w jakim zostały zdefiniowane. Podobnie jak w przypadku testów kombinatorycznych, dane wprowadzamy w atrybucie parametru [Values].

Przykład:

[Test]
[Sequential]
public void Divide_DivisorIsNegativeOfDividend_ReturnsMinusOne(
    [Values(1, 2, 30)] int dividend,
    [Values(-1, -2, -30)] int divisor)
{
    var calc = new Calculator();
    float quotient = calc.Divide(dividend, divisor);

    Assert.That(quotient == -1);
}

Powyższy test ma dowieść, że a ÷ (-a) = -1. Dla powyższego zestawu danych, zostały wygenerowane następujące przypadki:

(1,-1)
(2,-2)
(30,-30)

A co jeśli ilość parametrów się nie zgadza? NUnit przypisze brakującym elementom wartość default(T).

Podsumowanie

  • Do testów kombinatorycznych i sekwencyjnych wykorzystujemy atrybuty [Combinatorial] i [Sequential].

Zobacz też

Źródła

2 thoughts on “Kurs TDD cz. 9: Testy kombinatoryczne i sekwencyjne

  1. Pingback: dotnetomaniak.pl
  2. Pingback: Kurs TDD cz. 10: Teorie | DARIUSZ WOZNIAK.NET

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s