Testy integracyjne

Ten wpis jest kontynuacją serii dotyczącej różnych poziomów testów. Przed przystąpieniem do czytania zachęcam Cię do zapoznania się z poprzednim postem o testach jednostkowych. W tym wpisie postaram się przybliżyć testy integracyjne.

Aplikacja
Spróbujemy rozbudować naszą aplikację. Nie będzie to już zwykły kalkulator, a aplikacja która liczy ile wybranej waluty możemy otrzymać, gdy posiadamy konkretną ilość polskich złotych. Aby tego dokonać będziemy korzystali z zewnętrznego serwisu, aby pobrać aktualny kurs wymiany danej waluty oraz z metody kalkulatora którą przetestowaliśmy w ramach testów jednostkowych.
Testowana metoda
Nasza metoda posiada dwa parametry. Pierwszy to ilość złotówek jakie chcemy przeliczyć, a drugi to nazwa waluty którą chcemy otrzymać. Wewnątrz metody tworzymy nowy obiekt klasy Calculator, który posłuży nam do operacji wyliczania ilości waluty którą otrzymamy.Widzimy tutaj, że nasza metoda korzysta z dwóch klas, które możemy traktować jako jednostki. Udało nam się napisać nawet testy jednostkowe dla metody div i mamy pewność, że ta metoda działa poprawnie. Nasza metoda integruje dwie jednostki ze sobą.
public class ExchangeCalculator { public int calculate (int amount, String currencyName) { Calculator calculator = new Calculator(); ExchangeService exchange = ExchangeService(); float rate = exchange.getRate(currencyName); return calculator.div(amount,rate) } // inne metody }
Pierwszy test
W naszych testach będziemy sprawdzali czy metoda calculate() działa poprawnie. Spróbujemy kilkukrotnie ją wywołać dla różnych wartości liczbowych i zobaczymy czy metoda zachowa się tak jak tego oczekujemy.
Nasz test weryfikuje działanie większego fragmentu kodu. Sprawdzamy tutaj czy pojedyncze jednostki (kalkulator i serwis z kursami walut) będą w stanie poprawnie zadziałać gdy zaczniemy do nich przekazywać różne wartości.
@Test public void divTest() { ExchangeCalculator calculator = new ExchangeCalculator(); Assert.assertEquals(calculator.calculate(1000f,USD),250); }
Pierwsza linijka wewnątrz metody to stworzenie klasy kalkulatora walut w której znajduje się metoda, którą chcemy testować. Druga linika to sprawdzenie (asercja) czy wynik metody calculate(1000f,USD) jest równy 250. Po uruchomieniu test kończy się sukcesem. Metoda działa dla powyższych danych testowych.
Drugi test
Kolejny test przeprowadzimy dla waluty, która nie istnieje. Spróbujemy zweryfikować działanie metody calculate() dla wartości 1000, „Dummy”.
Oczekiwany rezultat to 0. Test dla przedstawionych wartości może wyglądać następująco:
@Test public void divTest() { ExchangeCalculator calculator = new ExchangeCalculator(); Assert.assertEquals(calculator.calculate(1000f,"Dummy"),0); }
Dla powyższych danych testowych dostaniemy wyjątek. Nasz program został przerwany. Odkryliśmy błąd w Naszym programie i teraz możemy zastanowić się z czego on wynika. Po przeanalizowniu metody getRate widzimy, że zgodnie z dokumentacja NBP z którego pobieramy przelicznik waluty, powinien zwracać on błąd dla nazw walut które są niepoprawne. Możemy spróbować obsłużyć ten wyjątek wewnątrz metody calculate() i zwracać wartośc zero gdy nazwa waluty nie bedzie poprawna
public class ExchangeCalculator { public int calculate (int amount, String currencyName) { Calculator calculator = new Calculator(); float rate = 0f; try{ ExchangeService exchange = ExchangeService(); float rate = exchange.getRate(currencyName); }catch(UnknownCurrency ex) { ex.printStacktrace() } return calculator.div(amount,rate) } // inne metody }
Teraz poniższy test powinien zakończyć się sukcesem:
@Test public void divTest() { ExchangeCalculator calculator = new ExchangeCalculator(); Assert.assertEquals(calculator.calculate(1000f,"Dummy"),0); }
Podsumowanie
W tym wpisie na prostym przykładzie przedstawiłem ideę testów integracyjnych. Jako przykład podałem próbę integracji kodu kalkulatora z serwisem kursów walut. Oczywiście możemy też testować inne integracje np. z bazą danych. Taką integrację moglibyśmy testować, gdyby nasz kalkulator zapisywal wyniki do bazy danych
Warto zapamiętać ten przykład, aby w łatwy sposób wytłumaczyć czym są testy integracyjne podczas rozmowy rekrutacyjnej.