testy integracyjne

47
www.proskar.pl Testy integracyjne Warsztaty PROSKAR www.proskar.pl

Upload: proskar

Post on 21-Aug-2015

285 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Testy integracyjne

www.proskar.pl

Testy integracyjne

Warsztaty PROSKAR

www.proskar.pl

Page 2: Testy integracyjne

Plan prezentacji

1. Czym są testy integracyjne?

2. Przedstawienie frameworku Arquillian.

3. Implementacja testów integracyjnych Arquilliana wykonywanych na zdalnym serwerze WildFly.

4. Konfiguracja Arquilliana.

5. Przeprowadzanie testów integracyjnych.

www.proskar.pl 2 / 47

Page 3: Testy integracyjne

Czym są testy integracyjne?

• Testy integracyjne służą testowaniu integracji pomiędzy dwoma modułami aplikacji, bądź aplikacją a zewnętrzną usługą.

• Testy integracyjne powinny być uruchamiane na specjalnie przygotowywanym środowisku testowym, które maksymalnie odwzorowywałoby środowisko produkcyjne.

www.proskar.pl 3 / 47

Page 4: Testy integracyjne

Framework Arquillian

• Arquillian to framework do przeprowadzenia szeregu testów, również testów integracyjnych, w symulowanym środowisku produkcyjnym.

• Głównym celem, jest przygotowanie testowanego kodu do postaci archiwum i wykonanie testów na wybranym kontenerze aplikacyjnym, który może być obsługiwany w jednym z trzech trybów.

www.proskar.pl 4 / 47

Page 5: Testy integracyjne

Tryby kontenera aplikacyjnego

• Wbudowany (embedded) – Arquillian sam uruchomi proces kontenera aplikacji w tym samym środowisku, co uruchamiane testy. Po wykonaniu testów kontener zostanie wyłączony.

www.proskar.pl 5 / 47

Page 6: Testy integracyjne

Tryby kontenera aplikacyjnego

• Zarządzany (managed) – Arquillian uruchomi proces kontenera aplikacji jako oddzielny proces na oddzielnej instancji JVM. Po wykonaniu testów kontener zostanie wyłączony.

www.proskar.pl 6 / 47

Page 7: Testy integracyjne

Tryby kontenera aplikacyjnego

• Zdalny (remote) – Arquillian wymaga uruchomionej instancji kontenera pod adresem wskazanym w konfiguracji, aby móc wysłać testowany kod na serwer w celu wykonania testów, po czym odbiera wyniki ich wykonania. W tym trybie Arquillian w żaden sposób nie zarządza cyklem życia kontenera. Testowanie w tym trybie najlepiej symuluje środowisko produkcyjne.

www.proskar.pl 7 / 47

Page 8: Testy integracyjne

Schemat przeprowadzania testów

• Testowanie rozpoczyna się od uruchomienia metody statycznej oznaczonej adnotacją @Deployment, która dostarcza archiwum z testowanym środowiskiem.

• Wygenerowane przez autora testu archiwum wysyłane jest następnie do kontenera, gdzie wykonywane są testy w tej klasie a ich wynik jest odbierany po ich wykonaniu.

• Następnie po wykonaniu testów archiwum jest odłączane od kontenera.

www.proskar.pl 8 / 47

Page 9: Testy integracyjne

Schemat przeprowadzania testów

• Każdy plik testowy wymaga własnej adnotacji @Deployment i wiąże się z wygenerowaniem oddzielnego archiwum, które zostanie sekwencyjnie wdrożone na serwer testowy. W jednej chwili na raz testowana jest tylko jedna klasa.

www.proskar.pl 9 / 47

Page 10: Testy integracyjne

Implementacja testów integracyjnych Arquilliana wykonywanych na zdalnym

serwerze WildFly

www.proskar.pl 10 / 47

Page 11: Testy integracyjne

Wymagane zależności Maven

• Wszystkie zależności dodawane są w tagu <dependencyManagement> głównego POM'a, gdzie określa się wersje wszystkich komponentów. W plikach POM modułów definiuje się już tylko wymagane komponenty bez definiowania wersji. Dzięki takiemu podejściu modyfikacja wersji frameworka jest znacznie prostsza.

www.proskar.pl 11 / 47

Page 12: Testy integracyjne

Wymagane zależności Maven

• Podstawą Arquilliana jest BOM.

www.proskar.pl 12 / 47

Page 13: Testy integracyjne

Wymagane zależności Maven

• Wersjonowanie zależności można rozwiązać poprzez parametry definiowane w POM'ie, co dodatkowo pomoże uprościć zarządzanie wersjami. ${arquillian-version} zdefiniowany jest w części properties:

www.proskar.pl 13 / 47

Page 14: Testy integracyjne

Wymagane zależności Maven

• Kolejnym ważnym krokiem jest zdefiniowanie zależności do kontenera.

www.proskar.pl 14 / 47

Page 15: Testy integracyjne

Wymagane zależności Maven

• Aby móc testować integrację z bazą danych, należy dodać zależność do transakcyjności Arquilliana.

www.proskar.pl 15 / 47

Page 16: Testy integracyjne

Ważne!

Przedstawiona na poprzednim slajdzie musi być umieszczona nad zależnością BOM'a Arquilliana. Wynika to ze sposobu rozwiązywania zależności przez Maven'a. W skrócie: jeżeli jakiś artefakt zostanie zdefiniowany w BOM'ie to zależność ta zostanie zapamiętana i późniejsze wersje będą pominięte. Używanie BOM'ów niesie ze sobą to niebezpieczeństwo, że czasami do poprawnego działania potrzebujemy zależności w innych wersjach niż te, zdefiniowane w BOM'ie. Dlatego należy zdefiniować je nad BOM'em.

www.proskar.pl 16 / 47

Page 17: Testy integracyjne

Wymagane zależności Maven

• Skoro główny POM odpowiedzialny jest za zarządzanie wersjami zależności, można też zdefiniować tam wersje pluginów wykorzystywanych do budowania aplikacji.

• Dzięki tym definicjom każdy z modułów budowany będzie w określony przez nas sposób.

• Oprócz omówionych wcześniej zależności należy dodać pozostałe, użyte w projekcie oraz w testach (TestNG, PostgreSQL JodaTime i inne).

www.proskar.pl 17 / 47

Page 18: Testy integracyjne

Wymagane zależności Maven

W testowanym module należy w sekcji <dependencies> dodać zależnosci, które są używane w projekcie. Warto zwrócić uwagę na zasięg (scope), który wskazuje na sposób dostarczenia zależności przez kontener, na którym uruchomiona ostanie nasza aplikacja.

www.proskar.pl 18 / 47

Page 19: Testy integracyjne

Wymagane zależności Maven

• Dodajemy moduły używane w projekcie.

www.proskar.pl 19 / 47

Page 20: Testy integracyjne

Wymagane zależności Maven

• Kolejny element to resolver ShrinkWrapa, aby móc wygodnie budować archiwa.

• <scope>test</scope> gwarantuje, że artefakt dostępny będzie tylko w trakcie testów i nie zostanie dołączony do archiwum aplikacji po zbudowaniu.

www.proskar.pl 20 / 47

Page 21: Testy integracyjne

Wymagane zależności Maven

• Przyszła kolej na zależności, które dodają framework TestNG oraz rozszerzenie Arquillianowe (wymagane do wykonywania testów przy użyciu Arquilliana).

www.proskar.pl 21 / 47

Page 22: Testy integracyjne

Wymagane zależności Maven

• Dodajemy definicję kontenera, na którym będziemy wykonywać testy. W tym wypadku jest to zdalny serwer .

www.proskar.pl 22 / 47

Page 23: Testy integracyjne

Wymagane zależności Maven

• Zależność umożliwiająca dodawanie transakcyjności w testach Archqillianowych.

www.proskar.pl 23 / 47

Page 24: Testy integracyjne

Wymagane zależności Maven

• Na koniec należy w sekcji <build> zdefiniować plugin do wykonywania testów.

www.proskar.pl 24 / 47

Page 25: Testy integracyjne

Konfiguracja Arquilliana

www.proskar.pl 25 / 47

Page 26: Testy integracyjne

Plik konfiguracyjny

• Plik, w którym jest umieszczana konfiguracja Arquilliana nosi nazwę arquillian.xml.

• Powinien się on znajdować w zasobach testowych (Other Test Sources) w przypadku, gdy wymagane jest nadpisanie domyślnego zachowania.

• W przypadku testowania na serwerze zdalnym wymagane jest zdefiniowanie informacji o tymże serwerze.

www.proskar.pl 26 / 47

Page 27: Testy integracyjne

Plik konfiguracyjny

www.proskar.pl 27 / 47

Page 28: Testy integracyjne

Plik konfiguracyjny

• W listingu na poprzednim slajdzie zamieszczono trzy istotne informacje: – defaultProtocol - opisuje jaki protokół ma być

użyty do wdrażania.

– DeploymentExportPath – bez tej opcji ShrinkWrap będzie umieszczał testowe archiwa w systemowym folderze tymczasowym, skąd zostaną usunięte po wykonaniu testów

– Container wildfly-remote – określa parametry połączenia z serwerem zdalnym.

www.proskar.pl 28 / 47

Page 29: Testy integracyjne

Ważne!

Po dodaniu zależności i pliku konfiguracyjnego Arquilliana projekt powinien się budować, choć nie będą wykonywane żadne testy. Jeżeli projekt nie buduje się na tym etapie oznaczać to może nieprawidłowości w definiowaniu zależności bądź konfiguracji Arquilliana. Należy zwrócić uwagę również, czy serwer zdalny jest dostępny (uruchomiony).

www.proskar.pl 29 / 47

Page 30: Testy integracyjne

Testy integracyjne

www.proskar.pl 30 / 47

Page 31: Testy integracyjne

Tworzenie testu Arquilliana

• Aby wykonać testy w danej klasie niezbędne jest: – Rozszerzenie klasy org.jboss.arquillian.testng.Arquillian,

– Zdefiniowanie w tej klasie publicznej metody statycznej, która zwraca obiekt dziedziczący po Archive,

– Opatrzenie tej klasy adnotacją org.jboss.arquillian.container.test.api.Deployment.

www.proskar.pl 31 / 47

Page 32: Testy integracyjne

Deployment przy pomocy

• Zwracanie obiektu w przedstawionej wcześniej metodzie jest możliwe dzięki zastosowaniu biblioteki ShrinkWrap.

www.proskar.pl 32 / 47

Page 33: Testy integracyjne

Deployment przy pomocy

• Aby generować rozbudowane Archiwum testowe można przygotować klasę, którą będzie można używać w wielu testach.

www.proskar.pl 33 / 47

Page 34: Testy integracyjne

Przykład metody tworzącej archiwum

www.proskar.pl 34 / 47

Page 35: Testy integracyjne

Wymagania dotyczące bazy danych

W trakcie testów należy zapewnić połączenie do bazy testowej. Może to być źródło zarówno JTA, jak i lokalne. Należy jednak zapewnić, aby łączyło się do bazy w ten sam sposób co źródło produkcyjne. Testowa baza danych powinna być utworzona na tej samej bazie danych. W przeciwnym wypadku testy integracyjne nie będą w pełni prawidłowo testować integracji z bazą danych.

www.proskar.pl 35 / 47

Page 36: Testy integracyjne

Metoda resolveProjectClasses(archive)

• Metoda resolveProjectClasses(archive) odpowiedzialna jest za dodanie testowanego kodu.

www.proskar.pl 36 / 47

Page 37: Testy integracyjne

Metoda resolveDependencies(archive)

• Odpowiada za dodanie zależności z POM'a.

www.proskar.pl 37 / 47

Page 38: Testy integracyjne

Pisanie testów Arquilliana

• Testy Arquilliana polegają w głównej mierze na wykonywaniu testowanej metody oraz porównywaniu otrzymanego wyniku z wartością oczekiwaną.

www.proskar.pl 38 / 47

Page 39: Testy integracyjne

Pisanie testów Arquilliana

• Aby przetestować obiekt Dao należy go wstrzyknąć tak jak poniżej:

www.proskar.pl 39 / 47

Page 40: Testy integracyjne

Pisanie testów Arquilliana

• Kod wykonywany przed i po testach powinien być umieszczony w publicznie dostępnych metodach oznaczonych adnotacjami @BeforeTest i @AfterTest.

www.proskar.pl 40 / 47

Page 41: Testy integracyjne

Przykładowy test

www.proskar.pl 41 / 47

Page 42: Testy integracyjne

Klasa abstrakcyjna testów NG

• Implementacje Arquilliana można z powodzeniem ukryć przy pomocy klasy abstrakcyjnej, którą rozszerzałyby wszystkie testy integracyjne i funkcjonalne.

• W tym celu można stworzyć klasę abstrakcyjną, która rozszerza klasę Arquillian.

www.proskar.pl 42 / 47

Page 43: Testy integracyjne

Metodyka przeprowadzania testów integracyjnych z bazą danych

• Aby prawidłowo przeprowadzić testy integracyjne z bazą danych testy powinny sprawdzać jak działają wszystkie metody obiektów.

www.proskar.pl 43 / 47

Page 44: Testy integracyjne

Co należy sprawdzić?

• Manipulacja na danych. Czy cały CRUD działa prawidłowo? • Walidacja pól unikalnych. Czy na pewno nie można dodać

dwóch obiektów o takiej samej wartości? • Walidacja wartości generowanych po stronie bazy. Jeżeli

metoda wykonuje akcję DML na obiekcie i w trakcie tej akcji baza danych powinna modyfikować jakąś wartość obiektu, to należy sprawdzić, czy ta wartość jest dostępna.

• Test walidacji pól. Jeżeli w dano pole można wpisać tylko wartość o ściśle określonej semantyce, należy sprawdzić czy poprawna semantycznie wartość może zostać zapisana oraz czy nie istnieje jakaś wartość niepoprawna, która może zostać zapisana.

www.proskar.pl 44 / 47

Page 45: Testy integracyjne

Co należy sprawdzić?

• Jeżeli w projekcie istnieje DML wdrożeniowy należy sprawdzić, czy wartości znajdują się w bazie i są dostępne. Można sprawdzić ich wartości oraz liczność.

• Jeżeli baza danych posiada jakieś funkcje generujące wartości należy sprawdzić, czy zwracane wartości są poprawne semantycznie i są zgodne z założeniami projektowymi.

• Jeżeli pole jest unikalne tylko w pewnym kontekście, należy sprawdzić, czy unikalność jest tylko w tym kontekście i nie uniemożliwia nadawanie tych wartości w innych kontekstach.

• Jeżeli do pola testowego zapisywana jest jakaś enumeracja, należy walidować wprowadzanie wszystkich wartości oraz wartości spoza enumeracji oczekując błędu wstawienia.

www.proskar.pl 45 / 47

Page 46: Testy integracyjne

Ważne!

• Po każdym teście następuje wycofanie transakcji.

• Kolejność testów nie ma znaczenia.

www.proskar.pl 46 / 47

Page 47: Testy integracyjne

Dziękuję za uwagę

www.proskar.pl 47 / 47