Środowisko testowe pod rest-a

91
ŚRODOWISKO TESTOWE POD REST’A Piotr Misiuga Test Developer

Upload: future-processing

Post on 26-Jun-2015

365 views

Category:

Technology


3 download

DESCRIPTION

Piotr Misiuga - prezentacja z trzeciego spotkania Quality Meetup.

TRANSCRIPT

Page 1: Środowisko testowe pod REST-a

ŚRODOWISKO TESTOWE POD REST’A

Piotr MisiugaTest Developer

Page 2: Środowisko testowe pod REST-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

Page 3: Środowisko testowe pod REST-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

Page 4: Środowisko testowe pod REST-a

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)

Page 5: Środowisko testowe pod REST-a

REST API

Styl architektury dla projektowania aplikacji sieciowych

http://www.codeproject.com/Articles/426769/Creating-a-REST-service-using-ASP-NET-Web-API

Page 6: Środowisko testowe pod REST-a

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

Page 7: Środowisko testowe pod REST-a

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

Page 8: Środowisko testowe pod REST-a

ARCHITEKTURA TESTÓW

Page 9: Środowisko testowe pod REST-a

REST API – JEDNOLITY INTERFEJSMETODY

GET - odczytywanie danych POST - wstawianie/edycja danych PUT – wstawianie/edycja danych DELETE - usuwanie danych

Page 10: Środowisko testowe pod REST-a

REST API – METODA GET

Page 11: Środowisko testowe pod REST-a

REST API – METODA GET

Page 12: Środowisko testowe pod REST-a

REST API – METODA GET

Filtrowanie zapytań

Page 13: Środowisko testowe pod REST-a
Page 14: Środowisko testowe pod REST-a

REST API – METODA POST

Page 15: Środowisko testowe pod REST-a

REST API – METODY CRUD ≠ HTTP?

CRUD HTTP

Create POST

Read GET

Update PUT

Delete DELETE

Page 16: Środowisko testowe pod REST-a

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

Page 17: Środowisko testowe pod REST-a

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

Page 18: Środowisko testowe pod REST-a

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

Page 19: Środowisko testowe pod REST-a

POST VS. PUT OPERACJA UPDATE

POST:- w ciele możemy podać wszystkie pola lub tylko niektóre z nich- nie jest idempotentna, bezpieczna

Page 20: Środowisko testowe pod REST-a

POST VS. PUT OPERACJA UPDATE

PUT:- w ciele musimy podać wszystkie pola(wartości)- jest idempotentna

Page 21: Środowisko testowe pod REST-a

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.

Page 22: Środowisko testowe pod REST-a

NARZĘDZIA DO TESTOWANIA REST’A

curl

Python:-urllib2-requests-rester

Java:-Rest-assured + awaitility

Page 23: Środowisko testowe pod REST-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

Page 24: Środowisko testowe pod REST-a

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

Page 25: Środowisko testowe pod REST-a

REST-ASSURED

Page 26: Środowisko testowe pod REST-a

REST-ASSURED

Wymagania:-JDK >= 1.6-Maven

Instalacja za pomocą maven’a:

Page 27: Środowisko testowe pod REST-a

KONFIGURACJA REST-ASSURED

Page 28: Środowisko testowe pod REST-a

WALIDACJA JSON’A

Page 29: Środowisko testowe pod REST-a

WALIDACJA JSON’A II

Page 30: Środowisko testowe pod REST-a

WALIDACJA JSON’A VS. JSON SCHEMA

Page 31: Środowisko testowe pod REST-a

WALIDACJA JSON VS. JSON SCHEMA

Page 32: Środowisko testowe pod REST-a

GROOVY CLOSURES W JSONPATH

Page 33: Środowisko testowe pod REST-a

GROOVY CLOSURES W JSONPATH

Page 34: Środowisko testowe pod REST-a

WALIDACJA XML

Page 35: Środowisko testowe pod REST-a

WALIDACJA XML – OBSŁUGA XPATH

Page 36: Środowisko testowe pod REST-a

WALIDACJA XML WYKORZYSTUJĄC XSD SCHEMA

Page 37: Środowisko testowe pod REST-a

WALIDACJA XML WYKORZYSTUJĄC XSD SCHEMA

Page 38: Środowisko testowe pod REST-a

WALIDACJA XML WYKORZYSTUJĄC XSD SCHEMA

Page 39: Środowisko testowe pod REST-a

PRZESYŁANIE PARAMETRÓW, WALIDACJA STATUSU I CONTENT-TYPE

Page 40: Środowisko testowe pod REST-a

PROSTE UWIERZYTELNIANIE

Page 41: Środowisko testowe pod REST-a

USTAWIANIE NAGŁÓWKÓW

Page 42: Środowisko testowe pod REST-a

TESTOWANIE NAGŁÓWKÓW

Page 43: Środowisko testowe pod REST-a

TESTOWANIE DOSTĘPU PRZY UŻYCIU COOKIES

Page 44: Środowisko testowe pod REST-a

WALIDACJA ZA POMOCĄ COOKIES

Page 45: Środowisko testowe pod REST-a

WIELOKROTNE WYKORZYSTANIE SPECYFIKACJI

Page 46: Środowisko testowe pod REST-a

AWAITILITY – BIBLIOTEKA DO TESTOWANIA ASYNCHRONICZNYCH SYSTEMÓW

Page 47: Środowisko testowe pod REST-a

AWAITILITY – BIBLIOTEKA DO TESTOWANIA ASYNCHRONICZNYCH SYSTEMÓW

Instalacja

Przykład użycia

Page 48: Środowisko testowe pod REST-a

AWAITILITY + REST-ASSURED

Page 49: Środowisko testowe pod REST-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

Page 50: Środowisko testowe pod REST-a

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

Page 51: Środowisko testowe pod REST-a

PRZYKŁADOWY POM.XML

Page 52: Środowisko testowe pod REST-a

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.

Page 53: Środowisko testowe pod REST-a

DODATKOWE CYKLE ŻYCIA

clean – czyści wynik działania wcześniejszych buildów (folder target)

site – generuje dokumentację projektu

Page 54: Środowisko testowe pod REST-a

PLUGINY

Wywołanie celów zdefiniowanych w pluginach za pomocą komendy mvn [plugin]:[goal]

mvn compile:compile

Page 55: Środowisko testowe pod REST-a

ZALEŻNOŚCI

Page 56: Środowisko testowe pod REST-a

MAVEN - DZIAŁANIE

Page 57: Środowisko testowe pod REST-a

POWIĄZANIA POMIĘDZY POM-AMI

1. Dziedziczenie projektów

Co jest dziedziczone?- zależności- pluginy- konfiguracje

2. Agregacja – projekty wielomodułowe

Page 58: Środowisko testowe pod REST-a

DEFINIOWANIE USTAWIEŃ

Możliwość definiowania zmiennych lub zarządzania zmiennymi:- projektu ${project.version}

- środowiskowymi ${env.JAVA_HOME} - systemowymi ${java.version}

Page 59: Środowisko testowe pod REST-a

PROFILE

Umożliwiają zbudowanie projektu w różnych środowiskach np. QA, DEV, PROD

Page 60: Środowisko testowe pod REST-a

PROFILE

Aktywacja profilu mvn [plugin]:[goal]-P[profil]

Page 61: Środowisko testowe pod REST-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

Page 62: Środowisko testowe pod REST-a

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

Page 63: Środowisko testowe pod REST-a

INTEGRACYJNE TESTY NA EMBEDOWANYM TOMCACIE

Wtyczka Surefire odpowiada za uruchomienie testów JUnit w fazie test

Musimy wyłączyć testy integracyjne z tej fazy

Page 64: Środowisko testowe pod REST-a

INTEGRACYJNE TESTY NA EMBEDOWANYM TOMCACIE

Wtyczka Failsafe odpowiada za uruchomienie testów integracyjnych JUnit w fazie integration-test

Dodajemy testy integracyjne i aktywujemy plugin

Page 65: Środowisko testowe pod REST-a

INTEGRACYJNE TESTY NA EMBEDOWANYM TOMCACIE

Page 66: Środowisko testowe pod REST-a

WIELOMODUŁOWY PROJEKT NA EMBEDDED TOMCAT

Problem: Celem jest przetestowanie aplikacji zanim trafi do repozytorium

Page 67: Środowisko testowe pod REST-a

WIELOMODUŁOWY PROJEKT NA EMBEDDED TOMCAT

Rozwiązanie: -ustawienie zmiennych w parent pom.xml

Page 68: Środowisko testowe pod REST-a

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

Page 69: Środowisko testowe pod REST-a

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ą

Page 70: Środowisko testowe pod REST-a

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://

Page 71: Środowisko testowe pod REST-a

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.

Page 72: Środowisko testowe pod REST-a

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

Page 73: Środowisko testowe pod REST-a

EMBEDDED ELASTICSEARCH – TWORZENIE NODE’A

Page 74: Środowisko testowe pod REST-a

PRZYKŁADOWY MAPPING

Page 75: Środowisko testowe pod REST-a

EMBEDDED ELASTICSEARCH – DODAWANIE MAPPINGU, TWORZENIE INDEXU

Page 76: Środowisko testowe pod REST-a

EMBEDDED ELASTICSEARCH – DODAWANIE DOKUMENTÓW

Page 77: Środowisko testowe pod REST-a

INTEGRACYJNE TESTY W OPARCIU O EMBEDDED ELASTICSEARCH

Piszemy prosty mavenowy plugin dla embedded elasticsearch’a.

Page 78: Środowisko testowe pod REST-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

Page 79: Środowisko testowe pod REST-a

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

Page 80: Środowisko testowe pod REST-a

SONARQUBE - DASHBOARD

Page 81: Środowisko testowe pod REST-a

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

Page 82: Środowisko testowe pod REST-a

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/

Page 83: Środowisko testowe pod REST-a

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

Page 84: Środowisko testowe pod REST-a

KONFIGURACJA AGENTA JACOCO – JACOCO MAVEN PLUGIN

Dodajemy jacoco-maven-plugin do naszego projektu

Konfigurujemy plugin

Page 85: Środowisko testowe pod REST-a
Page 86: Środowisko testowe pod REST-a

KONFIGURACJA FAILSAFE-PLUGIN

Konfigurujemy failsafe plugin, gdyż to on jest odpowiedzialny za uruchomienie testów integracyjnych

Page 87: Środowisko testowe pod REST-a

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>

Page 88: Środowisko testowe pod REST-a

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

Page 89: Środowisko testowe pod REST-a

ANALIZA POKRYCIA KODU PRZEZ TESTY INTEGRACYJNE – SONAR I JACOCO

Page 90: Środowisko testowe pod REST-a

ANALIZA POKRYCIA KODU PRZEZ TESTY INTEGRACYJNE – SONAR I JACOCO

Wynik po uruchomieniu testów integracyjnych, a następnie analizy SonarQube’a

Page 91: Środowisko testowe pod REST-a

DZIĘKUJĘ ZA UWAGĘ!