SlideShare a Scribd company logo
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TREŒCI
                                         JUnit. Pragmatyczne
                                         testy jednostkowe w Javie
           KATALOG KSI¥¯EK               Autorzy: Andy Hunt, Dave Thomas
                                         T³umaczenie: Jaromir Senczyk
                      KATALOG ONLINE     ISBN: 83-246-0406-5
                                         Tytu³ orygina³u: Pragmatic Unit Testing in Java with JUnit
       ZAMÓW DRUKOWANY KATALOG           Format: B5, stron: 192


              TWÓJ KOSZYK
                                                             Przetestuj swoje aplikacje podczas ich tworzenia
                    DODAJ DO KOSZYKA         • Poznaj strukturê testów jednostkowych
                                             • Stwórz poprawne testy jednostkowe
                                             • Wykorzystaj modu³y testowe w projekcie
         CENNIK I INFORMACJE             Testy jednostkowe s¹ niezwykle wa¿nym narzêdziem programisty. Przeprowadzane
                                         podczas pisania aplikacji pozwalaj¹ na sprawdzenie poprawnoœci kodu, wy³apanie
                   ZAMÓW INFORMACJE      b³êdów i szybkie usuniêcie ich. W nowoczesnych metodykach wytwarzania
                     O NOWOŒCIACH        oprogramowania testy jednostkowe s¹ jednymi z najwa¿niejszych elementów procesu.
                                         Tworzenie systemów bez korzystania z testów jednostkowych czêsto porównywane
                       ZAMÓW CENNIK      jest do pisania programów na kartce. Nowoczesne narzêdzia takie, jak JUnit bardzo
                                         u³atwiaj¹ przeprowadzanie testów jednostkowych, integruj¹c siê ze œrodowiskami
                                         programistycznymi.
                 CZYTELNIA               Ksi¹¿ka „JUnit. Pragmatyczne testy jednostkowe w Javie” to wprowadzenie do tematyki
          FRAGMENTY KSI¥¯EK ONLINE       testów jednostkowych. Czytaj¹c j¹ poznasz ich znaczenie i nauczysz siê stosowaæ JUnit
                                         do projektowania i wykorzystywania testów. Dowiesz siê, jak projektowaæ testy
                                         jednostkowe w oparciu JUnit, co testowaæ za ich pomoc¹ i gdzie umieszczaæ kod
                                         testowy. W ksi¹¿ce przeczytasz te¿ o zasadach projektowania ³atwego do testowania
                                         kodu oraz programowaniu sterowanym testami.
                                             • Cele przeprowadzania testów jednostkowych
                                             • Planowanie testów
                                             • Implementacja testów z wykorzystaniem JUnit
                                             • Zasady stosowania testów
                                             • Automatyzowanie testów
                                             • Okreœlanie czêstotliwoœci testowania
                                             • Projektowanie kodu pod k¹tem testowania
Wydawnictwo Helion
                                                       Przekonaj siê, jak bardzo testy jednostkowe u³atwi¹ Ci pracê
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Przedmowa ..............................................................................................7

Rozdział 1. Wprowadzenie ..................................................................11
    Zaufanie do tworzonego kodu .......................................................................... 12
    Na czym polegają testy jednostkowe? ................................................................ 13
    Po co zajmować się testami jednostkowymi? ...................................................... 14
    Co chcemy osiągnąć? ....................................................................................... 15
    Jak testować? ................................................................................................... 17
    Wymówki od testowania .................................................................................. 18
    Zawartość książki ............................................................................................ 23

Rozdział 2. Najprostsze testy jednostkowe ......................................25
    Planowanie testów ........................................................................................... 26
    Testowanie prostej metody ............................................................................... 28
    Więcej testów .................................................................................................. 33

Rozdział 3. Implementacja testów JUnit ..........................................35
    Struktura testów jednostkowych ........................................................................ 35
    Asercje JUnit .................................................................................................. 37
    Szkielet JUnit ................................................................................................. 40
4                                              JUnit. Pragmatyczne testy jednostkowe w Javie

    Kompozycja testów JUnit ................................................................................ 42
    Niestandardowe asercje JUnit .......................................................................... 47
    JUnit i wyjątki ................................................................................................. 49
    Jeszcze o nazwach ............................................................................................ 51
    Szkielet JUnit ................................................................................................. 52

Rozdział 4. Co testować? .....................................................................53
    Czy wyniki są poprawne? ................................................................................. 54
    Warunki brzegowe ........................................................................................... 57
    Sprawdzanie relacji zachodzących w odwrotnym kierunku .................................. 59
    Kontrola wyników na wiele sposobów ............................................................... 60
    Wymuszanie warunków powstawania błędów .................................................... 61
    Charakterystyka efektywnościowa ..................................................................... 61

Rozdział 5. Warunki brzegowe ...........................................................65
    Zgodność ....................................................................................................... 66
    Uporządkowanie ............................................................................................. 68
    Zakres ............................................................................................................ 69
    Referencja ...................................................................................................... 73
    Istnienie .......................................................................................................... 74
    Liczność ......................................................................................................... 75
    Czas ............................................................................................................... 78
    Zrób to sam .................................................................................................... 79

Rozdział 6. Stosowanie obiektów imitacji ........................................85
    Proste namiastki .............................................................................................. 86
    Obiekty imitacji ............................................................................................... 87
    Testowanie serwletu ........................................................................................ 92
    Easy Mock ..................................................................................................... 96

Rozdział 7. Właściwości poprawnych testów jednostkowych ....101
    Automatyzacja .............................................................................................. 102
    Kompletność ................................................................................................. 103
    Powtarzalność ............................................................................................... 105
Spis treści                                                                                                         5

    Niezależność ................................................................................................. 106
    Profesjonalizm .............................................................................................. 107
    Testowanie testów ......................................................................................... 109

Rozdział 8. Projekt i testowanie ......................................................113
    Gdzie umieścić kod testowy ............................................................................ 113
    Testowanie i kurtuazja ................................................................................... 117
    Częstotliwość testów ...................................................................................... 119
    Testy i istniejący kod ..................................................................................... 120
    Testy i recenzje ............................................................................................. 123

Rozdział 9. Zagadnienia projektowania ..........................................127
    Projektowanie łatwo testowalnego kodu .......................................................... 128
    Refaktoring i testowanie ................................................................................. 130
    Testowanie niezmienników klas ...................................................................... 143
    Projektowanie sterowane testami .................................................................... 145
    Testowanie poprawności parametrów ............................................................. 147

Dodatek A Pułapki .............................................................................149
    Dopóki kod działa ......................................................................................... 149
    „Test ognia” ................................................................................................. 150
    „Działa na mojej maszynie” ........................................................................... 150
    Problemy arytmetyki zmiennoprzecinkowej ...................................................... 151
    Testy zajmują zbyt wiele czasu ....................................................................... 152
    Testy ciągle zawodzą ..................................................................................... 152
    Testy zawodzą na niektórych maszynach ......................................................... 153
    Metoda main nie jest wykonywana .................................................................. 153

Dodatek B Instalacja JUnit ...............................................................155
    Instalacja z wiersza poleceń ............................................................................ 156
    Czy JUnit działa? .......................................................................................... 157

Dodatek C Szkielet testów JUnit .....................................................159
    Klasa pomocnicza ......................................................................................... 161
    Podstawowy szablon ...................................................................................... 163
6                                             JUnit. Pragmatyczne testy jednostkowe w Javie

Dodatek D Zasoby ...............................................................................165
    W internecie ................................................................................................. 165
    Bibliografia ................................................................................................... 168

Dodatek E Pragmatyczne testy jednostkowe
 — podsumowanie ............................................................................169

Dodatek F Rozwiązania ćwiczeń ......................................................173

Skorowidz ............................................................................................185
rudno przewidzieć wszystkie możliwe błędy w działaniu klasy lub
        metody. Jeśli mamy sporo doświadczenia w tym zakresie, to intuicyj-
        nie rozpoznajemy miejsca, w których mogą pojawić się kłopoty, i dzię-
ki temu koncentrujemy się najpierw na przetestowaniu właśnie tych miejsc.
Jednak dla mniej doświadczonych programistów wykrywanie kłopotliwych
obszarów często jest frustrującym zadaniem. Tym bardziej że szczególnie
łatwo przychodzi ono użytkownikom końcowym, co jest nie tylko irytujące,
ale może stanowić także gwóźdź do trumny niejednej kariery programisty.
Dlatego niezwykle cenne są wszelkie wskazówki mogące nam wskazać lub
choćby przypomnieć obszary, na które szczególnie należy zwrócić uwagę pod-
czas testowania.
Przyjrzyjmy się zatem sześciu różnym obszarom testowania, których wyko-
rzystanie powinno zwiększyć naszą skuteczność w wykrywaniu błędów:
   t   Czy wyniki są poprawne?
   t   Czy warunki brzegowe zostały prawidłowo określone?
   t   Czy można sprawdzić relacje zachodzące w odwrotnym
       kierunku?
   t   Czy można sprawdzić wyniki, uzyskując je w alternatywny
       sposób?
54                           JUnit. Pragmatyczne testy jednostkowe w Javie


     t   Czy można wymusić warunki zajścia błędu?
     t   Czy charakterystyka efektywnościowa jest poprawna?


Czy wyniki są poprawne?
Pierwszy, najbardziej oczywisty obszar testowania to sprawdzenie, czy
wyniki działania testowanych metod są poprawne.
Kontrolę wyników przedstawiliśmy w rozdziale 2. na przykładzie prostej
metody zwracającej największy element listy.
Testy te są zwykle najłatwiejsze do przeprowadzenia, a wiele spodziewa-
nych wyników często określonych jest w specyfikacji wymagań. Jeśli nie,
musisz odpowiedzieć sobie na pytanie:
Skąd mam wiedzieć, czy kod działa poprawnie?
Jeśli znalezienie satysfakcjonującej odpowiedzi na to pytanie nie jest moż-
liwe, tworzenie kodu i jego testów może okazać się kompletnym marnotraw-
stwem czasu. A co w przypadku, gdy wymagania dopiero się krystalizują?
Czy oznacza to, że nie możemy rozpocząć pisania kodu, dopóki wymaga-
nia nie zostaną dokładnie sprecyzowane?
Nie, wcale nie. Jeśli ostateczne wymaganie nie są jeszcze znane lub kom-
pletne, zawsze możesz wymyślić własne wymagania jako punkt odniesienia.
Może okazać się, że nie są one poprawne z punktu widzenia użytkownika,
ale dzięki nim wiesz, jak powinien według Ciebie działać kod, i potrafisz
odpowiedzieć na postawione wcześniej pytanie.
Oczywiście musisz potem, wspólnie z użytkownikami, zweryfikować swoje
założenia. Definicja poprawności wyników może zmieniać się w trakcie
powstawania kodu, ale na każdym etapie jego tworzenia powinieneś móc
stwierdzić, czy kod działa tak, jak założyłeś.
Rozdział 4. • Co testować?                                                                       55

Stosowanie plików zawierających dane testowe
W przypadku zestawów testów wymagających dużej ilości danych wejścio-
wych można rozważyć ich umieszczenie (być może wraz z oczekiwanymi
wynikami) w osobnych plikach wczytywanych przez testy jednostkowe.
Implementacja takiego rozwiązania nie jest skomplikowana i niekoniecznie
musi od razu wymagać zastosowania języka XML1. Poniżej przedstawio-
na została wersja testu TestLargest, która wczytuje wszystkie testy z pliku.
        import   junit.framework.*;
        import   java.io.*;
        import   java.util.ArrayList;
        import   java.util.StringTokenizer;

        public class TestLargestDataFile extends TestCase {

          public TestLargestDataFile(String name) {
            super(name);
          }

          /* Wykonuje testy zapisane w pliku testdata.txt (nie testuje
           * przypadku wyjątku). Wyrzuca wyjątek w przypadku,
           * gdy któraś operacja wejścia i wyjścia zakończy się błędem.
           */

          public void testFromFile() throws Exception {
            String line;
            BufferedReader rdr = new BufferedReader(
                                            new FileReader(
                                            "testdata.txt"));

             while ((line = rdr.readLine()) != null) {

                 if (line.startsWith("#")) { // Ignoruje komentarz
                   continue;
                 }

                 StringTokenizer st = new StringTokenizer(line);
                 if (!st.hasMoreTokens()) {
                   continue; // Pusty wiersz
                 }

                 // Pobiera spodziewany wynik
                 String val = st.nextToken();
                 int expected = Integer.valueOf(val).intValue();



1
    To jest oczywiście żart, przecież zastosowanie języka XML jest obligatoryjne we wszystkich
    współczesnych projektach?
56                                                          JUnit. Pragmatyczne testy jednostkowe w Javie

                                        // Oraz argumenty dla testowanej metody
                                        ArrayList argument_list = new ArrayList();

                                        while (st.hasMoreTokens()) {
                                          argument_list.add(Integer.valueOf(
                                                                     st.nextToken()));
                                        }

                                        // Zamienia listę obiektów w tablicę typu podstawowego
                                        int[] arguments = new int[argument_list.size()];
                                        for (int i=0; i < argument_list.size(); i++) {
                                          arguments[i] = ((Integer)argument_list.
                                                          get(i)).intValue();
                                        }
 TestLargestDataFile.java




                                        // Wykonuje asercję
                                        assertEquals(expected,
                                                     Largest.largest(arguments));
                                    }
                                }
                            }

Plik danych testowych ma bardzo prosty format — każdy wiersz zawiera
zbiór wartości. Pierwsza z nich jest oczekiwanym wynikiem, a pozostałe ar-
gumentami testowanej metody. Dodatkowo zastosowanie znaku # na po-
czątku wiersza umożliwia wprowadzanie komentarzy.
A oto przykład zawartości takiego pliku:
                            #
                            # Proste testy:
                            #
                            9 7 8 9
                            9 9 8 7
                            9 9 8 9
                            #
                            # Testy z użyciem wartości ujemnych:
                            #
                            -7 -7 -8 -9
                            -7 -8 -7 -8
                            -7 -9 -7 -8
                            #
                            # Testy mieszane:
                            #
                            7 -9 -7 -8 7 6 4
                            9 -1 0 9 -7 4
                            #
                            # Warunki brzegowe:
                            #
 testdata.txt




                            1 1
                            0 0
                            2147483647 2147483647
                            -2147483648 -2147483648
Rozdział 4. • Co testować?                                              57


W przypadku kilku testów — jak choćby w powyższym przykładzie —
wysiłek włożony w opracowanie odpowiedniego rozwiązania nie zwróci się.
Jednak w przypadku zaawansowanej aplikacji wymagającej przeprowadze-
nia setek takich testów rozwiązanie wykorzystujące pliki danych na pewno
warte jest zainteresowania.
Należy przy tym pamiętać, że dane testowe — obojętnie, czy umieszczone
bezpośrednio w kodzie, czy w pliku danych testowych — same mogą być
niepoprawne. Doświadczenie podpowiada nawet, że prawdopodobieństwo
tego, iż dane testowe są nieprawidłowe, jest większe niż tego, że testowany
kod jest niepoprawny. Zwłaszcza jeśli dane testowe zostały przygotowane
drogą ręcznych obliczeń lub uzyskane z systemu, który zastępujemy naszym
oprogramowaniem (ponieważ jego nowe możliwości mogą mieć wpływ na
uzyskiwane wyniki). Jeśli wyniki testów są niepomyślne, warto najpierw
sprawdzić kilka razy poprawność danych testowych, zanim zabierzemy się
do poszukiwania błędu w kodzie.
Przedstawiony powyżej kod nie umożliwia testowania wyjątków. Zastanów
się, w jaki sposób zaimplementować taką możliwość.
Wybierz taki sposób testowania, który pozwoli najłatwiej sprawdzić, czy
metoda działa poprawnie.


Warunki brzegowe
W przykładzie z wyszukiwaniem największego elementu listy udało nam się
zidentyfikować szereg warunków brzegowych: gdy największy element
znajdował się na końcu listy, gdy lista zawierała wartość ujemną, gdy lista
była pusta i tak dalej.
Identyfikacja warunków brzegowych jest jednym z najwartościowszych
aspektów testowania, ponieważ pozwala wykryć i przetestować obszary,
w których prawdopodobieństwo niepoprawnego działania kodu jest naj-
większe. Typowe warunki brzegowe powstają na skutek:
58                               JUnit. Pragmatyczne testy jednostkowe w Javie


     t   wprowadzenia całkowicie błędnych lub niespójnych danych
         wejściowych, na przykład łańcucha "!*W:X&Gi/w~>g/h#WQ@"
         jako nazwy pliku;
     t   nieprawidłowo sformatowanych danych, takich jak adres e-mail,
         który nie zawiera głównej domeny ("fred@foobar.");
     t   niewprowadzenia odpowiednich wartości (wtedy pojawiają się
         wartości 0, 0.0, "" lub null);
     t   pojawienia się wartości znacznie przekraczających oczekiwania
         (na przykład wiek osoby równy 10 000 lat);
     t   pojawienia się duplikatów na listach, które nie powinny
         ich zawierać;
     t   wystąpienia list nieuporządkowanych zamiast uporządkowanych
         i na odwrót; spróbuj na przykład przekazać algorytmowi
         sortowania listę, która jest już posortowana, albo nawet posortuj
         ją w odwrotnym porządku;
     t   zakłócenia przewidywanego porządku zdarzeń, na przykład
         próby wydrukowania dokumentu przed zalogowaniem się.
Warunków brzegowych można poszukiwać w przedstawionych poniżej
obszarach. W przypadku każdego z podanych niżej warunków należy za-
stanowić się, czy dotyczy on testowanej metody, a jeśli tak, to co się stanie,
gdy zostanie naruszony:
     t   Zgodność — czy wartość jest zgodna z oczekiwanym formatem?
     t   Uporządkowanie — czy zbiór wartości jest odpowiednio
         uporządkowany?
     t   Zakres — czy wartość należy do przedziału oczekiwanych
         wartości?
     t   Odwołanie — czy kod odwołuje się do zewnętrznych obiektów,
         które są poza jego kontrolą?
     t   Istnienie — czy wartość istnieje (czyli jest różna od null, zera,
         obecna w zbiorze itd.)?
Rozdział 4. • Co testować?                                           59


    t   Liczność — czy występuje dokładnie tyle wartości, ile jest
        oczekiwanych?
    t   Czas (absolutny i względny) — czy wszystkie zdarzenia
        zachodzą w oczekiwanej kolejności i we właściwym czasie?
Wymienione obszary warunków brzegowych omówimy w następnym roz-
dziale.


Sprawdzanie relacji
zachodzących w odwrotnym kierunku
Działanie niektórych metod można przetestować, używając logiki ich
działania w odwrotnym kierunku. Na przykład działanie metody wy-
znaczającej pierwiastek kwadratowy możemy sprawdzić, podnosząc
wynik do kwadratu i porównując go z wartością wejściową:
     public void testSquareRootUsingInverse() {
       double x = mySquareRoot(4.0);
       assertEquals(4.0, x * x, 0.0001);
     }

Na podobnej zasadzie, wyszukując rekord w bazie danych, możesz
sprawdzić działanie metody, która go tam wstawiła.
Jednak implementując odwrotną logikę działania metody, należy zachować
szczególną ostrożność, ponieważ niepoprawne działanie metody może nie
zostać wykryte z powodu tych samych błędów w implementacjach obu me-
tod. Dlatego też tam, gdzie jest to tylko możliwe, najlepiej użyć innego
kodu źródłowego do implementacji metody działającej w kierunku odwrot-
nym. W naszym przykładzie testu metody pierwiastkowania wykorzystali-
śmy w tym celu zwykły operator mnożenia. W przypadku testowania metody
wstawiającej rekord do bazy danych najlepiej użyć metody wyszukiwania
dostarczonej przez producenta systemu zarządzania bazą danych.
60                                     JUnit. Pragmatyczne testy jednostkowe w Javie


Kontrola wyników na wiele sposobów
Wyniki działania testowanych metod możemy sprawdzać na wiele sposobów.

Zwykle bowiem istnieje więcej niż jeden sposób wyznaczenia interesującej
nas wartości. Podczas implementacji kodu produkcyjnego wybieramy ten
algorytm, który jest najefektywniejszy lub ma charakterystykę interesującą
pod innym względem. Natomiast pozostałe możemy wykorzystać w celu
sprawdzenia wyników podczas testowania. Technika ta jest szczególnie
pomocna, gdy istnieje ogólnie znany, sprawdzony sposób uzyskania wyni-
ków, który jednak jest zbyt mało efektywny lub elastyczny, by mógł zostać
użyty w kodzie produkcyjnym.

Mniej efektywnego algorytmu możemy użyć do sprawdzenia, czy algorytm
zastosowany w wersji produkcyjnej daje takie same wyniki2:
        public void testSquareRootUsingStd() {
          double number = 3880900.0;
          double root1 = mySquareRoot(number);
          double root2 = Math.sqrt(number);
          assertEquals(root2, root1, 0.0001);
        }

Inny sposób zastosowania tej techniki polega na sprawdzeniu, czy różne
dane sumują się we właściwy sposób. Załóżmy na przykład, że pracujemy
nad systemem obsługi biblioteki. W takim systemie liczba egzemplarzy
danej książki powinna zawsze zgadzać się z sumą egzemplarzy znajdujących
się na półkach biblioteki i egzemplarzy wypożyczonych. Liczba poszcze-
gólnych egzemplarzy stanowi osobne dane, które mogą nawet być raporto-
wane przez obiekty różnych klas, ale muszą być ze sobą zgodne i wobec
tego mogą być używane podczas testowania.




2
    Niektóre arkusze kalkulacyjne (na przykład Microsoft Excel) stosują podobną technikę w celu
    sprawdzenia, czy do rozwiązania danego problemu użyte zostały odpowiednie modele i metody
    i czy wyniki działania różnych metod są ze sobą zgodne.
Rozdział 4. • Co testować?                                                 61


Wymuszanie warunków
powstawania błędów
Gdy kod produkcyjny pracuje już w rzeczywistym systemie, narażony jest
na sytuacje związane z różnego rodzaju błędami, takimi jak brak miejsca
na dysku, awarie sieci czy niepoprawna praca innych aplikacji. Aby przete-
stować zachowanie kodu w takich sytuacjach, musimy umieć je wywołać.
Nie jest to trudne, gdy dotyczy na przykład przekazania kodowi niepo-
prawnych parametrów, ale już symulacja błędów sieci wymaga zastosowa-
nia odpowiednich technik. Jedną z nich — polegającą na użyciu obiektów
imitujących — omówimy w rozdziale 6. Zanim tam dotrzesz, spróbuj za-
stanowić się, jakie rodzaje błędów lub ograniczeń wprowadzanych przez
środowisko wykonywania kodu należy przetestować? Sporządź krótką ich
listę, zanim przejdziesz do dalszej lektury.

           Zastanów się nad tym, zanim przejdziesz do dalszej lektury...

A oto kilka typowych problemów, które udało nam się wymyślić.
    t   Brak wolnej pamięci.
    t   Brak wolnego miejsca na dysku.
    t   Nieprawidłowy czas systemu.
    t   Brak dostępu do sieci i błędy transmisji.
    t   Przeciążenie systemu.
    t   Ograniczona paleta kolorów.
    t   Zbyt duża lub zbyt mała rozdzielczość obrazu.


Charakterystyka efektywnościowa
Kolejnym obszarem wartym przetestowania jest charakterystyka efektywno-
ściowa. Nie chodzi tutaj o samą efektywność działania kodu, lecz o sposób
jej zmiany w odpowiedzi na zwiększającą się ilość danych wejściowych,
rosnący poziom komplikacji rozwiązywanego problemu i tym podobne.
62                                JUnit. Pragmatyczne testy jednostkowe w Javie


W tym przypadku zależy nam przede wszystkim na przeprowadzeniu testu
regresji charakterystyki efektywnościowej. Często bowiem zdarza się, że
pewna wersja systemu pracuje poprawnie, ale już następna okazuje się za-
skakująco wolna. Zwykle nie wiemy wtedy, jaka jest tego przyczyna, kto,
kiedy i dlaczego wprowadził modyfikacje, które pogorszyły efektywność
kodu. A użytkownicy zniecierpliwieni czekają na rozwiązanie problemu.
Aby uniknąć takiego scenariusza, możemy wykonać kilka podstawowych
testów, które upewnią nas, że krzywa efektywności jest stabilna w nowej
wersji kodu. Załóżmy na przykład, że napisaliśmy filtr pozwalający iden-
tyfikować witryny internetowe, do których dostęp chcemy zablokować.
Stworzony kod działa poprawnie w przypadku kilkudziesięciu witryn, ale
czy równie efektywnie będzie się zachowywać w przypadku 10 000 lub
nawet 100 000 witryn? Aby się o tym przekonać, musimy napisać odpo-
wiedni test jednostkowy.
     public void testURLFilter() {
       Timer timer = new Timer();
       String naughty_url = "http://www.xxxxxxxxxxx.com";

         // Najpierw wyszukaj niedozwolony URL na małej liście
         URLFilter filter = new URLFilter(small_list);
         timer.start();
         filter.check(naughty_url);
         timer.end();

         assertTrue(timer.elapsedTime() < 1.0);
         // Następnie wyszukaj niedozwolony URL na większej liście
         filter = new URLFilter(big_list);

         timer.start();
         filter.check(naughty_url);
         timer.end();

         assertTrue(timer.elapsedTime() < 2.0);

         // Na koniec wyszukaj niedozwolony URL na liście o jak największym rozmiarze
         filter = new URLFilter(huge_list);

         timer.start();
         filter.check(naughty_url);
         timer.end();

         assertTrue(timer.elapsedTime() < 3.0);
     }
Rozdział 4. • Co testować?                                              63


Przeprowadzenie takiego testu daje nam gwarancję, że kod spełnia wymaga-
nia odnośnie do jego efektywności. Ponieważ jego wykonanie zajmuje kilka
sekund, nie musimy uruchamiać go za każdym razem. Wystarczy, że będzie-
my go wykonywać wraz z innymi testami w nocy lub co kilka dni, a zosta-
niemy zaalarmowani o pojawiających się problemach z efektywnością kodu
wystarczająco wcześnie, aby poprawić je na czas.
Istnieje wiele dekoratorów umożliwiających dokładniejsze pomiary efektywno-
ści poszczególnych metod, symulację warunków silnego obciążenia i tym
podobne. Jednym z takich produktów jest dostępny bezpłatnie JUnitPerf3.




3
    http://www.clarkware.com

More Related Content

Viewers also liked

ABC języka HTML i XHTML
ABC języka HTML i XHTMLABC języka HTML i XHTML
ABC języka HTML i XHTML
Wydawnictwo Helion
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Wydawnictwo Helion
 
100 sposobów na Ubuntu
100 sposobów na Ubuntu100 sposobów na Ubuntu
100 sposobów na Ubuntu
Wydawnictwo Helion
 
GIMP. Praktyczne projekty
GIMP. Praktyczne projektyGIMP. Praktyczne projekty
GIMP. Praktyczne projekty
Wydawnictwo Helion
 
Linux. Mechanizmy sieciowe
Linux. Mechanizmy siecioweLinux. Mechanizmy sieciowe
Linux. Mechanizmy sieciowe
Wydawnictwo Helion
 
Java. Programowanie, biblioteki open-source i pomysły na nowe projekty
Java. Programowanie, biblioteki open-source i pomysły na nowe projektyJava. Programowanie, biblioteki open-source i pomysły na nowe projekty
Java. Programowanie, biblioteki open-source i pomysły na nowe projekty
Wydawnictwo Helion
 
Rozbudowa i naprawa sieci. Wydanie V
Rozbudowa i naprawa sieci. Wydanie VRozbudowa i naprawa sieci. Wydanie V
Rozbudowa i naprawa sieci. Wydanie V
Wydawnictwo Helion
 
Excel. Tabele i wykresy przestawne. Przewodnik po tworzeniu dynamicznych arku...
Excel. Tabele i wykresy przestawne. Przewodnik po tworzeniu dynamicznych arku...Excel. Tabele i wykresy przestawne. Przewodnik po tworzeniu dynamicznych arku...
Excel. Tabele i wykresy przestawne. Przewodnik po tworzeniu dynamicznych arku...
Wydawnictwo Helion
 

Viewers also liked (8)

ABC języka HTML i XHTML
ABC języka HTML i XHTMLABC języka HTML i XHTML
ABC języka HTML i XHTML
 
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla WindowsVisual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
Visual C++ 2005 Express Edition. Tworzenie aplikacji dla Windows
 
100 sposobów na Ubuntu
100 sposobów na Ubuntu100 sposobów na Ubuntu
100 sposobów na Ubuntu
 
GIMP. Praktyczne projekty
GIMP. Praktyczne projektyGIMP. Praktyczne projekty
GIMP. Praktyczne projekty
 
Linux. Mechanizmy sieciowe
Linux. Mechanizmy siecioweLinux. Mechanizmy sieciowe
Linux. Mechanizmy sieciowe
 
Java. Programowanie, biblioteki open-source i pomysły na nowe projekty
Java. Programowanie, biblioteki open-source i pomysły na nowe projektyJava. Programowanie, biblioteki open-source i pomysły na nowe projekty
Java. Programowanie, biblioteki open-source i pomysły na nowe projekty
 
Rozbudowa i naprawa sieci. Wydanie V
Rozbudowa i naprawa sieci. Wydanie VRozbudowa i naprawa sieci. Wydanie V
Rozbudowa i naprawa sieci. Wydanie V
 
Excel. Tabele i wykresy przestawne. Przewodnik po tworzeniu dynamicznych arku...
Excel. Tabele i wykresy przestawne. Przewodnik po tworzeniu dynamicznych arku...Excel. Tabele i wykresy przestawne. Przewodnik po tworzeniu dynamicznych arku...
Excel. Tabele i wykresy przestawne. Przewodnik po tworzeniu dynamicznych arku...
 

Similar to JUnit. Pragmatyczne testy jednostkowe w Javie

Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Wydawnictwo Helion
 
Visual Basic .NET. Ćwiczenia
Visual Basic .NET. ĆwiczeniaVisual Basic .NET. Ćwiczenia
Visual Basic .NET. Ćwiczenia
Wydawnictwo Helion
 
eXtreme programming
eXtreme programmingeXtreme programming
eXtreme programming
Wydawnictwo Helion
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Wydawnictwo Helion
 
Wzorce projektowe. Analiza kodu sposobem na ich poznanie
Wzorce projektowe. Analiza kodu sposobem na ich poznanieWzorce projektowe. Analiza kodu sposobem na ich poznanie
Wzorce projektowe. Analiza kodu sposobem na ich poznanie
Wydawnictwo Helion
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
Wydawnictwo Helion
 
J2EE. Podstawy programowania aplikacji korporacyjnych
J2EE. Podstawy programowania aplikacji korporacyjnychJ2EE. Podstawy programowania aplikacji korporacyjnych
J2EE. Podstawy programowania aplikacji korporacyjnych
Wydawnictwo Helion
 
Praktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie IIPraktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie II
Wydawnictwo Helion
 
Programowanie w języku C. FAQ
Programowanie w języku C. FAQProgramowanie w języku C. FAQ
Programowanie w języku C. FAQ
Wydawnictwo Helion
 
Spring. Zapiski programisty
Spring. Zapiski programistySpring. Zapiski programisty
Spring. Zapiski programisty
Wydawnictwo Helion
 
MS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowychMS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowych
Marcin Samsonowski
 
Agile Development. Filozofia programowania zwinnego
Agile Development. Filozofia programowania zwinnegoAgile Development. Filozofia programowania zwinnego
Agile Development. Filozofia programowania zwinnego
Wydawnictwo Helion
 
Visual Basic .NET. Wzorce projektowe
Visual Basic .NET. Wzorce projektoweVisual Basic .NET. Wzorce projektowe
Visual Basic .NET. Wzorce projektowe
Wydawnictwo Helion
 
Algorytmy. Od podstaw
Algorytmy. Od podstawAlgorytmy. Od podstaw
Algorytmy. Od podstaw
Wydawnictwo Helion
 
Programowanie. Od podstaw
Programowanie. Od podstawProgramowanie. Od podstaw
Programowanie. Od podstaw
Wydawnictwo Helion
 
The Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polskaThe Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polska
Wydawnictwo Helion
 
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i EclipseJava. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
Wydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
Wydawnictwo Helion
 
Sprzedaj swój program. Droga do udanych projektów programistycznych
Sprzedaj swój program. Droga do udanych projektów programistycznychSprzedaj swój program. Droga do udanych projektów programistycznych
Sprzedaj swój program. Droga do udanych projektów programistycznych
Wydawnictwo Helion
 
Java. Kompendium programisty
Java. Kompendium programistyJava. Kompendium programisty
Java. Kompendium programisty
Wydawnictwo Helion
 

Similar to JUnit. Pragmatyczne testy jednostkowe w Javie (20)

Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
 
Visual Basic .NET. Ćwiczenia
Visual Basic .NET. ĆwiczeniaVisual Basic .NET. Ćwiczenia
Visual Basic .NET. Ćwiczenia
 
eXtreme programming
eXtreme programmingeXtreme programming
eXtreme programming
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
 
Wzorce projektowe. Analiza kodu sposobem na ich poznanie
Wzorce projektowe. Analiza kodu sposobem na ich poznanieWzorce projektowe. Analiza kodu sposobem na ich poznanie
Wzorce projektowe. Analiza kodu sposobem na ich poznanie
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
 
J2EE. Podstawy programowania aplikacji korporacyjnych
J2EE. Podstawy programowania aplikacji korporacyjnychJ2EE. Podstawy programowania aplikacji korporacyjnych
J2EE. Podstawy programowania aplikacji korporacyjnych
 
Praktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie IIPraktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie II
 
Programowanie w języku C. FAQ
Programowanie w języku C. FAQProgramowanie w języku C. FAQ
Programowanie w języku C. FAQ
 
Spring. Zapiski programisty
Spring. Zapiski programistySpring. Zapiski programisty
Spring. Zapiski programisty
 
MS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowychMS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowych
 
Agile Development. Filozofia programowania zwinnego
Agile Development. Filozofia programowania zwinnegoAgile Development. Filozofia programowania zwinnego
Agile Development. Filozofia programowania zwinnego
 
Visual Basic .NET. Wzorce projektowe
Visual Basic .NET. Wzorce projektoweVisual Basic .NET. Wzorce projektowe
Visual Basic .NET. Wzorce projektowe
 
Algorytmy. Od podstaw
Algorytmy. Od podstawAlgorytmy. Od podstaw
Algorytmy. Od podstaw
 
Programowanie. Od podstaw
Programowanie. Od podstawProgramowanie. Od podstaw
Programowanie. Od podstaw
 
The Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polskaThe Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polska
 
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i EclipseJava. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
Sprzedaj swój program. Droga do udanych projektów programistycznych
Sprzedaj swój program. Droga do udanych projektów programistycznychSprzedaj swój program. Droga do udanych projektów programistycznych
Sprzedaj swój program. Droga do udanych projektów programistycznych
 
Java. Kompendium programisty
Java. Kompendium programistyJava. Kompendium programisty
Java. Kompendium programisty
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
Wydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
Wydawnictwo Helion
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
Wydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Wydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
Wydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Wydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Wydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
Wydawnictwo Helion
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
Wydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
Wydawnictwo Helion
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
Wydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
Wydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
Wydawnictwo Helion
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
Wydawnictwo Helion
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
Wydawnictwo Helion
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
Wydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

JUnit. Pragmatyczne testy jednostkowe w Javie

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TREŒCI JUnit. Pragmatyczne testy jednostkowe w Javie KATALOG KSI¥¯EK Autorzy: Andy Hunt, Dave Thomas T³umaczenie: Jaromir Senczyk KATALOG ONLINE ISBN: 83-246-0406-5 Tytu³ orygina³u: Pragmatic Unit Testing in Java with JUnit ZAMÓW DRUKOWANY KATALOG Format: B5, stron: 192 TWÓJ KOSZYK Przetestuj swoje aplikacje podczas ich tworzenia DODAJ DO KOSZYKA • Poznaj strukturê testów jednostkowych • Stwórz poprawne testy jednostkowe • Wykorzystaj modu³y testowe w projekcie CENNIK I INFORMACJE Testy jednostkowe s¹ niezwykle wa¿nym narzêdziem programisty. Przeprowadzane podczas pisania aplikacji pozwalaj¹ na sprawdzenie poprawnoœci kodu, wy³apanie ZAMÓW INFORMACJE b³êdów i szybkie usuniêcie ich. W nowoczesnych metodykach wytwarzania O NOWOŒCIACH oprogramowania testy jednostkowe s¹ jednymi z najwa¿niejszych elementów procesu. Tworzenie systemów bez korzystania z testów jednostkowych czêsto porównywane ZAMÓW CENNIK jest do pisania programów na kartce. Nowoczesne narzêdzia takie, jak JUnit bardzo u³atwiaj¹ przeprowadzanie testów jednostkowych, integruj¹c siê ze œrodowiskami programistycznymi. CZYTELNIA Ksi¹¿ka „JUnit. Pragmatyczne testy jednostkowe w Javie” to wprowadzenie do tematyki FRAGMENTY KSI¥¯EK ONLINE testów jednostkowych. Czytaj¹c j¹ poznasz ich znaczenie i nauczysz siê stosowaæ JUnit do projektowania i wykorzystywania testów. Dowiesz siê, jak projektowaæ testy jednostkowe w oparciu JUnit, co testowaæ za ich pomoc¹ i gdzie umieszczaæ kod testowy. W ksi¹¿ce przeczytasz te¿ o zasadach projektowania ³atwego do testowania kodu oraz programowaniu sterowanym testami. • Cele przeprowadzania testów jednostkowych • Planowanie testów • Implementacja testów z wykorzystaniem JUnit • Zasady stosowania testów • Automatyzowanie testów • Okreœlanie czêstotliwoœci testowania • Projektowanie kodu pod k¹tem testowania Wydawnictwo Helion Przekonaj siê, jak bardzo testy jednostkowe u³atwi¹ Ci pracê ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
  • 2. Przedmowa ..............................................................................................7 Rozdział 1. Wprowadzenie ..................................................................11 Zaufanie do tworzonego kodu .......................................................................... 12 Na czym polegają testy jednostkowe? ................................................................ 13 Po co zajmować się testami jednostkowymi? ...................................................... 14 Co chcemy osiągnąć? ....................................................................................... 15 Jak testować? ................................................................................................... 17 Wymówki od testowania .................................................................................. 18 Zawartość książki ............................................................................................ 23 Rozdział 2. Najprostsze testy jednostkowe ......................................25 Planowanie testów ........................................................................................... 26 Testowanie prostej metody ............................................................................... 28 Więcej testów .................................................................................................. 33 Rozdział 3. Implementacja testów JUnit ..........................................35 Struktura testów jednostkowych ........................................................................ 35 Asercje JUnit .................................................................................................. 37 Szkielet JUnit ................................................................................................. 40
  • 3. 4 JUnit. Pragmatyczne testy jednostkowe w Javie Kompozycja testów JUnit ................................................................................ 42 Niestandardowe asercje JUnit .......................................................................... 47 JUnit i wyjątki ................................................................................................. 49 Jeszcze o nazwach ............................................................................................ 51 Szkielet JUnit ................................................................................................. 52 Rozdział 4. Co testować? .....................................................................53 Czy wyniki są poprawne? ................................................................................. 54 Warunki brzegowe ........................................................................................... 57 Sprawdzanie relacji zachodzących w odwrotnym kierunku .................................. 59 Kontrola wyników na wiele sposobów ............................................................... 60 Wymuszanie warunków powstawania błędów .................................................... 61 Charakterystyka efektywnościowa ..................................................................... 61 Rozdział 5. Warunki brzegowe ...........................................................65 Zgodność ....................................................................................................... 66 Uporządkowanie ............................................................................................. 68 Zakres ............................................................................................................ 69 Referencja ...................................................................................................... 73 Istnienie .......................................................................................................... 74 Liczność ......................................................................................................... 75 Czas ............................................................................................................... 78 Zrób to sam .................................................................................................... 79 Rozdział 6. Stosowanie obiektów imitacji ........................................85 Proste namiastki .............................................................................................. 86 Obiekty imitacji ............................................................................................... 87 Testowanie serwletu ........................................................................................ 92 Easy Mock ..................................................................................................... 96 Rozdział 7. Właściwości poprawnych testów jednostkowych ....101 Automatyzacja .............................................................................................. 102 Kompletność ................................................................................................. 103 Powtarzalność ............................................................................................... 105
  • 4. Spis treści 5 Niezależność ................................................................................................. 106 Profesjonalizm .............................................................................................. 107 Testowanie testów ......................................................................................... 109 Rozdział 8. Projekt i testowanie ......................................................113 Gdzie umieścić kod testowy ............................................................................ 113 Testowanie i kurtuazja ................................................................................... 117 Częstotliwość testów ...................................................................................... 119 Testy i istniejący kod ..................................................................................... 120 Testy i recenzje ............................................................................................. 123 Rozdział 9. Zagadnienia projektowania ..........................................127 Projektowanie łatwo testowalnego kodu .......................................................... 128 Refaktoring i testowanie ................................................................................. 130 Testowanie niezmienników klas ...................................................................... 143 Projektowanie sterowane testami .................................................................... 145 Testowanie poprawności parametrów ............................................................. 147 Dodatek A Pułapki .............................................................................149 Dopóki kod działa ......................................................................................... 149 „Test ognia” ................................................................................................. 150 „Działa na mojej maszynie” ........................................................................... 150 Problemy arytmetyki zmiennoprzecinkowej ...................................................... 151 Testy zajmują zbyt wiele czasu ....................................................................... 152 Testy ciągle zawodzą ..................................................................................... 152 Testy zawodzą na niektórych maszynach ......................................................... 153 Metoda main nie jest wykonywana .................................................................. 153 Dodatek B Instalacja JUnit ...............................................................155 Instalacja z wiersza poleceń ............................................................................ 156 Czy JUnit działa? .......................................................................................... 157 Dodatek C Szkielet testów JUnit .....................................................159 Klasa pomocnicza ......................................................................................... 161 Podstawowy szablon ...................................................................................... 163
  • 5. 6 JUnit. Pragmatyczne testy jednostkowe w Javie Dodatek D Zasoby ...............................................................................165 W internecie ................................................................................................. 165 Bibliografia ................................................................................................... 168 Dodatek E Pragmatyczne testy jednostkowe — podsumowanie ............................................................................169 Dodatek F Rozwiązania ćwiczeń ......................................................173 Skorowidz ............................................................................................185
  • 6. rudno przewidzieć wszystkie możliwe błędy w działaniu klasy lub metody. Jeśli mamy sporo doświadczenia w tym zakresie, to intuicyj- nie rozpoznajemy miejsca, w których mogą pojawić się kłopoty, i dzię- ki temu koncentrujemy się najpierw na przetestowaniu właśnie tych miejsc. Jednak dla mniej doświadczonych programistów wykrywanie kłopotliwych obszarów często jest frustrującym zadaniem. Tym bardziej że szczególnie łatwo przychodzi ono użytkownikom końcowym, co jest nie tylko irytujące, ale może stanowić także gwóźdź do trumny niejednej kariery programisty. Dlatego niezwykle cenne są wszelkie wskazówki mogące nam wskazać lub choćby przypomnieć obszary, na które szczególnie należy zwrócić uwagę pod- czas testowania. Przyjrzyjmy się zatem sześciu różnym obszarom testowania, których wyko- rzystanie powinno zwiększyć naszą skuteczność w wykrywaniu błędów: t Czy wyniki są poprawne? t Czy warunki brzegowe zostały prawidłowo określone? t Czy można sprawdzić relacje zachodzące w odwrotnym kierunku? t Czy można sprawdzić wyniki, uzyskując je w alternatywny sposób?
  • 7. 54 JUnit. Pragmatyczne testy jednostkowe w Javie t Czy można wymusić warunki zajścia błędu? t Czy charakterystyka efektywnościowa jest poprawna? Czy wyniki są poprawne? Pierwszy, najbardziej oczywisty obszar testowania to sprawdzenie, czy wyniki działania testowanych metod są poprawne. Kontrolę wyników przedstawiliśmy w rozdziale 2. na przykładzie prostej metody zwracającej największy element listy. Testy te są zwykle najłatwiejsze do przeprowadzenia, a wiele spodziewa- nych wyników często określonych jest w specyfikacji wymagań. Jeśli nie, musisz odpowiedzieć sobie na pytanie: Skąd mam wiedzieć, czy kod działa poprawnie? Jeśli znalezienie satysfakcjonującej odpowiedzi na to pytanie nie jest moż- liwe, tworzenie kodu i jego testów może okazać się kompletnym marnotraw- stwem czasu. A co w przypadku, gdy wymagania dopiero się krystalizują? Czy oznacza to, że nie możemy rozpocząć pisania kodu, dopóki wymaga- nia nie zostaną dokładnie sprecyzowane? Nie, wcale nie. Jeśli ostateczne wymaganie nie są jeszcze znane lub kom- pletne, zawsze możesz wymyślić własne wymagania jako punkt odniesienia. Może okazać się, że nie są one poprawne z punktu widzenia użytkownika, ale dzięki nim wiesz, jak powinien według Ciebie działać kod, i potrafisz odpowiedzieć na postawione wcześniej pytanie. Oczywiście musisz potem, wspólnie z użytkownikami, zweryfikować swoje założenia. Definicja poprawności wyników może zmieniać się w trakcie powstawania kodu, ale na każdym etapie jego tworzenia powinieneś móc stwierdzić, czy kod działa tak, jak założyłeś.
  • 8. Rozdział 4. • Co testować? 55 Stosowanie plików zawierających dane testowe W przypadku zestawów testów wymagających dużej ilości danych wejścio- wych można rozważyć ich umieszczenie (być może wraz z oczekiwanymi wynikami) w osobnych plikach wczytywanych przez testy jednostkowe. Implementacja takiego rozwiązania nie jest skomplikowana i niekoniecznie musi od razu wymagać zastosowania języka XML1. Poniżej przedstawio- na została wersja testu TestLargest, która wczytuje wszystkie testy z pliku. import junit.framework.*; import java.io.*; import java.util.ArrayList; import java.util.StringTokenizer; public class TestLargestDataFile extends TestCase { public TestLargestDataFile(String name) { super(name); } /* Wykonuje testy zapisane w pliku testdata.txt (nie testuje * przypadku wyjątku). Wyrzuca wyjątek w przypadku, * gdy któraś operacja wejścia i wyjścia zakończy się błędem. */ public void testFromFile() throws Exception { String line; BufferedReader rdr = new BufferedReader( new FileReader( "testdata.txt")); while ((line = rdr.readLine()) != null) { if (line.startsWith("#")) { // Ignoruje komentarz continue; } StringTokenizer st = new StringTokenizer(line); if (!st.hasMoreTokens()) { continue; // Pusty wiersz } // Pobiera spodziewany wynik String val = st.nextToken(); int expected = Integer.valueOf(val).intValue(); 1 To jest oczywiście żart, przecież zastosowanie języka XML jest obligatoryjne we wszystkich współczesnych projektach?
  • 9. 56 JUnit. Pragmatyczne testy jednostkowe w Javie // Oraz argumenty dla testowanej metody ArrayList argument_list = new ArrayList(); while (st.hasMoreTokens()) { argument_list.add(Integer.valueOf( st.nextToken())); } // Zamienia listę obiektów w tablicę typu podstawowego int[] arguments = new int[argument_list.size()]; for (int i=0; i < argument_list.size(); i++) { arguments[i] = ((Integer)argument_list. get(i)).intValue(); } TestLargestDataFile.java // Wykonuje asercję assertEquals(expected, Largest.largest(arguments)); } } } Plik danych testowych ma bardzo prosty format — każdy wiersz zawiera zbiór wartości. Pierwsza z nich jest oczekiwanym wynikiem, a pozostałe ar- gumentami testowanej metody. Dodatkowo zastosowanie znaku # na po- czątku wiersza umożliwia wprowadzanie komentarzy. A oto przykład zawartości takiego pliku: # # Proste testy: # 9 7 8 9 9 9 8 7 9 9 8 9 # # Testy z użyciem wartości ujemnych: # -7 -7 -8 -9 -7 -8 -7 -8 -7 -9 -7 -8 # # Testy mieszane: # 7 -9 -7 -8 7 6 4 9 -1 0 9 -7 4 # # Warunki brzegowe: # testdata.txt 1 1 0 0 2147483647 2147483647 -2147483648 -2147483648
  • 10. Rozdział 4. • Co testować? 57 W przypadku kilku testów — jak choćby w powyższym przykładzie — wysiłek włożony w opracowanie odpowiedniego rozwiązania nie zwróci się. Jednak w przypadku zaawansowanej aplikacji wymagającej przeprowadze- nia setek takich testów rozwiązanie wykorzystujące pliki danych na pewno warte jest zainteresowania. Należy przy tym pamiętać, że dane testowe — obojętnie, czy umieszczone bezpośrednio w kodzie, czy w pliku danych testowych — same mogą być niepoprawne. Doświadczenie podpowiada nawet, że prawdopodobieństwo tego, iż dane testowe są nieprawidłowe, jest większe niż tego, że testowany kod jest niepoprawny. Zwłaszcza jeśli dane testowe zostały przygotowane drogą ręcznych obliczeń lub uzyskane z systemu, który zastępujemy naszym oprogramowaniem (ponieważ jego nowe możliwości mogą mieć wpływ na uzyskiwane wyniki). Jeśli wyniki testów są niepomyślne, warto najpierw sprawdzić kilka razy poprawność danych testowych, zanim zabierzemy się do poszukiwania błędu w kodzie. Przedstawiony powyżej kod nie umożliwia testowania wyjątków. Zastanów się, w jaki sposób zaimplementować taką możliwość. Wybierz taki sposób testowania, który pozwoli najłatwiej sprawdzić, czy metoda działa poprawnie. Warunki brzegowe W przykładzie z wyszukiwaniem największego elementu listy udało nam się zidentyfikować szereg warunków brzegowych: gdy największy element znajdował się na końcu listy, gdy lista zawierała wartość ujemną, gdy lista była pusta i tak dalej. Identyfikacja warunków brzegowych jest jednym z najwartościowszych aspektów testowania, ponieważ pozwala wykryć i przetestować obszary, w których prawdopodobieństwo niepoprawnego działania kodu jest naj- większe. Typowe warunki brzegowe powstają na skutek:
  • 11. 58 JUnit. Pragmatyczne testy jednostkowe w Javie t wprowadzenia całkowicie błędnych lub niespójnych danych wejściowych, na przykład łańcucha "!*W:X&Gi/w~>g/h#WQ@" jako nazwy pliku; t nieprawidłowo sformatowanych danych, takich jak adres e-mail, który nie zawiera głównej domeny ("fred@foobar."); t niewprowadzenia odpowiednich wartości (wtedy pojawiają się wartości 0, 0.0, "" lub null); t pojawienia się wartości znacznie przekraczających oczekiwania (na przykład wiek osoby równy 10 000 lat); t pojawienia się duplikatów na listach, które nie powinny ich zawierać; t wystąpienia list nieuporządkowanych zamiast uporządkowanych i na odwrót; spróbuj na przykład przekazać algorytmowi sortowania listę, która jest już posortowana, albo nawet posortuj ją w odwrotnym porządku; t zakłócenia przewidywanego porządku zdarzeń, na przykład próby wydrukowania dokumentu przed zalogowaniem się. Warunków brzegowych można poszukiwać w przedstawionych poniżej obszarach. W przypadku każdego z podanych niżej warunków należy za- stanowić się, czy dotyczy on testowanej metody, a jeśli tak, to co się stanie, gdy zostanie naruszony: t Zgodność — czy wartość jest zgodna z oczekiwanym formatem? t Uporządkowanie — czy zbiór wartości jest odpowiednio uporządkowany? t Zakres — czy wartość należy do przedziału oczekiwanych wartości? t Odwołanie — czy kod odwołuje się do zewnętrznych obiektów, które są poza jego kontrolą? t Istnienie — czy wartość istnieje (czyli jest różna od null, zera, obecna w zbiorze itd.)?
  • 12. Rozdział 4. • Co testować? 59 t Liczność — czy występuje dokładnie tyle wartości, ile jest oczekiwanych? t Czas (absolutny i względny) — czy wszystkie zdarzenia zachodzą w oczekiwanej kolejności i we właściwym czasie? Wymienione obszary warunków brzegowych omówimy w następnym roz- dziale. Sprawdzanie relacji zachodzących w odwrotnym kierunku Działanie niektórych metod można przetestować, używając logiki ich działania w odwrotnym kierunku. Na przykład działanie metody wy- znaczającej pierwiastek kwadratowy możemy sprawdzić, podnosząc wynik do kwadratu i porównując go z wartością wejściową: public void testSquareRootUsingInverse() { double x = mySquareRoot(4.0); assertEquals(4.0, x * x, 0.0001); } Na podobnej zasadzie, wyszukując rekord w bazie danych, możesz sprawdzić działanie metody, która go tam wstawiła. Jednak implementując odwrotną logikę działania metody, należy zachować szczególną ostrożność, ponieważ niepoprawne działanie metody może nie zostać wykryte z powodu tych samych błędów w implementacjach obu me- tod. Dlatego też tam, gdzie jest to tylko możliwe, najlepiej użyć innego kodu źródłowego do implementacji metody działającej w kierunku odwrot- nym. W naszym przykładzie testu metody pierwiastkowania wykorzystali- śmy w tym celu zwykły operator mnożenia. W przypadku testowania metody wstawiającej rekord do bazy danych najlepiej użyć metody wyszukiwania dostarczonej przez producenta systemu zarządzania bazą danych.
  • 13. 60 JUnit. Pragmatyczne testy jednostkowe w Javie Kontrola wyników na wiele sposobów Wyniki działania testowanych metod możemy sprawdzać na wiele sposobów. Zwykle bowiem istnieje więcej niż jeden sposób wyznaczenia interesującej nas wartości. Podczas implementacji kodu produkcyjnego wybieramy ten algorytm, który jest najefektywniejszy lub ma charakterystykę interesującą pod innym względem. Natomiast pozostałe możemy wykorzystać w celu sprawdzenia wyników podczas testowania. Technika ta jest szczególnie pomocna, gdy istnieje ogólnie znany, sprawdzony sposób uzyskania wyni- ków, który jednak jest zbyt mało efektywny lub elastyczny, by mógł zostać użyty w kodzie produkcyjnym. Mniej efektywnego algorytmu możemy użyć do sprawdzenia, czy algorytm zastosowany w wersji produkcyjnej daje takie same wyniki2: public void testSquareRootUsingStd() { double number = 3880900.0; double root1 = mySquareRoot(number); double root2 = Math.sqrt(number); assertEquals(root2, root1, 0.0001); } Inny sposób zastosowania tej techniki polega na sprawdzeniu, czy różne dane sumują się we właściwy sposób. Załóżmy na przykład, że pracujemy nad systemem obsługi biblioteki. W takim systemie liczba egzemplarzy danej książki powinna zawsze zgadzać się z sumą egzemplarzy znajdujących się na półkach biblioteki i egzemplarzy wypożyczonych. Liczba poszcze- gólnych egzemplarzy stanowi osobne dane, które mogą nawet być raporto- wane przez obiekty różnych klas, ale muszą być ze sobą zgodne i wobec tego mogą być używane podczas testowania. 2 Niektóre arkusze kalkulacyjne (na przykład Microsoft Excel) stosują podobną technikę w celu sprawdzenia, czy do rozwiązania danego problemu użyte zostały odpowiednie modele i metody i czy wyniki działania różnych metod są ze sobą zgodne.
  • 14. Rozdział 4. • Co testować? 61 Wymuszanie warunków powstawania błędów Gdy kod produkcyjny pracuje już w rzeczywistym systemie, narażony jest na sytuacje związane z różnego rodzaju błędami, takimi jak brak miejsca na dysku, awarie sieci czy niepoprawna praca innych aplikacji. Aby przete- stować zachowanie kodu w takich sytuacjach, musimy umieć je wywołać. Nie jest to trudne, gdy dotyczy na przykład przekazania kodowi niepo- prawnych parametrów, ale już symulacja błędów sieci wymaga zastosowa- nia odpowiednich technik. Jedną z nich — polegającą na użyciu obiektów imitujących — omówimy w rozdziale 6. Zanim tam dotrzesz, spróbuj za- stanowić się, jakie rodzaje błędów lub ograniczeń wprowadzanych przez środowisko wykonywania kodu należy przetestować? Sporządź krótką ich listę, zanim przejdziesz do dalszej lektury. Zastanów się nad tym, zanim przejdziesz do dalszej lektury... A oto kilka typowych problemów, które udało nam się wymyślić. t Brak wolnej pamięci. t Brak wolnego miejsca na dysku. t Nieprawidłowy czas systemu. t Brak dostępu do sieci i błędy transmisji. t Przeciążenie systemu. t Ograniczona paleta kolorów. t Zbyt duża lub zbyt mała rozdzielczość obrazu. Charakterystyka efektywnościowa Kolejnym obszarem wartym przetestowania jest charakterystyka efektywno- ściowa. Nie chodzi tutaj o samą efektywność działania kodu, lecz o sposób jej zmiany w odpowiedzi na zwiększającą się ilość danych wejściowych, rosnący poziom komplikacji rozwiązywanego problemu i tym podobne.
  • 15. 62 JUnit. Pragmatyczne testy jednostkowe w Javie W tym przypadku zależy nam przede wszystkim na przeprowadzeniu testu regresji charakterystyki efektywnościowej. Często bowiem zdarza się, że pewna wersja systemu pracuje poprawnie, ale już następna okazuje się za- skakująco wolna. Zwykle nie wiemy wtedy, jaka jest tego przyczyna, kto, kiedy i dlaczego wprowadził modyfikacje, które pogorszyły efektywność kodu. A użytkownicy zniecierpliwieni czekają na rozwiązanie problemu. Aby uniknąć takiego scenariusza, możemy wykonać kilka podstawowych testów, które upewnią nas, że krzywa efektywności jest stabilna w nowej wersji kodu. Załóżmy na przykład, że napisaliśmy filtr pozwalający iden- tyfikować witryny internetowe, do których dostęp chcemy zablokować. Stworzony kod działa poprawnie w przypadku kilkudziesięciu witryn, ale czy równie efektywnie będzie się zachowywać w przypadku 10 000 lub nawet 100 000 witryn? Aby się o tym przekonać, musimy napisać odpo- wiedni test jednostkowy. public void testURLFilter() { Timer timer = new Timer(); String naughty_url = "http://www.xxxxxxxxxxx.com"; // Najpierw wyszukaj niedozwolony URL na małej liście URLFilter filter = new URLFilter(small_list); timer.start(); filter.check(naughty_url); timer.end(); assertTrue(timer.elapsedTime() < 1.0); // Następnie wyszukaj niedozwolony URL na większej liście filter = new URLFilter(big_list); timer.start(); filter.check(naughty_url); timer.end(); assertTrue(timer.elapsedTime() < 2.0); // Na koniec wyszukaj niedozwolony URL na liście o jak największym rozmiarze filter = new URLFilter(huge_list); timer.start(); filter.check(naughty_url); timer.end(); assertTrue(timer.elapsedTime() < 3.0); }
  • 16. Rozdział 4. • Co testować? 63 Przeprowadzenie takiego testu daje nam gwarancję, że kod spełnia wymaga- nia odnośnie do jego efektywności. Ponieważ jego wykonanie zajmuje kilka sekund, nie musimy uruchamiać go za każdym razem. Wystarczy, że będzie- my go wykonywać wraz z innymi testami w nocy lub co kilka dni, a zosta- niemy zaalarmowani o pojawiających się problemach z efektywnością kodu wystarczająco wcześnie, aby poprawić je na czas. Istnieje wiele dekoratorów umożliwiających dokładniejsze pomiary efektywno- ści poszczególnych metod, symulację warunków silnego obciążenia i tym podobne. Jednym z takich produktów jest dostępny bezpłatnie JUnitPerf3. 3 http://www.clarkware.com