Kurs TDD cz. 7: Inicjalizacja i czyszczenie danych (SetUp i TearDown)

W tej części kursu zajmiemy się pojęciem inicjalizacji i czyszczenia danych. Wielkiej filozofii tutaj nie ma; w NUnit działa to tak:

  • Jeśli chcemy, aby jedna z metod uruchamiała się przed każdym uruchomieniem naszego testu, aby np. inicjalizować dane, nakładamy na nią atrybut [SetUp].
  • Jeśli zechcemy, aby metoda uruchamiała się po każdym uruchomieniu testu w celu np. czyszczenia danych — nakładamy atrybut [TearDown].

Reguły gry są jasne:

  • Jeśli użyjemy więcej niż jeden atrybut [SetUp] i [TearDown] dla jednego [TestFixture], to kod skompiluje się poprawnie, ale testy nie uruchomią się.
  • Jeśli chcemy natomiast uruchomić kod jednorazowo przed wywołaniem\po wywołaniu wszystkich naszych testów w obrębie [TestFixture], możemy skorzystać z atrybutów [TestFixtureSetUp] i [TestFixtureTearDown].

Czytaj dalej

Kurs TDD cz. 6: Dobre i złe praktyki testów jednostkowych

W tej części opisane zostaną dobre i złe praktyki stosowane przy pisaniu testów jednostkowych. Co ciekawe, praktyki te odbiegają niekiedy od ogólnie przyjętych założeń i standardów kodowania. Przykładem może być zasada DRY—Don’t Repeat Yourself. W TDD kopiuj-wklej to niemal chleb powszedni; w TDD możemy stosować zasadę zgoła odwrotną—Do Repeat Yourself! Taka odrębność wynika z tego, że w kodzie testowym musimy zminimalizować prawdopodobieństwo pojawienia się błędu. Kod testowy musi być też bardzo prosty i czytelny. Kod testowy nie jest kodem produkcyjnym i w konsekwencji nie będziemy mieli potrzeby rozwijania kodu ani jego funkcjonalności.

Czytaj dalej

Kurs TDD cz. 4: Nasz pierwszy test jednostkowy

W tej części cyklu stworzymy nasz pierwszy test jednostkowy. Przedstawię krok po kroku jak napisać i przetestować prostą funkcjonalność wedle zasad TDD. Opiszę tutaj szczegółowo wszystkie kroki, począwszy od tego jak dodać referencję do NUnita, a skończywszy na tym jak uruchomić test.

Zachęcam też do odwiedzenia ostatniej części, która opisuje strukturę kodu jednostkowego Arrange-Act-Assert. Zachęcam tym bardziej, że rozszerzyłem tę część o garść istotnych informacji. Czytaj dalej

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.

Czytaj dalej

Cytaty o TDD

Garść cytatów w kontekście Test Driven Development. Można je wykorzystać przy różnych okazjach, np. przy tworzeniu prezentacji albo przy rodzinnych bankietach ;)

Writing tests is another way to look the code and locally understand it and reuse it, and that is the same goal of good Object Oriented design. This is the reason of the deep synergy between testability and good design.
— Michael Feathers

Code without tests is bad code. It doesn’t matter how well written it is; it doesn’t matter how pretty or object-oriented or well-encapsulated it is. With tests, we can change the behavior of our code quickly and verifiably. Without them, we really don’t know if our code is getting better or worse.
— Michael Feathers

Czytaj dalej

Kurs TDD cz. 2: Testy jednostkowe, a testy integracyjne

Witam po nieco-ponad-miesięcznej przerwie spowodowanej… tak, tak, urlopem ;) Wracamy więc do cyklu poświęconego TDD. Od tej pory kurs nabierze szybszego tempa, a więc—stój nastawiony! ;)

W części pierwszej kursu omówiłem czemu służy technika i jak wygląda proces pisania wedle TDD, opisałem cykl Red-Green-Refactor, a na koniec przedstawiłem korzyści płynące z jej używania. W części drugiej kursu przyjrzymy się rodzajom testów w świecie Test-Driven Development i poznamy różnice między testami jednostkowymi, a integracyjnymi.

Czytaj dalej