Kurs TDD cz. 3: Struktura testu, czyli Arrange-Act-Assert

Po wstępie 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.

Arrange–Act–Assert

Strukturę testu jednostkowego definiuje zasada Arrange–Act–Assert (AAA):

  • Arrange: wszystkie dane wejściowe i preconditions,
  • Act: działanie na metodzie/funkcji/klasie testowanej,
  • Assert: upewnienie się, że zwrócone wartości są zgodne z oczekiwanymi.

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.

Przykład

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 test frameworków. 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.

Zobacz też

6 thoughts on “Kurs TDD cz. 3: Struktura testu, czyli Arrange-Act-Assert

  1. Bardzo ciekawy artykuł, tylko niesamowicie krótki oraz traktujący temat pobieżnie… ;). W zasadzie można było całą jego zawartość umieścić w nagłówku, to nie byłoby potrzeby rozwijania całego tekstu…

    • Zgadzam się. Chciałem poruszyć tematykę tego wzorca przy okazji kolejnej części (w której omówię jak napisać pierwszy test jednostkowy), ale faktycznie – lepiej jeśli wszystkie informacje zostaną zawarte w jednym miejscu. Zaktualizowałem artykuł.

  2. Pingback: Kurs TDD część 4: Nasz pierwszy test jednostkowy | DariuszWozniak.NET
  3. Pingback: Kurs TDD część 6: Dobre i złe praktyki testów jednostkowych | DariuszWozniak.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