Środowisko testowe pod rest-a
DESCRIPTION
Piotr Misiuga - prezentacja z trzeciego spotkania Quality Meetup.TRANSCRIPT
ŚRODOWISKO TESTOWE POD REST’A
Piotr MisiugaTest Developer
AGENDA
1. REST API 2. Framework Rest-Assured 3. Maven – wprowadzenie 4. Embedded Tomcat i Embedded
ElasticSearch 5. SonarQube i pokrycie testów
integracyjnych z JaCoCo
AGENDA
1. REST API 2. Framework Rest-Assured 3. Maven – wprowadzenie 4. Embedded Tomcat i Embedded
ElasticSearch 5. SonarQube i pokrycie testów
integracyjnych z JaCoCo
REST API
Representational State Transfer – styl architektoniczny dla projektowania aplikacji rozproszonych
Założenia: Architektura klient-serwer Bezstanowość (cache) Jednolity interfejs dostępu
Jednolity interfejs: Jednolita identyfikacja / adresacja zasobów Manipulacja zasobami poprzez ich reprezentacje Bezstanowa komunikacja (serwer nie tworzy sesji)
REST API
Styl architektury dla projektowania aplikacji sieciowych
http://www.codeproject.com/Articles/426769/Creating-a-REST-service-using-ASP-NET-Web-API
REST API
Zasoby jako źródła danych URI – nazwa, która identyfikuje zasób
Np. http://myserver/tasks Np. http://myserver/tasks/12345
http://www.codeproject.com/Articles/426769/Creating-a-REST-service-using-ASP-NET-Web-API
REST API
Każdy zasób posiada reprezentację Reprezentacje dodatkowo mogą zawierać
metadane
http://www.codeproject.com/Articles/426769/Creating-a-REST-service-using-ASP-NET-Web-API
ARCHITEKTURA TESTÓW
REST API – JEDNOLITY INTERFEJSMETODY
GET - odczytywanie danych POST - wstawianie/edycja danych PUT – wstawianie/edycja danych DELETE - usuwanie danych
REST API – METODA GET
REST API – METODA GET
REST API – METODA GET
Filtrowanie zapytań
REST API – METODA POST
REST API – METODY CRUD ≠ HTTP?
CRUD HTTP
Create POST
Read GET
Update PUT
Delete DELETE
POST VS. PUT
Idempotentność – koncepcja specyfikacji HTTP.
Requesty, które posiadają tę cechę będą zakończone niezmiennym stanem po stronie serwera, niezależnie od tego ile razy zostaną wykonane.
GET, HEAD, PUT, DELETE są idempotentne
POST VS. PUT OPERACJA CREATE
POST:- zalecana metoda- używamy, gdy nie znamy identyfikatora tworzonego zasobu (generowany jest po stronie serwera)- w odpowiedzi otrzymujemy status „201 Created” oraz położenie(identyfikator) nowostworzonego zasobu
POST VS. PUT OPERACJA CREATE
PUT:- musimy podać identyfikator- używane w systemach, gdzie identyfikator generowany jest po stronie klienta-Wstawia zasób zastępując całkowicie to co istnieje pod danym URL, dlatego wymaga podania wszystkich wartości
POST VS. PUT OPERACJA UPDATE
POST:- w ciele możemy podać wszystkie pola lub tylko niektóre z nich- nie jest idempotentna, bezpieczna
POST VS. PUT OPERACJA UPDATE
PUT:- w ciele musimy podać wszystkie pola(wartości)- jest idempotentna
PODSUMOWANIE
ZasóbPOST
(create)GET
(read)PUT
(update)DELETE(delete)
/customers
201(Created), Zostaje
stworzony nowy klient z
wygenerowanym ID
200(OK),Pobranie listy
klientów
404(Not Found), chyba, że edytujemy całą kolekcję
404(Not Found), chyba, że usuwamy całą kolekcję
/customers/{id}
404(Not Found)Pobranie klienta
o ID {id}
200(OK) lub 204(No
Content). Zwraca klienta jeśli istnieje.
404(Not Found) Jeśli nie istnieje
zwraca błąd
200(OK) usuwa klienta o ID
{id}. 404(Not Found)Jeśli nie istnieje
zwraca błąd.
NARZĘDZIA DO TESTOWANIA REST’A
curl
Python:-urllib2-requests-rester
Java:-Rest-assured + awaitility
AGENDA
1. REST API 2. Framework Rest-Assured 3. Maven – wprowadzenie 4. Embedded Tomcat i Embedded
ElasticSearch 5. SonarQube i pokrycie testów
integracyjnych z JaCoCo
REST-ASSURED
Łatwy w użyciu DSL oparty na Javie Gherkin syntax (given(), when(), then()) Automatyczne mapowanie(JAX-B dla XML jak i
Jackson lub Gson dla JSON) Walidacja Xpath (XMLPath) Walidacja JSONpath (JSONPath) Reużywalność specyfikacji
REST-ASSURED
REST-ASSURED
Wymagania:-JDK >= 1.6-Maven
Instalacja za pomocą maven’a:
KONFIGURACJA REST-ASSURED
WALIDACJA JSON’A
WALIDACJA JSON’A II
WALIDACJA JSON’A VS. JSON SCHEMA
WALIDACJA JSON VS. JSON SCHEMA
GROOVY CLOSURES W JSONPATH
GROOVY CLOSURES W JSONPATH
WALIDACJA XML
WALIDACJA XML – OBSŁUGA XPATH
WALIDACJA XML WYKORZYSTUJĄC XSD SCHEMA
WALIDACJA XML WYKORZYSTUJĄC XSD SCHEMA
WALIDACJA XML WYKORZYSTUJĄC XSD SCHEMA
PRZESYŁANIE PARAMETRÓW, WALIDACJA STATUSU I CONTENT-TYPE
PROSTE UWIERZYTELNIANIE
USTAWIANIE NAGŁÓWKÓW
TESTOWANIE NAGŁÓWKÓW
TESTOWANIE DOSTĘPU PRZY UŻYCIU COOKIES
WALIDACJA ZA POMOCĄ COOKIES
WIELOKROTNE WYKORZYSTANIE SPECYFIKACJI
AWAITILITY – BIBLIOTEKA DO TESTOWANIA ASYNCHRONICZNYCH SYSTEMÓW
AWAITILITY – BIBLIOTEKA DO TESTOWANIA ASYNCHRONICZNYCH SYSTEMÓW
Instalacja
Przykład użycia
AWAITILITY + REST-ASSURED
AGENDA
1. REST API 2. Framework Rest-Assured 3. Maven – wprowadzenie 4. Embedded Tomcat i Embedded
ElasticSearch 5. SonarQube i pokrycie testów
integracyjnych z JaCoCo
MAVEN – WPROWADZENIE
Budowanie oprogramowania przy użyciu maven’a ma zakończyć się osiągnięciem wybranego celu
Cele definiowane są przez wtyczki (plugins) Cele mogą być wywoływane w różnych
fazach cyklu życia projektu Projekt mavenowy definiuje się poprzez
stworzenie i utrzymywanie pliku pom.xml (Project Object Model)
POM zawiera elementy definiujące projekt, jego strukturę, sposób budowania i zależności
PRZYKŁADOWY POM.XML
DOMYŚLNY CYKL ŻYCIA PROJEKTU Fazy domyślnego cyklu życia projektu:
- validate - sprawdza poprawność projektu
- compile - kompiluje kod źródłowy;
- test - wykonuje testy jednostkowe;
- package - pakuje skompilowany kod w paczki dystrybucyjne (np. Jar, war);
- integration-test – deployuje paczkę w środowisku testów integracyjnych;
- verify - sprawdza poprawność paczki;
- install - umieszcza paczkę w lokalnym repozytorium aby mogła być używana przez inne moduły;
- deploy - umieszcza (publikuje) paczkę w zdalnym repozytorium.
DODATKOWE CYKLE ŻYCIA
clean – czyści wynik działania wcześniejszych buildów (folder target)
site – generuje dokumentację projektu
PLUGINY
Wywołanie celów zdefiniowanych w pluginach za pomocą komendy mvn [plugin]:[goal]
mvn compile:compile
ZALEŻNOŚCI
MAVEN - DZIAŁANIE
POWIĄZANIA POMIĘDZY POM-AMI
1. Dziedziczenie projektów
Co jest dziedziczone?- zależności- pluginy- konfiguracje
2. Agregacja – projekty wielomodułowe
DEFINIOWANIE USTAWIEŃ
Możliwość definiowania zmiennych lub zarządzania zmiennymi:- projektu ${project.version}
- środowiskowymi ${env.JAVA_HOME} - systemowymi ${java.version}
PROFILE
Umożliwiają zbudowanie projektu w różnych środowiskach np. QA, DEV, PROD
PROFILE
Aktywacja profilu mvn [plugin]:[goal]-P[profil]
AGENDA
1. REST API 2. Framework Rest-Assured 3. Maven – wprowadzenie 4. Embedded Tomcat i Embedded
ElasticSearch 5. SonarQube i pokrycie testów
integracyjnych z JaCoCo
INTEGRACYJNE TESTY NA EMBEDOWANYM TOMCACIE
Cel jaki chcemy uzyskać to:1. Uruchomić aplikację, którą chcemy testować na wtyczce Apache Maven Tomcat 72. Uruchomić testy posiadające przyrostek IntegrationTest3. Po testach wyłączyć serwer
INTEGRACYJNE TESTY NA EMBEDOWANYM TOMCACIE
Wtyczka Surefire odpowiada za uruchomienie testów JUnit w fazie test
Musimy wyłączyć testy integracyjne z tej fazy
INTEGRACYJNE TESTY NA EMBEDOWANYM TOMCACIE
Wtyczka Failsafe odpowiada za uruchomienie testów integracyjnych JUnit w fazie integration-test
Dodajemy testy integracyjne i aktywujemy plugin
INTEGRACYJNE TESTY NA EMBEDOWANYM TOMCACIE
WIELOMODUŁOWY PROJEKT NA EMBEDDED TOMCAT
Problem: Celem jest przetestowanie aplikacji zanim trafi do repozytorium
WIELOMODUŁOWY PROJEKT NA EMBEDDED TOMCAT
Rozwiązanie: -ustawienie zmiennych w parent pom.xml
WIELOMODUŁOWY PROJEKT NA EMBEDDED TOMCAT
Ustawienie ścieżek do projektów z zasobami w child-pomach
Moduł z testami aplikacji moduleA
Moduł z testami aplikacji moduleB
ELASTICSEARCH – KTÓRTKIE WPROWADZENIE
Czym jest ES? Bazą danych dokumentów rozproszonych
Darmowym (open-source) silnikiem wyszukiwania w czasie rzeczywistym
Narzędziem do analizy
RESTowym serwisem
Nie przejmuje się schemą
ELASTICSEARCH – JAKO BAZA NOSQL
MySQL ElasticSearch
Baza danych Index
Tabela Typ (Type)
Wiersz Dokument (Document)
Kolumna Pole (Field)
Schema Mapowanie (Mapping)
Index Wszystko jest indeksowane
SQL DSL zapytań
SELECT * FROM table… GET http://
UPDATE table SET … PUT http://
EMBEDDED ELASTICSEARCH – POTRZEBNA TERMINOLOGIA
Node – instancja elasticsearch (proces javowy), zwykle jeden node uruchomiony jest na jednej maszynie. Odpowiada za przechowanie danych, dodawanie i usuwanie indeksów
Cluster – grupa node’ów z tym samym cluster.name, które współdzielą dane i zapewniają działanie i skalolwalność. Pojedynczy node może tworzyć cluster
Mapping – proces definiowania struktury typu w indeksie.
Client– klient javy, który umożliwia wysyłanie requestów do node’a w clusterze.
INTEGRACYJNE TESTY W OPARCIU O EMBEDDED ELASTICSEARCH PROCEDURA
Tworzymy node’a Tworzymy indeks i definiujemy mapowanie Dodajemy dokumenty o danym typie Uruchamiamy naszego embedded
elasticsearch’a przed uruchomieniem testów
EMBEDDED ELASTICSEARCH – TWORZENIE NODE’A
PRZYKŁADOWY MAPPING
EMBEDDED ELASTICSEARCH – DODAWANIE MAPPINGU, TWORZENIE INDEXU
EMBEDDED ELASTICSEARCH – DODAWANIE DOKUMENTÓW
INTEGRACYJNE TESTY W OPARCIU O EMBEDDED ELASTICSEARCH
Piszemy prosty mavenowy plugin dla embedded elasticsearch’a.
AGENDA
1. REST API 2. Framework Rest-Assured 3. Maven – wprowadzenie 4. Embedded Tomcat i Embedded
ElasticSearch 5. SonarQube i pokrycie testów
integracyjnych z JaCoCo
SONARQUBE – NARZĘDZIE DO ZARZĄDZANIA JAKOŚCIĄ KODU
Sonar analizuje kod w siedmiu wymiarach:
duplikacja kodu standardy kodowania (konwencje) testy jednostkowe kompleksowość potencjalne błędy komentarze architektura
SONARQUBE - DASHBOARD
POKRYCIE KODU
Co to jest pokrycie kodu?
Miara wykorzystywana przy testowaniu oprogramowania
Opisuje w jakim stopniu program został sprawdzony przez testy
Zazwyczaj wykorzystywane przy określaniu ‘skuteczności’ testów jednostkowych (integracyjnych)
Dla większości języków istnieją zestawy narzędzia do testowania / pomiaru pokrycia
Pokrycie możemy mierzyć według różnych kryteriów
JACOCO – NARZĘDZIE UMOŻLIWIAJĄCE POMIAR POKRYCIA KODU W ŚRODOWISKACH JVM
JaCoCo
Analizuje pokrycie instrukcji (C0), gałęzi (C1), linii, metod, typów, powtarzalności kodu
Wspiera różne języki JVM Zintegrowane z wieloma popularnymi
narzędziami w tym SonarQube, Maven Przeprowadza instrumentacje bajt kodu „w locie”
(tym wyróżnia się spośród konkurencji) http://www.eclemma.org/jacoco/
ANALIZA POKRYCIA KODU PRZEZ TESTY INTEGRACYJNE – SONAR I JACOCO
1. Konfiguracja agenta JaCoCo i przypisanie go do JVM, na której uruchamiane są testy integracyjne. Konfiguracja możliwa jest poprzez linię komend lub poprzez JaCoCo Maven plugin
2. Uruchomienie integracyjnych testów. Na koniec agent JaCoCo generuje raport pokrycia kodu w miejscu, które ustawiliśmy w kroku 1.
3. Konfiguracja SonarQube, by używał wygenerowanego raportu
4. Po uruchomieniu analizy Sonar’a generuje się pokrycie kodu przez testy integracyjne
KONFIGURACJA AGENTA JACOCO – JACOCO MAVEN PLUGIN
Dodajemy jacoco-maven-plugin do naszego projektu
Konfigurujemy plugin
KONFIGURACJA FAILSAFE-PLUGIN
Konfigurujemy failsafe plugin, gdyż to on jest odpowiedzialny za uruchomienie testów integracyjnych
KONFIGURACJA SONARQUBE
W pliku sonar-project.properties
sonar.jacoco.itReportPath=target/jacoco-it.exec
W sonar-maven-plugin
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin> <sonar.jacoco.itReportPath>target/jacoco-it.exec</
sonar.jacoco.itReportPath>
ANALIZA POKRYCIA KODU PRZEZ TESTY INTEGRACYJNE – SONAR I JACOCO
Problem – Embedded Tomcat
Niestety wtyczka tomcat7-maven-plugin nie potrafi „skonsumować” / skorzystać z argLine’a, z którego korzysta failsafe plugin (Jetty potrafi)
Rozwiązanie:
Przekazanie argumentów VM do konfiguracji build’a
ANALIZA POKRYCIA KODU PRZEZ TESTY INTEGRACYJNE – SONAR I JACOCO
ANALIZA POKRYCIA KODU PRZEZ TESTY INTEGRACYJNE – SONAR I JACOCO
Wynik po uruchomieniu testów integracyjnych, a następnie analizy SonarQube’a
DZIĘKUJĘ ZA UWAGĘ!