Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla...

38

Transcript of Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla...

Page 1: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?
Page 2: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Redaktor prowadzący: Małgorzata Kulik

Projekt okładki: Studio Gravite / OlsztynObarek, Pokoński, Pazdrijowski, Zaprucki

Grafika na okładce została wykorzystana za zgodą Shutterstock.com

Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: [email protected] WWW: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/tddpprMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Kody źródłowe wybranych przykładów dostępne są pod adresem:ftp://ftp.helion.pl/przyklady/tddppr.zip

ISBN: 978-83-283-3531-8

Copyright © Helion 2018

Printed in Poland.

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Page 3: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Spis treściPodziękowania ................................................................................................. 11Przedmowa ...................................................................................................... 13Cytaty o TDD ..................................................................................................... 15Wstęp .............................................................................................................. 17Przewodnik po książce ............................................................................................................ 19Dla kogo jest ta książka? ......................................................................................................... 20

W jakim stopniu muszę umieć programować? ............................................................ 20Nie jestem programistą C#. Czy ta książka ma jakąś wartość dla mnie? .................. 20Umiem pisać testy jednostkowe i znam TDD. Czy ta książka jest dla mnie? .......... 21Jestem menadżerem/dyrektorem/właścicielem (a więc nie programuję),

a mój zespół chce wdrożyć TDD. Czy z tej książki dowiem się, czy warto? ......... 22Jestem manualnym testerem. Czy powinienem znać TDD? ...................................... 22

Kontekst jest królem ................................................................................................................ 23Atrapa to mock czy test double? .................................................................................... 23xUnit a xUnit.net .............................................................................................................. 24Funkcja a funkcjonalność oraz funkcyjny a funkcjonalny ......................................... 24Synonimy ........................................................................................................................... 25

Jak uczyć się metody Test-Driven Development? ............................................................... 25Dogmat ...................................................................................................................................... 26Narzędzia użyte w tej książce ................................................................................................. 27Kod źródłowy do książki ........................................................................................................ 28

Rozdział 1. Wprowadzenie do TDD ...................................................................... 29Błędy w oprogramowaniu ...................................................................................................... 31Cykl Red-Green-Refactor ....................................................................................................... 32Podsumowanie ......................................................................................................................... 33

Poleć książkęKup książkę

Page 4: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

4 TDD. Techniki programowania sterowanego testami

Rozdział 2. Co zyskujemy dzięki TDD? ................................................................. 35Wysoka jakość kodu ................................................................................................................ 35

Czy pisanie w metodyce TDD oznacza pisanie według zasad SOLID? .................... 36Prostota kodu: YAGNI i KISS ................................................................................................ 37Żywa dokumentacja ................................................................................................................ 38Lepsze zrozumienie wymagań biznesowych ........................................................................ 38Automatyczna regresja ........................................................................................................... 39Informacja zwrotna ................................................................................................................. 41Mniej defektów ........................................................................................................................ 42Czas programowania jest krótszy .......................................................................................... 43Niższy koszt zmian .................................................................................................................. 43Przypadki użycia ...................................................................................................................... 45

Badanie Microsoft Research nad zespołami Microsoftu i IBM ................................. 45Pilotażowy projekt dla dużej firmy ................................................................................ 45Mały projekt w parach ..................................................................................................... 47Metaanaliza ....................................................................................................................... 47

Podsumowanie ......................................................................................................................... 48

Rozdział 3. Trudności przy wdrażaniu TDD ........................................................... 49Ścieżka nauki ............................................................................................................................ 49Dyscyplina ................................................................................................................................ 50Więcej narzędzi ........................................................................................................................ 50Początkowa percepcja dłuższego czasu potrzebnego do napisania kodu ........................ 51Jak „sprzedać” TDD kierownictwu? ..................................................................................... 51Musimy dostarczać szybko, a w naszym projekcie nie ma czasu na TDD ...................... 51

Lista kontrolna: Definition of Done .............................................................................. 52Podsumowanie ......................................................................................................................... 56

Rozdział 4. Filozofia TDD ................................................................................... 57Test-First czy Test-Last? ......................................................................................................... 58Wszystkie testy naraz czy test po teście? .............................................................................. 59Weryfikacja stanu czy zachowania? ...................................................................................... 60Jedna czy wiele asercji? ........................................................................................................... 60

Scenariusz 1.: Jedna oczekiwana zmienna wyjściowa ................................................. 60Scenariusz 2.: Wiele oczekiwanych zmiennych wyjściowych .................................... 61Scenariusz 3.: Asercje pośrednie .................................................................................... 62Wiele asercji w jednym teście ......................................................................................... 66

Kiedy pisanie testów jednostkowych nie ma sensu? ........................................................... 67Czy należy pisać testy jednostkowe do bibliotek innych dostawców? ............................. 68

Poleć książkęKup książkę

Page 5: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Spis treści 5

Czy TDD sprawdza się dla małych aplikacji? ...................................................................... 69Czy TDD sprawdza się dla dużych aplikacji? ...................................................................... 70Czy testy jednostkowe zastępują testera? ............................................................................. 70Jak pisanie testów jednostkowych wpływa na estymatę zadania? ..................................... 71Czy testy jednostkowe można pisać w innym języku

programowania niż pisany jest kod? ................................................................................. 71Czy testy jednostkowe może pisać inna osoba? ................................................................... 72Czy system może mieć zbyt dużo testów jednostkowych? ................................................ 72Czy testy jednostkowe to jedyne testy, jakie powinny znajdować się w aplikacji? ......... 73Jakich testów powinno być najwięcej (piramida testów)? ................................................. 74Podsumowanie ......................................................................................................................... 75

Rozdział 5. Rodzaje testów ................................................................................ 77Sposób wykonywania .............................................................................................................. 77Wiedza na temat struktury systemu (test skrzynki) ........................................................... 77Poziom testowania ................................................................................................................... 78Testowanie po zmianach dokonanych w systemie ............................................................. 80Testowanie niefunkcjonalne .................................................................................................. 80

Test wydajnościowy ......................................................................................................... 81Podsumowanie ......................................................................................................................... 82

Rozdział 6. Test jednostkowy ............................................................................. 83Struktura testu: Arrange-Act-Assert ..................................................................................... 83

Alternatywne struktury testu .......................................................................................... 84Test jednostkowy a test integracyjny .................................................................................... 85Myśl jak tester: ścieżki optymistyczne i przypadki brzegowe ............................................ 86Jak nazywać klasy i metody testowe? .................................................................................... 87Podział testów i projekty testowe .......................................................................................... 88Podsumowanie ......................................................................................................................... 89

Rozdział 7. Nasz pierwszy test jednostkowy ........................................................ 91Wybór biblioteki do testowania ............................................................................................. 91Zanim zaczniemy… ................................................................................................................ 92

Dodanie solucji i projektów ............................................................................................ 92Dodanie biblioteki NUnit ............................................................................................... 93

Etap red: pisanie testu do nieistniejącej metody ................................................................. 95Jak uruchomić test? .......................................................................................................... 98

Etap green: implementacja kodu ......................................................................................... 102Etap trzeci (i ostatni): refaktoryzacja kodu ........................................................................ 103Podsumowanie ....................................................................................................................... 103

Poleć książkęKup książkę

Page 6: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

6 TDD. Techniki programowania sterowanego testami

Rozdział 8. Piszemy kolejne testy jednostkowe .................................................. 105Drugi test jednostkowy ......................................................................................................... 105Kolejne przypadki użycia ...................................................................................................... 106

Testy ułamków nieskończonych lub zaokrąglonych ................................................. 108Testowanie wyrzucenia wyjątku .......................................................................................... 109Testowanie zdarzenia ............................................................................................................ 111Podsumowanie ....................................................................................................................... 114

Rozdział 9. Testowanie z NUnitem .................................................................... 115Asercje ..................................................................................................................................... 116

Model klasyczny i model oparty na twierdzeniach ................................................... 118Operacja równości ................................................................................................................. 120

Porównanie dwóch typów wartościowych ................................................................. 121Porównanie dwóch typów referencyjnych ................................................................. 122Porównanie dwóch typów referencyjnych

z nadpisanym operatorem porównania .................................................................. 122Tolerancja: delta i procent ............................................................................................ 124Tolerancja: czas ............................................................................................................... 124Własna klasa obsługująca porównanie ....................................................................... 125Metody pomocnicze ...................................................................................................... 126

Operacje porównania ............................................................................................................ 126Własna klasa obsługująca porównanie ....................................................................... 127Należy do zakresu ........................................................................................................... 128

Złożenia ................................................................................................................................... 128Testowanie typów .................................................................................................................. 129Testowanie wyjątków ............................................................................................................ 131

Testowanie, czy kod wyrzucił wyjątek ........................................................................ 133Testowanie, czy kod nie wyrzucił wyjątku .................................................................. 135Testowanie parametru i komunikatu wyjątku ........................................................... 136Testowanie wewnętrznego wyjątku ............................................................................. 137

Typ tekstowy .......................................................................................................................... 137Kolekcje ................................................................................................................................... 138System plików ........................................................................................................................ 141Komunikaty ............................................................................................................................ 142

Własne komunikaty błędów ......................................................................................... 144Własne komunikaty informacyjne .............................................................................. 145Komunikat a nazwa testu .............................................................................................. 146

Współdzielenie danych ......................................................................................................... 147Kiedy korzystać ze współdzielenia danych? ............................................................... 148

Poleć książkęKup książkę

Page 7: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Spis treści 7

Testy parametryzowane ........................................................................................................ 150TestCase ........................................................................................................................... 151Values ............................................................................................................................... 152Range ................................................................................................................................ 154Random ........................................................................................................................... 154TestCaseSource ............................................................................................................... 155ValueSource .................................................................................................................... 160Testy oparte na zewnętrznych źródłach ...................................................................... 160

Strategie łączenia wartości testowych ................................................................................. 161Test kombinatoryczny ................................................................................................... 161Test sekwencyjny ............................................................................................................ 162Test par ............................................................................................................................ 163

Teorie ...................................................................................................................................... 166Testowanie klas generycznych ............................................................................................. 170

Zasada podstawienia Liskov ......................................................................................... 172Testowanie wywołań asynchronicznych ............................................................................ 174Równoległe uruchamianie testów ....................................................................................... 178

Poziom zrównoleglenia ................................................................................................. 179Kiedy zrównoleglić uruchamianie testów? ................................................................. 179

Pozostałe atrybuty ................................................................................................................. 179Sterowanie wątkiem ....................................................................................................... 180Kategoria testu ................................................................................................................ 180Atrybuty informacyjne .................................................................................................. 182Przekazywanie parametrów .......................................................................................... 182Ignorowanie testów ........................................................................................................ 183Kolejność wykonywania testów ................................................................................... 185Ustawienia regionalne ................................................................................................... 185Powtarzanie testu ........................................................................................................... 188Czas wykonywania testu ............................................................................................... 189Platforma ......................................................................................................................... 190Atrybuty a testy parametryzowane .............................................................................. 192

Podsumowanie ....................................................................................................................... 192

Rozdział 10. Testowanie zależności i atrapy obiektów ........................................ 193Ręczne tworzenie atrapy ....................................................................................................... 195

Kryterium akceptacji nr 1: wiek klienta niższy niż 18 lat ......................................... 196Kryterium akceptacji nr 2: wiek klienta większy bądź równy 18 lat ....................... 198Kryterium akceptacji nr 3: jeśli obiekt klienta jest nullem, to wyrzuć wyjątek ..... 200Podsumowanie ............................................................................................................... 200

Poleć książkęKup książkę

Page 8: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

8 TDD. Techniki programowania sterowanego testami

Wprowadzenie do frameworku Moq .................................................................................. 201Składnia imperatywna i deklaratywna ................................................................................ 202

Składnia imperatywna ................................................................................................... 203Składnia deklaratywna ................................................................................................... 204Wybór składni ................................................................................................................ 205

Atrapa rekursywna (recursive mock) ................................................................................. 205Tryb zachowania właściwości (stubbing) ........................................................................... 206Zwracanie domyślnej wartości ............................................................................................. 207Atrapa z sekwencyjnym rezultatem .................................................................................... 208Tryb zachowania atrapy (MockBehavior) .......................................................................... 209Przekazywanie parametrów w metodzie (argument matchers) ...................................... 210

Ponowne użycie matcherów ......................................................................................... 215Weryfikacja wywołań ............................................................................................................ 216

Weryfikacja wywołania metody ................................................................................... 217Weryfikacja dostępu i zapisu właściwości .................................................................. 219Testować stan czy zachowanie? .................................................................................... 220Komunikat błędu ........................................................................................................... 221Podsumowanie ............................................................................................................... 222

Wywołanie zwrotne: Callback ............................................................................................. 222Podsumowanie ............................................................................................................... 224

Wywołanie składowej bazowej: CallBase ........................................................................... 224Atrapa wyrzucająca wyjątek ................................................................................................. 226Inne poziomy dostępności ................................................................................................... 227

protected .......................................................................................................................... 228internal ............................................................................................................................. 229Podsumowanie ............................................................................................................... 229

Klasyfikacja atrap ................................................................................................................... 230Dummy ............................................................................................................................ 230Stub ................................................................................................................................... 232Fake .................................................................................................................................. 233Mock ................................................................................................................................ 235Spy .................................................................................................................................... 235Podsumowanie ............................................................................................................... 236

Ograniczenia Moqa ............................................................................................................... 237Tworzenie atrap dla klas i metod statycznych ................................................................... 238Rodzaje bibliotek do tworzenia atrap ................................................................................. 241

Constrained ..................................................................................................................... 241Unconstrained ................................................................................................................ 241Constrained czy unconstrained? .................................................................................. 242

Podsumowanie ....................................................................................................................... 243

Poleć książkęKup książkę

Page 9: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Spis treści 9

Rozdział 11. Dobre praktyki pisania testów jednostkowych ................................. 245Test powinien być szybki, bardzo szybki! .......................................................................... 246Testy powinny być odizolowane i niezależne od siebie .................................................... 247Test powinien być powtarzalny ........................................................................................... 247Test powinien być deterministyczny .................................................................................. 248Test nie powinien mieć zależności zewnętrznych ............................................................. 248Test nie powinien mieć konfiguracji ................................................................................... 249Wynik testu nie powinien być interpretowany ................................................................. 249Test nie powinien być pusty ................................................................................................. 250Zalążek kodu powinien wyrzucać wyjątek ......................................................................... 250Test powinien mieć jedną logiczną asercję ........................................................................ 251Testy nie powinny być dyskryminowane ........................................................................... 251Testy powinny być podzielone według kategorii .............................................................. 251Test powinien mieć strukturę Arrange-Act-Assert .......................................................... 251Test powinien obejmować ścieżki optymistyczne i przypadki brzegowe ...................... 252Test powinien mieć odpowiednią nazwę ........................................................................... 252Testowane powinny być tylko publiczne składowe .......................................................... 252Test powinien oczekiwać konkretnego typu wyjątku ....................................................... 253Test powinien oczekiwać wyjątku w konkretnym wyrażeniu ......................................... 253Test nie powinien zawierać instrukcji warunkowych i pętli ............................................ 253Test powinien mieć wartości oczekiwane wpisane „na sztywno” ................................... 254Test powinien mieć asercję ................................................................................................... 255Test powinien być nieskomplikowany ............................................................................... 255Test nie powinien być „przespecyfikowany” ..................................................................... 256Test nie powinien zawierać metod z atrybutami SetUp i TearDown ............................. 257Klasa testowa powinna być bezstanowa ............................................................................. 257Komunikaty asercji nie powinny być nadmiarowe ........................................................... 258Podsumowanie ....................................................................................................................... 259

Rozdział 12. TDD i istniejący kod ....................................................................... 261Refaktoryzacja bezpieczna i mniej bezpieczna .................................................................. 261

Przykład bezpiecznej refaktoryzacji ............................................................................. 264Dodawanie testów do istniejącego kodu ............................................................................ 271

Gdzie zacząć dodawać testy? ......................................................................................... 271Jak pisać testy? ................................................................................................................ 272Narzędzia ......................................................................................................................... 274

Podsumowanie ....................................................................................................................... 275

Poleć książkęKup książkę

Page 10: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

10 TDD. Techniki programowania sterowanego testami

Rozdział 13. Pokrycie kodu testami ................................................................... 277Co to jest pokrycie kodu testami? ........................................................................................ 277Narzędzia do mierzenia pokrycia kodu .............................................................................. 278W ile procent pokrycia powinniśmy celować? .................................................................. 281

Przykłady „fałszywych” testów o stuprocentowym pokryciu kodu ........................ 281Podsumowanie ....................................................................................................................... 283

85%, 90% czy 100%? ...................................................................................................... 283Pokrycie kodu jako narzędzie do identyfikowania brakujących testów ................. 284

Rozdział 14. Ciągła integracja ........................................................................... 285Serwer ciągłej integracji ........................................................................................................ 286Ciągła dostawa i ciągłe wdrażanie ....................................................................................... 288Podsumowanie ....................................................................................................................... 289

Dodatek A. Biblioteki do testowania ................................................................. 291

Dodatek B. Biblioteki do tworzenia atrap .......................................................... 293

Dodatek C. Biblioteki do mierzenia pokrycia kodu testami .................................. 297

Dodatek D. Testy z danymi zewnętrznymi — przypadek użycia ........................... 299

Dodatek E. Rozszerzalność NUnita ..................................................................... 303Atrybut informacyjny ........................................................................................................... 305Atrybut umożliwiający współdzielenie danych ................................................................. 307

Dodatek F. Bibliografia .................................................................................... 311Źródła internetowe ................................................................................................................ 314

Skorowidz ...................................................................................................... 319

Poleć książkęKup książkę

Page 11: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

PodziękowaniaTę książkę dedykuję mojej fantastycznej Żonie Agnieszce, kochającym Rodzicom orazwspaniałemu Bratu.

Dziękuję Ani Merak, Łukaszowi Oliwie i Patrykowi Spytkowskiemu za wysiłek włożonyw dodatkową korektę książki. Dziękuję też Markowi Krzemińskiemu za pomysł naksiążkę i motywację do jej pisania.

Chciałbym też podziękować całej mojej rodzinie, wszystkim przyjaciołom, współpracowni-kom oraz ludziom, z którymi zamieniłem parę zdań czy kilka słów.

Dziękuję też Tobie, Czytelniku, że zdecydowałeś się na lekturę tej książki. Mam ogromnąnadzieję, że znajdziesz tutaj wiele informacji, które wykorzystasz w swojej pracy pro-gramisty i rozwoju w tym kierunku. Mam też nadzieję, że lektura tej książki będzie dlaCiebie czystą przyjemnością!

Poleć książkęKup książkę

Page 12: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

12 TDD. Techniki programowania sterowanego testami

Poleć książkęKup książkę

Page 13: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

PrzedmowaJakie jest najważniejsze zadanie programisty? Jedni powiedzą, że napisanie działającegokodu. Ja uważam jednak, że działający kod jest jedynie efektem ubocznym naszej pracy.Przede wszystkim powinniśmy tworzyć kod utrzymywalny. Dzięki temu poprawienieniedziałających rozwiązań nie stanowi karkołomnego wyczynu na miarę wyprawy naMount Everest, a rozwijanie systemów informatycznych staje się procesem przewidywal-nym, przyjemnym i — co niezmiernie istotne — jego koszt jest niezmienny w czasie.

Testowanie oprogramowania to praktyka wspomagająca nas w tych staraniach. Jedneśrodowiska bezdyskusyjnie stosują i promują pisanie testów, nieustannie dbając o swójrozwój w tym zakresie. Inne natomiast kwestionują sensowność takiego podejścia.

Negatywne nastawienie programistów do pisania testów często wynika z niewiedzy i brakuodpowiedniej ścieżki nauki. Jest to trudna umiejętność, wymagająca praktyki i nakładuczasu. Niejednokrotnie trzeba popełnić wiele błędów i wyciągnąć z nich wnioski, by finalnieodnieść długoterminowe korzyści. Aspekt edukacji w zakresie tej sztuki jest często po-mijany, a bez tego żadna zaawansowana technika nie ma szans na spełnienie oczekiwań.

Testy nie są lekiem na całe zło. Samo ich pisanie nie gwarantuje natychmiastowego wy-eliminowania błędów. Dopiero stopniowe, świadome i konsekwentne pogłębianie wie-dzy skutkuje usprawnieniem procesu wytwarzania oprogramowania oraz niezmiernieułatwia jego rozwój, utrzymanie i modyfikację.

Umiejętność pisania wartościowych testów jednostkowych to jedna z najpewniejszychinwestycji, na jaką może zdecydować się programista.

— Maciej Aniserowicz, autor książki Zawód: Programista i bloga devstyle.pl

Poleć książkęKup książkę

Page 14: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

14 TDD. Techniki programowania sterowanego testami

Poleć książkęKup książkę

Page 15: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Cytaty o TDDKod bez testów to zły kod. Nie ma znaczenia, jak dobrze jest napisany; nie ma znaczenia,jaki jest ładny, jak bardzo zorientowany obiektowo czy też jak mocno hermetyczny. Zapomocą testów możemy zmienić zachowanie naszego kodu szybko i w sposób weryfikowalny.Bez nich tak naprawdę nie wiemy, czy kod zmierza ku lepszemu czy ku gorszemu.

— Michael Feathers, Praca z zastanym kodem. Najlepsze techniki

TDD nie jest po to, by pisać dobry kod, lecz raczej po to, by nie pisać złego kodu.— Nat Pryce, Growing Object Oriented System Guided by Tests

Zdarza się często — i zdarzać się będzie — że TDD implementowane jest w kodzie nie-wyposażonym w należyty zestaw testowy. A jeżeli tak, to może się również zdarzyć, żeprzy refaktoryzacji kodu popełnisz błąd i nie zostanie on wykryty, bo wszystkie istniejącetesty nadal będą zaliczane.

Refaktoryzacja stanie się więc niepewna, zatem ograniczysz ją do minimum. Twój pro-jekt stanie się zagmatwany i także niepewny, Twoje samopoczucie się pogorszy, Twojaproduktywność spadnie, zostaniesz zwolniony z pracy. Opuści Cię Twój pies, przestanieszsię należycie odżywiać. Nabawisz się awitaminozy, szkorbutu i chorób przyzębia. Zatem,przynajmniej w trosce o swe uzębienie, myśl retroaktywnie o testowaniu przed refakto-ryzacją.

— Kent Beck, TDD. Sztuka tworzenia dobrego kodu

Najlepszym znanym mi sposobem pisania kodu jest kształtowanie go od początku zapomocą testów.

— Ron Jeffries, jeden z twórców programowania ekstremalnego

Najlepsze w TDD jest to, że metoda ta zapewnia, iż kod robi to, co programista myśli, żekod powinien robić.

— James Grenning

Poleć książkęKup książkę

Page 16: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

16 TDD. Techniki programowania sterowanego testami

Testy czarnej skrzynki dowodzą, że kod pisany z zastosowaniem metody TDD ma lepsząjakość niż kod pisany według tradycyjnego, kaskadowego modelu.

— Boby George i Laurie Williams,An Initial Investigation of Test Driven Development in Industry

Kiedy ludzie pytają mnie, jak pisać lepszy kod, zawsze im odpowiadam: pisz testy jed-nostkowe. (…) Testowanie kodu nauczy cię, jak budować oprogramowanie.

— Scott Allen

Poleć książkęKup książkę

Page 17: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

WstępW języku japońskim istnieje pojęcie kaizen, które utożsamiane jest z filozofią nieustannychmałych kroków i drobnych poprawek. Jest to przeciwieństwo filozofii kaikaku, któraoznacza radykalną zmianę.

Zastanówmy się nad słowem kluczem, którym jest zmiana. Zmiana dla programisty możeoznaczać nie tylko zmianę zawodu, technologii, stosowanych narzędzi, ale także zmianęw procesie wytwarzania oprogramowania czy zmianę metody programowania.

Zacznijmy od tej dużej zmiany, rewolucyjnej, kaikaku. Przykład? Wdrożenie frameworkuScrum w zespole. Przed wdrożeniem zespół znajduje się w sytuacji, do której jest przy-zwyczajony, nie ponosi żadnego ryzyka związanego ze zmianami, doskonale wie, co goczeka dnia następnego. Status quo jest nienaruszone. Gdy pojawia się chęć zmian — a teczęsto wprowadzane są odgórnie (element obcy) — rodzi się opór wewnątrz zespołu.Niekiedy nieznane są powody zmian, a bardzo często nie są znane również podstawyi wartości, które kryją się za tymi zmianami. Duże zmiany mogą stwarzać niekomfortowewarunki i powodować irracjonalne zachowania, których efektem jest na przykład lekce-ważenie nowego procesu czy brak chęci do jego zrozumienia. Po tym etapie następujefaza chaosu, w której zespół zdaje się pracować poza jakąkolwiek kontrolą. Spotkaniaprzebiegają często bez ładu i składu. Zespół może obrać strategię powrotu do poprzed-niego stanu za wszelką cenę lub strategię jak najszybszego wyjścia z tego stanu. Bywa, żete dwie strategie przenikają się w ramach zespołu i formują się dwa bastiony: jeden gotowyna zmiany, a drugi pragnący powrotu do stanu sprzed wprowadzenia zmian. Wraz z po-jawieniem się idei zmian zespół zaczyna wychodzić z chaosu, a proces zmiany się stabili-zuje. Gdy nowe pomysły zostaną zintegrowane, rodzi się nowe status quo, nowy stan,nowa strefa komfortu.

Jest to wzorcowy model według teorii Virginii Satir (rysunek W.1) [Appelo, 2010; Goździe-niak, 2015; Brodziński, 2015]. Powyższy scenariusz wiąże się z wprowadzeniem zbyt du-żej zmiany bądź zbyt dużej ilości zmian, oczekiwaniem zbyt krótkiego czasu na poprawęefektywności oraz wprowadzeniem zmian bez moderacji lub z moderacją nieudolną. Ozna-cza to również ryzyko w związku z wprowadzeniem zmiany, gdyż na etapie chaosu ze-spół może wycofać się ze zmian i powrócić do swojego poprzedniego stanu.

Poleć książkęKup książkę

Page 18: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

18 TDD. Techniki programowania sterowanego testami

RYSUNEK W.1. Model zmian według Virginii Satir1

Ale czy tak zawsze musi wyglądać każda zmiana?

W podejściu ewolucyjnym, kaizen, stosujemy metodę niewielkich kroków. WdrożenieScruma? Można to zrobić w następujący sposób:

Zespół analizuje poszczególne elementy Scruma i zaczyna je stosować,ale niekoniecznie wszystkie naraz.

Zespół i kierownictwo nie powinny oczekiwać natychmiastowych efektówi błyskawicznego wzrostu wydajności.

Zespół zbiera informacje zwrotne dotyczące każdej zmiany i adaptuje jedo aktualnego środowiska.

Jeżeli zastosowanie pewnej zmiany w pewnym czasie wpłynęło negatywnie nazespół, można rozważyć ponowną próbę jej wprowadzenia. Ta sama praktyka,która nie zadziałała wcześniej, może okazać się skuteczna w nowym kontekście.

Nie każda zmiana wpływa pozytywnie na proces, ale dzięki temu, że jest mała,zespół uzyskuje szybką informację zwrotną na jej temat i może szybciej zareagowaći zaadaptować się do nowej sytuacji.

1 Na podstawie: https://www.flickr.com/photos/jurgenappelo/5201852636/in/album-

72157625328824303/

Poleć książkęKup książkę

Page 19: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Wstęp 19

Główna idea filozofii kaizen to drobne poprawki w procesie. Pozwalają one skuteczniewyeliminować fazę chaosu w modelu zmiany i nie wiążą zmiany z nagłą degradacją wy-dajności. Model małych zmian naniesiony na model Virginii Satir został przedstawionyna rysunku W.2.

RYSUNEK W.2.Dzięki filozofiimałych zmian,kaizen, możemyuniknąćetapu chaosui utrzymaćcoraz lepsząefektywnośćw czasie

Należy pamiętać o jeszcze jednej, bardzo ważnej kwestii. Otóż nie ma globalnego optimum,do którego moglibyśmy zmierzać, są za to lokalne optima. A zatem zmiana procesu i jegopoprawa to proces nieustanny, ciągły2.

Kaizen i kaikaku to nie tylko zmiany zespołowe i nie tylko związane z procesem tworze-nia oprogramowania. Filozofię małych kroków, drobnych poprawek i unikania nagłych,dużych zmian można przenieść na grunt życia osobistego i własnego rozwoju.

Test-Driven Development — najpierw piszemy test, później kod, a na końcu dokonuje-my refaktoryzacji. Cykl bardzo zwięzły i prosty do zapamiętania, prawda? Tak, to prawda.Z TDD związana jest jednak konieczność zmiany…

Przewodnik po książceNiniejsza książka podzielona jest na rozdziały, które umożliwiają efektywną naukę, wpro-wadzając Czytelnika w metodę Test-Driven Development krok po kroku.

Pierwszy rozdział jest wprowadzeniem do tematyki TDD. Opisuję w nim historycznykontekst tej metody i podstawy, na których ją wykreowano. Szybko dowiesz się, czym jestcykl Red-Green-Refactor, i poznasz sposób pisania według tej techniki.

2 Jeśli ciekawi Cię ten proces, to polecam wyszukać w internecie hasło fitness landscapes.

Poleć książkęKup książkę

Page 20: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

20 TDD. Techniki programowania sterowanego testami

W kolejnych rozdziałach przejdziemy do rozważań teoretycznych, w których skupimysię na tym, jakie korzyści może nam przynieść TDD, a z czym mogą być kłopoty. Przyj-rzymy się też najczęściej zadawanym pytaniom, na które niekiedy nie ma jedynej dobrejodpowiedzi.

Następnie przejdziemy do tematów praktycznych. Napiszemy pierwsze testy jednostko-we i przyjrzymy się dokładnie bibliotece do testowania i bibliotece do tworzenia atrap.Potem omówię wzorce i antywzorce w świecie testów jednostkowych. Dowiesz się również,jakie strategie zastosować w pracy z kodem już istniejącym.

W dwóch ostatnich rozdziałach omówię pokrycie kodu testami oraz systemy ciągłej in-tegracji, ciągłej dostawy i ciągłego wdrażania.

W pięciu dodatkach do książki zamieściłem informacje na temat bibliotek do testowa-nia, tworzenia atrap i mierzenia pokrycia kodu dla .NET. Omówiłem również scenariusztestów z danymi zewnętrznymi i bardzo prosty przykład sposobu rozszerzenia bibliotekiNUnit o nowe funkcje.

Dla kogo jest ta książka?Książka jest skierowana głównie do programistów chcących poznać metodę TDD i testyjednostkowe.

W jakim stopniu muszę umieć programować?Warunkiem koniecznym do zrozumienia idei zawartych w tej książce jest podstawowedoświadczenie w zakresie programowania zorientowanego obiektowo. TDD wymagamyślenia obiektowego, a zatem Czytelnik powinien znać podstawy obiektowości.

Nie jestem programistą C#.Czy ta książka ma jakąś wartość dla mnie?Część teoretyczna książki jest uniwersalna i ma zastosowanie w przypadku każdego ję-zyka programowania. Część praktyczna również, ale wymaga zrozumienia języka C#.Ćwiczenia praktyczne można wykonywać poprzez analogię do rozwiązań występują-cych w bibliotece tego właśnie języka. A zatem odpowiedź brzmi: tak! Przykłady zawartew tej książce napisane są w języku C#, ale nie znaczy to, że jedynie programiści tego ję-zyka mogą z niej korzystać.

C# jest językiem prostym w czytaniu i rozumieniu. Rozdziały traktujące o konkretnychrozwiązaniach w bibliotekach NUnit i Moq zostały zatytułowane tak, aby osoba szukają-ca informacji dla innej biblioteki i innego języka mogła znaleźć je w prosty i bezbolesnysposób. W gestii Czytelnika pozostaje wyszukanie odpowiednika w stosowanej przez niego

Poleć książkęKup książkę

Page 21: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Wstęp 21

bibliotece. Pisząc tę książkę, miałem to na względzie i wyszukiwałem analogiczne tematy,ale dla innych bibliotek. Przykładem jest rozdział z NUnitem i testami parametryzowanymi.Chcąc odnaleźć tę samą funkcję dla biblioteki JUnit (Java), należy wpisać w wyszukiwarceinternetowej frazę JUnit Parameterized tests. Zazwyczaj pierwsze rezultaty będą pro-wadzić do dokumentacji biblioteki lub odpowiedzi na Stack Overflow, a to w zupełnościwystarczy.

Co, jeśli moja ulubiona biblioteka w moim ulubionym języku nie oferuje funkcji zawar-tej w książce? Cóż, jeżeli jesteś dobrym programistą, nie będzie to dla Ciebie przeszkodą.W takiej sytuacji możesz wykonać jeden z następujących kroków:

wykorzystanie innych funkcji języka programowania lub biblioteki, aby osiągnąćten sam cel;

własna implementacja funkcji w bibliotece;

własna implementacja funkcji w bibliotece i kontakt z autorem biblioteki,a jeśli jest to biblioteka oparta na otwartym źródle, pull request do repozytorium;

stworzenie własnej biblioteki.

Jeśli implementacja jest zbyt trudna, biblioteka nie jest oparta na otwartym źródle lubnie masz czasu na dopisanie nowych funkcji, to pozostaje kontakt z innymi programi-stami, np.:

wspólna sesja w ramach swojego zespołu programistycznego i kolektywna próbarozwiązania problemu;

kontakt z autorem biblioteki i pytanie o możliwe rozwiązania;

kontakt ze społecznością, np. Stack Overflow, repozytorium danej bibliotekina GitHubie (społeczność anglojęzyczna), 4programmers.net (społecznośćpolskojęzyczna).

Umiem pisać testy jednostkowe i znam TDD.Czy ta książka jest dla mnie?Testy jednostkowe można pisać według techniki TDD lub bez jej stosowania. Bardzoczęsto, gdy prowadziłem ćwiczenia z tego tematu, okazywało się, że programista po-twierdzający znajomość TDD tak naprawdę nie stosował cyklu Red-Green-Refactor. Cowięcej, był zaskoczony iteracyjnym podejściem do pisania kodu, co jest przecież klu-czową kwestią w TDD. A zatem nie do końca znał TDD.

Ponadto testy jednostkowe można pisać podobnie jak kod, ale jak zweryfikować, czy sąone poprawne i cechuje je wysoka jakość? Czy aby na pewno wszystkie zależności są za-stąpione atrapami? A co z kwestiami pokrycia kodu testami i ciągłej integracji? Czy Twój

Poleć książkęKup książkę

Page 22: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

22 TDD. Techniki programowania sterowanego testami

zespół ma postawiony cel osiągnięcia określonego pokrycia kodu testami? Czy ma tosens? Czy za każdą zmianą w repozytorium uruchomiony zostaje cały zestaw testówjednostkowych dla aplikacji?

W istocie, praktykując dane zagadnienie, często robimy to źle lub moglibyśmy robić tolepiej. Skąd możemy otrzymać informację zwrotną na temat ewentualnych poprawek?Możemy przedyskutować pewne zagadnienia w ramach zespołu, możemy taką dyskusjęprzeprowadzić z innymi programistami i innymi zespołami, możemy również zdać się nawłasną analizę tematu i wykorzystać dostępne źródła. Ta książka pozwala zrozumieć wielekwestii, które bywają pomijane w rozważaniach o testach automatycznych. Jest to jedno zeźródeł, które dostarczy Ci informacji zwrotnej na temat tego, czy wykonujesz swoją pracęprawidłowo.

Warto zrobić rachunek sumienia i spróbować zidentyfikować brakujące obszary wiedzyw zakresie testowania automatycznego, testów jednostkowych i Test-Driven Development.A ta książka Ci w tym pomoże!

Jestem menadżerem/dyrektorem/właścicielem(a więc nie programuję), a mój zespół chce wdrożyć TDD.Czy z tej książki dowiem się, czy warto?Książka jest skierowana do programistów i mocno przesiąknięta kodem źródłowym. Jeśliinteresuje Cię Test-Driven Development z punktu widzenia czysto biznesowego, to te-mu zagadnieniu poświęconych jest kilka rozdziałów. Przede wszystkim zachęcam doprzejrzenia biznesowych przypadków użycia, które umieściłem w książce. Scenariusze,w których nie ma czasu na TDD i testy automatyczne, brakuje czasu na naukę nowychtechnik, trzeba dostarczać oprogramowanie szybko i na czas, są bardzo typowe dla bran-ży programistycznej i poświęciłem tym zagadnieniom kilka podrozdziałów. W szczegól-ności pomocne będą następujące podrozdziały: „Błędy w oprogramowaniu” (rozdział 1.),„Co zyskujemy dzięki TDD?” (rozdział 2.) oraz „Trudności przy wdrażaniu TDD” (roz-dział 3.).

Jestem manualnym testerem. Czy powinienem znać TDD?Test-Driven Development to technika dla programisty. Jeśli jesteś testerem ręcznym i inte-resujesz się tematyką programowania oraz chcesz rozwijać to zainteresowanie, to ta książkajest również dla Ciebie.

Bardzo dobrą techniką nauki jest coding dojo (więcej na jej temat przeczytasz w podroz-dziale „Ścieżka nauki” rozdziału 3.). Jeżeli Twój zespół praktykuje dojo lub ćwiczeniao podobnej formie, nie wahaj się dołączyć. Programiści są zazwyczaj pomocni i z chęciądzielą się swoją wiedzą z innymi. Znam przypadki, w których w coding dojo uczestniczyłcały zespół, łącznie z testerami ręcznymi, analitykiem biznesowym i… menadżerem! Nie

Poleć książkęKup książkę

Page 23: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Wstęp 23

wszyscy na co dzień pracowali w środowisku programistycznym, ale to nie jest istotne.Istotne jest stworzenie środowiska do nauki, w którym osoby zarówno mniej, jak i bardziejdoświadczone mogą uczestniczyć we wspólnym procesie tworzenia oprogramowania.A jeżeli zespół nie praktykuje coding dojo, zachęcam do podjęcia tematu i zaproponowaniatakich sesji (jedna godzina tygodniowo powinna być łatwa do wygospodarowania).

Kontekst jest królemContext is king, w języku polskim „kontekst jest królem”, to znane powiedzenie, którebardzo lubię. Wskazuje ono, jak bardzo istotne jest zrozumienie kontekstu danego pojęcia.Test-Driven Development to dziedzina, w której pojęcia nie są unormowane i bywająużywane zamiennie, w zależności od kontekstu. Doskonale obrazuje ten fakt tabela 10.3umieszczona w podrozdziale „Klasyfikacja atrap” rozdziału 10. W jednym kontekście(książki, aplikacji, źródła internetowego) to samo pojęcie może mieć inne znaczenie niżw innym kontekście. Jest to źródłem wielu problemów ze zrozumieniem pewnych sche-matów. A, paradoksalnie, Test-Driven Development ma przecież służyć rozwiązywaniuproblemów z niejednoznacznością wymagań biznesowych i zawartych w nich pojęć.

Poza nomenklaturą związaną z klasyfikacją atrap istnieje jeszcze kilka pojęć, którechciałbym omówić, aby ich rozumienie było całkowicie jednoznaczne.

Atrapa to mock czy test double?

W niniejszej książce atrapa to test double, czyli zamiennik zależności, którą chcemy imito-wać. Do grupy atrap należą wszystkie typy test double, czyli dummy, stub, fake, mock, spyitd. (niektóre źródła czy biblioteki mogą zawierać jeszcze inne typy atrap).

Należy mieć to na uwadze z dwóch powodów.

Po pierwsze, biblioteka do tworzenia atrap, którą opisuję w tej książce, to Moq. W Moqunie ma rozróżnienia na typy atrap, a wszystko, co tworzymy za pomocą tej biblioteki,jest mockiem. Zatem w kontekście tej biblioteki mock to atrapa, a atrapa to mock. W pracynad atrapami w polskojęzycznych zespołach rzadko stosuje się polskie słowo „atrapa”czy angielskie wyrażenie test double, dlatego używam spolszczenia „mockować”.

Po drugie, polska Wikipedia tłumaczy hasło mock object z angielskiej wersji encyklope-dii jako „atrapa obiektu”. Hasło test double nie ma natomiast odpowiednika w polskoję-zycznej Wikipedii. W literaturze polskiej test double zwykle nie ma tłumaczenia, a pojęcie towystępuje na przykład jako obiekt test double [Martin, 2010]. Tłumaczenia pojęć mocki test double w kontekście niniejszej książki przedstawia tabela W.1.

Poleć książkęKup książkę

Page 24: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

24 TDD. Techniki programowania sterowanego testami

TABELA W.1. Tłumaczenia pojęć mock i test double w kontekście niniejszej książki

Pojęcie (j. ang.) Kontekst Tłumaczenie na j. polski

test double niniejsza książka w kontekście ogólnym atrapa

niniejsza książka w kontekście biblioteki Moq atrapa, mockmock

jeden z typów test double imitacja

xUnit a xUnit.netxUnit to rodzina bibliotek do tworzenia testów jednostkowych. Powstały one na bazieopracowanego w 1998 roku przez Kenta Becka frameworku SUnit dla języka Smalltalk.

xUnit.net to jedna z bibliotek do tworzenia testów jednostkowych dla frameworku.NET.

Funkcja a funkcjonalność oraz funkcyjny a funkcjonalnyW języku polskim słowo „funkcjonalność” bywa niekiedy używane jako synonim słowa„funkcja”. Oto co można przeczytać na ten temat w Poradni Językowej PWN:

„(…) rozróżnienie na funkcję i funkcjonalność w języku specjalistycznymnie wzięło się znikąd — w świecie IT czym innym jest funkcja, a czym innymfunkcjonalność. Jednak zwykłym ludziom, którzy korzystają z karty kredytowej,Facebooka czy smartfona po to, by ułatwić sobie życie, odróżnienie na funkcjęi funkcjonalność zapewne nie jest potrzebne. Możliwość robienia zdjęć telefonemkomórkowym jest dla mnie funkcją tego telefonu, mimo że jego sprzedawcapróbował mnie przekonać, że to jego funkcjonalność. Dla informatyka funkcjajest terminem, który znaczy trochę coś innego niż dla osoby, która nie zna tejterminologii. Zawsze na styku takich użyć (specjalistyczne — niespecjalistyczne)dojdzie do pewnych nieścisłości (np. potocznie używa się nazwy depresja naoznaczenie bardzo złego nastroju, a dla lekarza jest to choroba mająca określonecechy) i nic na to nie poradzimy”. [Kłosińska, 2017]

W niniejszej książce zastosowałem się do zacytowanej rady, a zatem nie mówimy o funk-cjonalnościach aplikacji, lecz o jej funkcjach. Funkcja ma też znaczenie programistycznew kontekście podprogramu.

Istnieją również pojęcia „język funkcyjny” i „test funkcjonalny”. Ich definicje zamieściłemw tabeli W.2.

Poleć książkęKup książkę

Page 25: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Wstęp 25

TABELA W.2. Definicje pojęć zastosowanych w książce związanych z funkcją, funkcyjnościąi funkcjonalnością

Pojęcie Kontekst

funkcja 1) zadanie, które spełnia dana rzecz (mylone z funkcjonalnością danej rzeczy)

2) wydzielona część programu, podprogram

język funkcyjny odmiana programowania deklaratywnego

test funkcjonalny test oparty na elementach, które są bezpośrednio związane z funkcją aplikacji

SynonimyJeśli chodzi o pozostałe kwestie językowe, poniższe pojęcia są w niniejszej książce stoso-wane wymiennie, chociaż nie zawsze są synonimami:

biblioteka, framework;

program, aplikacja, projekt, system;

API, interfejs programowania aplikacji;

implementacja, logika biznesowa;

test spełniony, test green, test zielony itp.;

test niespełniony, test red, test czerwony itp.

Jak uczyć się metody Test-Driven Development?TDD jest metodą, która wymaga nauki zarówno w kwestiach teoretycznych, jak i prak-tycznych. Owszem, sam cykl jest łatwy do zapamiętania i na rozmowie o pracę szybkogo powtórzymy: najpierw test, później kod, a na koniec refaktoryzacja! Proste, prawda?Aby nauczyć się tej metody lub polepszyć swoje umiejętności w tym zakresie, należyprzede wszystkim sporo ćwiczyć. Książka zawiera sporo przykładów praktycznych, którychzrozumienie może okazać się trudne przez samo czytanie. Dlatego zachęcam do wyko-nania analogicznych kroków, eksperymentowania i zabawy z kodem, który jest opisanyw danym dziale. Wymaga to więcej czasu, ale sprawia, że proces uczenia się jest bardziejefektywny. Czy należy przepisać każdą linijkę kodu zawartą w książce? Nie, bynajmniej!Najlepiej, rozpoczynając lekturę książki, stworzyć własną solucję, która będzie swoistą pia-skownicą, miejscem służącym do uruchamiania testów i eksperymentowania z kodem.

Co można zrobić po przeczytaniu książki, aby lepiej poznać tematykę? Jeśli zacznieszstosować TDD w praktyce, Twoja wydajność może z początku być niższa. Jest to natu-ralne w procesach nauki, i to nie tylko tych powiązanych z programowaniem. Z czasemTwoja wydajność będzie wzrastać, a korzyści płynące ze stosowania TDD, takie jak lep-sza jakość kodu i mniejsza ilość defektów, staną się widoczne.

Poleć książkęKup książkę

Page 26: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

26 TDD. Techniki programowania sterowanego testami

Dobrze jest szukać miejsca do zastosowania TDD w swoim miejscu pracy, jeśli metodata nie jest jeszcze praktykowana (należy jednak przedyskutować taką decyzję z zespołemi przełożonym). Nic nie stoi na przeszkodzie, aby zastosować TDD również do swoichwłasnych projektów. A jeżeli nie mamy własnego projektu, to możemy taki wymyślić,stworzyć i go opublikować lub po prostu wyrzucić. Nie musi to być skomplikowanyprojekt, wystarczy mały zestaw pomocniczych metod. Chodzi o to, aby metodykę TDDpraktykować po przeczytaniu tej książki.

Warto też zastanowić się nad stworzeniem miejsca do nauki i rozwoju w swoim miejscupracy. I nie mówię tutaj tylko o TDD. Wspólne dyskusje, prezentacje, ćwiczenia (np. co-ding dojo, kata) związane z programowaniem, testowaniem aplikacji i dziedzinami po-chodnymi co najmniej raz w tygodniu przez godzinę mogą przynieść sporo korzyściobecnemu projektowi. To na tego typu spotkaniach mogą zrodzić się pomysły na udo-skonalenie aplikacji w zakresie jej testowania, automatyzacji, jakości itd. Nie musi to teżbyć kontekst projektu, nad którym się obecnie pracuje. Nauka TDD, ATDD, BDD, pro-gramowania funkcyjnego itp. może również przynieść wymierne efekty, jeśli wartośćbiznesowa tej nauki zostanie przeniesiona na grunt projektu. Wymiar nauki ma takżeaspekt rozwojowy. Dziedzina programowania jest skomplikowana i dynamiczna, a wspólnanauka może podnieść kwalifikacje zespołowe. Dlatego gorąco zachęcam do jej praktykowa-nia (pamiętać należy o akceptacji ze strony przełożonego i zaproszeniu go do udziału).

Nie należy również zapominać o takich praktykach jak inspekcje kodu i programowaniew parach, pozwalają one bowiem podnieść poziom osób uczących się różnych zagad-nień, w tym również metody TDD.

DogmatGłównym tematem książki jest TDD, ale czy to oznacza, że zawsze należy korzystać z tejmetodyki? Odpowiedź brzmi: nie!

Co w przypadku, gdy ktoś preferuje pisanie testów jednostkowych po napisaniu imple-mentacji (odwrotnie niż w TDD), ale uzyskuje w efekcie kod wysokiej jakości i bardzodobre pokrycie testami? A co, jeśli projekt jest pokryty w 100% testami akceptacyjnymii jednocześnie ma wysokiej jakości kod? Czy wówczas powinno się narzucić w projekciepisanie testów jednostkowych i stosowanie TDD?

Należy pamiętać, że stosowanie TDD i pokrycie testami jednostkowymi stanowią drogędo celu, jakim są wysoka jakość kodu, brak obaw przed wprowadzeniem zmiany do sys-temu oraz niska liczba defektów. Cel ten można realizować za pomocą innych strategii, ta-kich jak Test-After Development lub Behavior-Driven Development. Dobre pokrycie testamijednostkowymi jest jednym ze sposobów (obecnie najpopularniejszym) na dotarcie dotego celu, nie zaś celem samym w sobie.

Poleć książkęKup książkę

Page 27: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Wstęp 27

Wiele kwestii z zakresu metody Test-Driven Development charakteryzuje się dowolno-ścią, dlatego decyzja o ich zastosowaniu należy do programisty lub zespołu. Przykładowo:czy powinno się tworzyć architekturę aplikacji w taki sposób, aby kod był testowalny? W tejksiążce napisałem, że nie powinno się testować niepublicznych składowych klasy (poza kil-koma wyjątkami). Można zadać kilka pytań w tej materii:

Czy kod powinien mieć publiczne API po to tylko, aby był testowalny?

Czy może powinno się tworzyć takie testy, które za pomocą już dostępnegopublicznego API pośrednio przetestują niepubliczne?

A może skorzystać należy z biblioteki umożliwiającej testowanie prywatnychskładowych?

Zasada testowania tylko publicznego API kieruje nas na tory konkretnego rozwiązania.Czy jest to najlepsze rozwiązanie? Odpowiedź na to pytanie pozostawiam Czytelnikowi.

Dlaczego o tym piszę? Każdy dobry programista powinien podawać w wątpliwość każdąregułę, każdą zasadę, każdy wzorzec i każdą metodykę, jakie napotka na swojej drodze.Spojrzenie dogmatyczne na sprawy związane z programowaniem niesie ze sobą dwaniebezpieczeństwa. Po pierwsze, kontekst jest królem, więc to, co sprawdziło się w jednymprojekcie, niekoniecznie ma sens w innym. Po drugie, programowanie to dziedzina bardzozłożona. Aby mogła się ona rozwijać, należy nieustannie podważać istniejące reguły gryi rozważać tworzenie nowych. Wymaga to sporego doświadczenia i kreatywności, alejednocześnie jest motorem rozwoju dziedziny oprogramowania.

Informacje zawarte w tej książce to wynikowa moich osobistych i zawodowych doświad-czeń i informacji zebranych z różnych źródeł, w tym innych książek, prac naukowychi najpopularniejszych odpowiedzi na Stack Exchange i Stack Overflow. TDD i zawartew tej książce pomysły nie stanowią dogmatu, lecz jedną z optymalnych i najbardziej po-pularnych ścieżek, której celem jest wytwarzanie wyśmienitego oprogramowania!

Narzędzia użyte w tej książceNarzędzia wykorzystane w książce są zgodne z moimi i — jak wynika z moich obserwacji —uniwersalnymi preferencjami. Nie znaczy to jednak, że musisz korzystać z tych samych.

Środowisko programistyczne użyte do napisania książki to Visual Studio Community 2017.Jest ono darmowe dla użytku własnego i komercyjnego w zakresie indywidualnym. Alter-natywą mogą być: JetBrains Rider (wersja płatna, 30-dniowa wersja próbna), Visual StudioCode (wersja darmowa) i MonoDevelop (wersja darmowa, środowisko wieloplatformowe).

Testy automatyczne były uruchamiane za pomocą JetBrains ReSharper (wersja płatna,30-dniowa wersja próbna) i NUnit 3 Test Adapter (darmowy dodatek do Visual Studio).

Poleć książkęKup książkę

Page 28: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

28 TDD. Techniki programowania sterowanego testami

Zamiast nich można wykorzystać oficjalne środowisko uruchomieniowe bazujące nakonsoli — NUnit Console Runner (wersja darmowa).

Biblioteka użyta do testowania to NUnit. Alternatywą w C# są xUnit.net i MSTest. Niektórefunkcje dostępne w NUnicie mogą być jednak niedostępne w tych dwóch bibliotekach.

Biblioteka do tworzenia atrap to Moq. Alternatywa w C# to FakeItEasy i NSubstitute.Należy wiedzieć, że składnie tych dwóch bibliotek znacząco różnią się od siebie i od składniMoqa.

Biblioteka do mierzenia pokrycia kodu testami to JetBrains dotCover (wersja płatna,30-dniowa wersja próbna). Visual Studio w wersji Enterprise zawiera wbudowane na-rzędzie do mierzenia pokrycia kodu testami. Alternatywa to NCover (wersja płatna)i AxoCover (wersja darmowa).

Narzędzie użyte do refaktoryzacji kodu to JetBrains ReSharper. Zamiast niego możnawykorzystać funkcje wbudowane w Visual Studio.

Narzędzia firmy JetBrains, a mianowicie ReSharper i dotCover, są płatne. Bezpłatna li-cencja na produkty JetBrains jest dostępna dla studentów i nauczycieli.

Kod źródłowy do książkiKod źródłowy do książki jest oparty na otwartym źródle i można pobrać go z GitHuba(https://github.com/dariusz-wozniak/TddBook-Code) lub ze strony wydawnictwa Helion(https://helion.pl/pobierz-przyklady/tddppr/).

Wersje zależności są następujące:

.NET Framework: 4.7.1

NUnit: 3.10.1

Moq: 4.8.2

SpecFlow: 2.3.1

FluentAssertions: 5.2.0

ExcelDataReader: 3.4.0

Zależne biblioteki zostały dodane do projektu przez menadżer pakietów NuGet.

Poleć książkęKup książkę

Page 29: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

SkorowidzA

AAA, Patrz: zasada AAAAAT, 78Acceptance Test-Driven Development, Patrz:ATDDAgile Acceptance Testing, Patrz: AATalgorytm jenny, 164all-pairs testing, Patrz: testowanie parAPI, 25aplikacja, 25

sieciowa, 274składowe publiczne, 25ustawienia regionalne, 185, 186, 187

język turecki, 187Arrange-Act-Assert, Patrz: zasada AAAasercja, 60, 61, 116, 251, 255

komunikat, 258logiczna, 64, 65, 85model

fluent builder, 119klasyczny, 118, 119, 130, 133, 134, 137oparty na twierdzeniach, 118, 119, 124,130, 133, 134, 135, 137

należy do zakresu, 128nierozstrzygnięta, 117niestandardowa, 303porównanie, 120, 126

typów, 121, 122pośrednia, 62, 63tworzenie, 118złożenie, 128

assumption, Patrz: założenieATDD, 73, 78atrapa, 23, 67, 68, 85, 193, 194, 249, 293

argument matchers, 210, 215, 216dummy, 230, 232

fake, 233, 235historia wywołań, 216, 217klasy, 224klasyfikacja, 230metoda z parametrami, 210mock, 235poziom dostępności

internal, 227, 229protected, 227, 228

rekursywna, 205składnia

deklaratywna, 202, 204, 205imperatywna, 202, 203, 205

spy, 235stub, 232, 233tryb zachowania

luźny, 209restrykcyjny, 209, 231właściwości, 206, 207

tworzenie, 273automatyczne, 201ręczne, 195, 196, 198, 201

weryfikacjadostępu, 219wywołań, 217, 220zachowań, 220, 221zapisu właściwości, 219

wyrzucająca wyjątek, 226z rezultatem sekwencyjnym, 208

atrybutApartment, 180Author, 182Category, 180, 181Combinatorial, 161Culture, 186, 187Datapoint, 166

Poleć książkęKup książkę

Page 30: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

320 TDD. Techniki programowania sterowanego testami

atrybutDatapointSource, 166, 168Description, 182dziedziczenie, 148ExpectedException, 135, 253Explicit, 183, 184Ignore, 183InternalsVisibleTo, 229MaxTime, 189NonParallelizable, 178OneTimeSetUp, 147, 148OneTimeTearDown, 147, 148Order, 185Pairwise, 161, 164Parallelizable, 178parametry, 107Platform, 190, 191Property, 182Random, 154Range, 154Repeat, 188RequiresThread, 180Retry, 188Sequential, 161, 162SetCulture, 186SetUp, 147, 148, 257SetUpFixture, 148SingleThreaded, 180TearDown, 147, 148, 257Test, 84, 97TestCase, 97, 107, 151, 176, 184TestCaseData, 184TestCaseSource, 97, 155, 156, 157, 160TestFixture, 170Theory, 166, 170Timeout, 189Values, 152, 153ValueSource, 160

Ayende Rahiena, 201

BBasili Victor, 30BDD, 78Beck Kent, 24, 29, 115Behavior-Driven Development, Patrz: BDD

biblioteka, 25Castle DynamicProxy, 202csUnit, 291do testowania, 50do tworzenia atrap, 50, 241, 242dotCover, 297Expecto, 291FakeItEasy, 28, 201, 202, 293Fluent Assertions, 119Fock, 293Foq, 293FsUnit, 72, 291Fuchu, 291innego dostawcy, 68JetBrains dotCover, 28JUnit, 21, 115JustMock, 293MbUnit, 291, 304Microsoft Fakes, 294Microsoft Moles, 294Moq, 20, 23, 28, 201, 294

historia, 201LINQ to Mocks, 204ograniczenia, 237składnia, 202, 203, 204, 205

MSTest, 28, 91, 116, 291NCover, 297NCrunch, 297NDepend, 297NMock3, 294NSubstitute, 28, 201, 202, 294NUnit, 20, 28, 66, 84, 91, 115, 142, 291, 299

atrybut, 305, 307dodawanie, 93, 94historia, 115, 116integracja z Visual Studio, 98porównanie typów, 129ReSharper, Patrz: ReSharperrozszerzalność, 303, 304Test Adapter, 98złożenie, 128

NUnit.Mocks, 294NUnit3TestAdapter, 99OpenCover, 298PartCover, 298podpisana cyfrowo, 229Rhino Mocks, 201, 295

typ atrapy, 202

Poleć książkęKup książkę

Page 31: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Skorowidz 321

Semantic Designs C# Test Coverage Tool,298Shouldly, 119Software Verify .NET Coverage Validator,298SpecFlow, 79Squish Coco, 298SUnit, 115TddBook.Tests.Unit, 229TestMatrix, 298testów jednostkowych, 91Typemock Isolator, 295Typemock Isolator Coverage, 298unconstrained, 273Unquote, 292uzależnienie od dostawcy, 149Visual Studio, 298xUnit, 115xUnit.net, 28, 91, 292

black-box test, Patrz: test skrzynki czarnejblok try-catch, 132błąd runtime, 112boxed, Patrz: typ zapudełkowanybrownfield, 261

CCazzulino Daniel „kzu”, 201CI, Patrz: ciągła integracjaciągła dostawa, 288ciągła integracja, 50, 285, 288

raport, 287serwer, 286

ciągłe wdrażanie, 288, 289coding dojo, 22, 49constraint, Patrz: twierdzeniecontinuous delivery, Patrz: ciągła dostawacontinuous deployment, Patrz: ciągłewdrażaniecontinuous integration, Patrz: ciągła integracjaCraig Philip, 115cykl

Red-Green-Refactor, 32, 78, 96, 170green, 102odwrócenie, 57, 58red, 95, 96, 175refaktoryzacja, 103, 113

czas, 186

Ddane

wrażliwe, 252współdzielone, 148, 150, 179, 257źródło, 167

DAO, 68data, 186Data Access Object, Patrz: DAOdebugowanie, 149definicja ukończenia, Patrz: DODDefinition of Done, Patrz: DODdelegat, 133dependency injection, Patrz: wstrzykiwaniezależnościDijkstra Edsger, 30dług techniczny, 52

redukcja, 263DOD, 53, 54dojo, Patrz: coding dojodummy, 23

EEDD, 78Example-Driven Development, Patrz: EDD

Ffake, 23folder, 141, 142framework, Patrz: bibliotekafunkcja, 24, 78funkcjonalność, 24

GGeneric Test Fixture, Patrz: atrybut TestFixturegray-box test, Patrz: test skrzynki szarejgreenfield, 261

Hhasło, 252

Poleć książkęKup książkę

Page 32: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

322 TDD. Techniki programowania sterowanego testami

Iimplementacja, 25

tworzenie, 96instrukcja warunkowa, 253interfejs

IConfigurationWrapper, 249IEnumerable, 157IList, 171IResolveConstraint, 118IShape, 174ITestCaseData, 158programowania aplikacji, 25symulacja, 196użytkownika, 274

InvariantCulture, Patrz: kultura niezmiennainversion of control, Patrz: odwróceniesterowaniaisolation framework, Patrz: atrapa

JJetBrains dotCover, 278język

funkcyjny, 24Gherkin, 78programowania, 20

C#, 20Smalltalk, 24, 115

Kkaikaku, 17kaizen, 17, 18, 19kata, 50klasa

Assert, 66, 84, 117, 118Assume, 166CollectionAssert, 138generyczna, 170, 172It, 210niezmienna, 174o prywatnym poziomie dostępności, 237statyczna, 237, 238StringAssert, 137System.Random, 154TestCaseData, 158, 159testowa, 87, 97

zalążek, 92zależności, 195zamknięta, 237

kod, 19asynchroniczny, 174czytelność, 149integracja, 67, 285ISO, 187istniejący, 261, 262

dodawanie testów, 271jakość, 51, 52niedeterministyczny, 68powtarzanie, 245tworzenie przyrostowe, 106zarządzalność, 149zduplikowany, 274

kolekcja, 63, 138niezmienna, 233porównywanie, 138, 139, 140, 141

komunikat, 142asercji, Patrz: asercja komunikatbłędu, 221tworzenie, 144, 145

nazwa testu, 146, 147wyjątku, Patrz: wyjątek komunikat

kultura niezmienna, 187

LLarman Craig, 30legacy code, 261Liskov Substitution Principle, Patrz: zasadapodstawienia Liskovlista kontrolna, 52, 53logika biznesowa, Patrz: implementacjaLSP, Patrz: zasada podstawienia Liskov

Łłańcuch tekstowy, 143

Mmenadżer pakietów NuGet, 94, 95, 99metoda

anonimowa, 133AreEqual, 118, 120AreNotEqual, 118Assert.Fail, 117, 132

Poleć książkęKup książkę

Page 33: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Skorowidz 323

Assert.Ignore, 117Assert.Inconslusive, 117Assert.Pass, 117, 132async, 175asynchroniczna, 176Callback, 222, 223, 224Catch, 134Convert.ChangeType, 151InRange, 128IsEmpty, 118Mock.Of, 204, 205Multiple, 66nazwa, 245niewirtualna, 237parametr, 152pomocnicza, 117, 126protected, 228Returns, 203SetReturnsDefault, 207Setup, 203SetupAllProperties, 207SetupProperty, 206SetupSequence, 208sygnatura, 96, 194, 250testowa, 107That, 118, 166Throws, 118, 134, 135, 226ToUpperInvariant, 187Verify, 216VerifyGet, 216, 219VerifySet, 216, 219void, 136wirtualna, 225

Microsoft Test Framework, Patrz: bibliotekaMSTestmock, 23, 201model zmian, 17, 19modyfikator

async, 175, 177await, 177IgnoreCase, 138Using, 125, 127

Nnamespace, Patrz: przestrzeń nazwNaN, 167New Constraint, 171Newkirk Jim, 115, 116null, 86, 200

Oodwrócenie sterowania, 195over-specified, Patrz: test jednostkowyprzespecyfikowany

Ppairwise testing, Patrz: testowanie parpętla, 253piramida testów, 74platforma, 190, 191plik, 141, 142

konfiguracji, 249zewnętrzny, 160

Poole Charlie, 115, 116program, Patrz: aplikacjaprogramowanie

deklaratywne, 25ekstremalne, 29, 30obiektowe, 50, 68

projekt, Patrz: aplikacjaproperty behavior, Patrz: atrapa trybzachowania właściwościprototyp, 68Prouse Rob, 116przestrzeń nazw, 97

Rrefaktoryzacja, 19, 28, 33, 49

bezpieczna, 261, 263, 264ekstrakcja do osobnej klasy, 266ekstrakcja do osobnej metody, 266, 267izolowanie zmienianego kodu, 264, 266

istniejącego kodu, 261, 263niebezpieczna, 261, 263

reguła, Patrz: zasadaReSharper, 101, 160, 264, 266Rider, 264

Poleć książkęKup książkę

Page 34: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

324 TDD. Techniki programowania sterowanego testami

SSatir Virginia model zmian, 17, 19SBE, 78SBESpecification by Example, 78scenariusz, 78Scrum, 17, 18Seneka Starszy, 31serwer ciągłej integracji, Patrz: ciągłaintegracja serwersilnik testowy, Patrz: TestEngineskładowa

bazowa, 225CallBase, 225niepubliczna, 67publiczna, 252

słowo kluczoweasync, 174await, 174

solucja, 92specyfikacja, 79spy, 23stack trace, Patrz: ślad stosustory testing, 78stos ślad, Patrz: ślad stosustub, 23stubbing, Patrz: atrapa tryb zachowaniawłaściwościsystem, Patrz też: aplikacja

ciągłej integracji, Patrz: ciągła integracjaoperacyjny, 190, 191plików, 141, 142, 249zarządzania pakietów, Patrz: menadżerpakietów

Śślad stosu, 142

TTAD, Patrz: Test-After DevelopmentTDD, 19, 25, 26, 29, 78

dla aplikacjidużej, 70małej, 69

filozofia, 57

historia, 29mantra, Patrz: cykl Red-Green-Refactornauka, 49, 50opłacalność, 51wdrażanie, 49, 51zasada, 59

teoria, 166, 167, 169test, 19

akceptacyjny, 67, 68, 71, 73, 78, 177, 193,262, 273, 283

narzędzia, 274automatyczny, 77, 78

narzędzia, 50bezpieczeństwa, 81czas wykonania, 189czerwony, Patrz: test niespełnionydouble, 23, 230dymny, 80fałszywie pozytywny, 246, 250, 262funkcjonalny, 24green, Patrz: test spełnionyintegracyjny, 67, 68, 73, 78, 85, 177, 193

dla zależności wewnętrznych, 273konfiguracja, 85szybkość, 85

interakcyjny, 283interfejsu użytkownika, 80internacjonalizacji i lokalizacji, 81jednostkowy, 21, 29, 49, 57, 59, 73, 78, 83, 85

asercja logiczna, 85bez asercji, 281debugowanie, 101dodawanie do istniejącego kodu, 271dzielenie, 64, 66interpretowany, 249izolowanie, 246, 247klasa testowa bezstanowa, 257nazwa, 87, 88, 146, 147, 252niedyskryminowany, 251niepotrzebny, 67pisane przez innego programistę, 72powtarzalność, 155, 246, 248prostota, 255, 271przespecyfikowany, 256przypadki brzegowe, 87, 96, 252, 282struktura, 83szybkość, 85, 194, 246

Poleć książkęKup książkę

Page 35: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

Skorowidz 325

tolerancja, 108, 109, 124tolerancja czasu, 124tworzenie, 24, 33, 97, 98, 105, 272uruchamianie, 98, 99w innym języku programowania, 71wartość oczekiwana, 254wpływ na pracę, 71zależności zewnętrzne, 85, 110, 142, 193,194, 195, 246, 248, 249

kolejność, 185konfiguracji, 81manualny, 70, 77nierozstrzygnięty, 117, 166niespełniony, 25, 89, 98, 117

warunki, 116, 117niezmiennika, 173niskopoziomowy, 74obciążeniowy, 81oparty na własnościach, 274parametryzowany, 61, 107, 150, 151, 169,176, 192

oparty na zewnętrznych źródłach, 160piramida, Patrz: piramida testówpoczytalności, 80pokrycie kodu, 28, 31, 50, 277, 278, 282, 297

brakujące testy, 284narzędzia, 274narzędzia do mierzenia, 278skala, 281, 282, 283

powtarzanie, 188półautomatyczny, 77przeciążeniowy, 81przystępności, 81pusty, 250red, Patrz: test niespełnionysilnik, Patrz: TestEngineskalowalności, 81skrzynki, 77

białej, 77czarnej, 77, 110szarej, 78

spełniony, 25, 98, 117warunki, 116

spike, 81strukturalny, Patrz: test skrzynki białejteoria, Patrz: teoriauruchamianie równoległe, 116

użyteczności, 80wydajnościowy, 81wysokopoziomowy, 74wytrzymałościowy, 81z danymi zewnętrznymi, 299z zamiennikiem, 173zielony, Patrz: test spełnionyzignorowany, 117zrównoleglenie, 178, 179

Test-After Development, 58, 59, 72, 78, Patrzteż: Test-Last DevelopmentTest-Driven Development, Patrz: TDDTestEngine, 116tester manualny, Patrz: test manualnyTest-First Development, 58Test-Last Development, 57, 58testowanie

niefunkcjonalne, 80par, 163poziom, 78regresyjne, 80zdarzeń, 111

TFD, Patrz: Test-First DevelopmentTLD, Patrz: Test-Last Developmenttwierdzenie, 118, 166

Is.Empty, 118Is.EqualTo, 118, 119, 120Is.Not.EqualTo, 118Throws, 135Throws.Exception, 118With.Message, 136With.Parameter, 136

Two Michael, 115typ

DateTime, 186decimal, 170double, 170float, 170generyczny, 171int, 170konwersja, 151long, 170ParallelScope, 178porównanie, 129tekstowy, 137, 138zapudełkowany, 122

Poleć książkęKup książkę

Page 36: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?

326 TDD. Techniki programowania sterowanego testami

Vvendor lock-in, Patrz: biblioteka uzależnienieod dostawcyVisual Studio, 264Visual Studio Enterprise, 28Voronstov Alexei, 115

Wwartość null, Patrz: nullwhite-box test, Patrz: test skrzynki białejWilson Brad, 116właściwość

Count, 171ExpectedResult, 152InnerException, 137ParamName, 136wirtualna, 225

wstrzykiwanie zależności, 195wyjątek

ArgumentNullException, 200ArithmeticException, 253AssertionException, 98DivideByZeroException, 97, 109, 253hierarchia dziedziczenia, 253InnerException, 137komunikat, 136MockException, 209NotImplementedException, 96, 198, 250NotSupportedException, 225NullReferenceException, 206parametr, 136przechwytywanie, 253SystemException, 253testowanie, 131, 132, 133, 135typ, 134wewnętrzny testowanie, 137

wyrażenie lambda, 134, 176, 201wywołanie zwrotne, 222wzorzec

Arrange-Act-Assert, Patrz: zasada AAASetup-Returns, 203, 205

Zzałożenie, 166, 169zasada

AAA, 83, 84, 251AAAA, 84DRY, 245FIRST, 246Guard Assertion, 84GWT, 84podstawienia Liskov, 172, 173, 174Record & Play, 201Record-Playback, 84SOLID, 68, 172, 272

zdarzenieCalculated, 111, 112OnCalculated, 111, 113

zmiennaGlobalSettings.DefaultFloatingPointTolerance, 124wejściowa, 60wyjściowa, 60, 61

Poleć książkęKup książkę

Page 38: Wszelkie prawa zastrzeżone. Nieautoryzowane … · Spis treści 5 Czy TDD sprawdza się dla małych aplikacji? ..... 69 Czy TDD sprawdza się dla dużych aplikacji?