Po wstępie do TDD i omówieniu różnic między testami jednostkowymi, a integracyjnymi, czas na omówienie jak strukturalnie powinien wyglądać wzorcowy test jednostkowy. Będzie to pewnie najkrótszy wpis tej serii, ale jednocześnie jeden z najważniejszych. Pozwoli bowiem na pierwszy kontakt z testem jednostkowym w praktyce.
Strukturę testu jednostkowego definiuje zasada Arrange–Act–Assert (AAA):
Jakie korzyści płyną ze stosowania tego wzorca? Przede wszystkim porządek; wzorzec zapewnia logiczny porządek w pojedynczym teście — część przygotowania danych wejściowych jest odseparowana od części weryfikacyjnej. Ponadto, nie mieszamy naszych asercji w trakcie wywołania testowanego obiektu.
Jak mawiali Chińczycy—Jeden kod mówi więcej niż tysiąc słów. Poniższy kod napisany jest zgodnie z AAA:
[Test]
public void Add_AddingTwoValues_ReturnsProperValue()
{
// Arrange:
var calc = new Calculator();
// Act:
int result = calc.Add(2, 3);
// Assert:
Assert.AreEqual(5, result);
}
Na powyższym, bardzo prostym, przykładzie testujemy funkcjonalność dodawania klasy Calculator
. Chcemy sprawdzić czy (niebrzegowy) przypadek dodania dwóch liczb zwróci oczekiwany wynik.
W pierwszej części metody inicjalizujemy obiekt klasy Calculator. Wszelkie inicjalizacje zmiennych, obiektów oraz mocków (o czym będzie w późniejszych częściach) znajdować powinny się w pierwszej części metody — Arrange.
W kolejnej linijce wykonujemy proste działanie arytmetyczne: dodajemy do siebie dwie liczby całkowite – 2 i 3. Celem tego etapu, Act, jest uruchomienie funkcjonalności testowanej klasy. Będzie to zazwyczaj uruchomienie metody, choć nie jest to reguła (zawsze możemy przetestować np. odczyt/zapis danego property).
Ostatnia linijka to wykonanie asercji (Assert). Sprawdzamy, czy zwrócony wynik z powyższego wywołania jest taki sam jak oczekujemy. Tutaj oczekujemy, że metoda naszej klasy po dodaniu liczb 2 i 3, zwróci nam liczbę 5.
I jeszcze kilka kwestii technicznych. Atrybut [Test]
i klasa Assert
pochodzą z NUnita, który należy do rodziny frameworków testowych. Kolejność parametrów metody AreEqual
jest następująca: pierwszym parametrem jest wartość oczekiwana, drugim zwrócona przez działanie naszej metody. W kolejnej części cyklu dowiemy się jak, krok po kroku, stworzyć pierwszy test jednostkowy. Zrozumienie wzorca Arrange-Act-Assert jest niezbędne do budowania dobrych testów.
Część I: Testy jednostkowe – wstęp