2. 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
3. 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
4. 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)
5. REST API
Styl architektury dla projektowania aplikacji
sieciowych
http://www.codeproject.com/Articles/426769/Creating-a-REST-service-using-ASP-NET-Web-API
6. 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
7. 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
9. REST API – JEDNOLITY INTERFEJS
METODY
GET - odczytywanie danych
POST - wstawianie/edycja danych
PUT – wstawianie/edycja danych
DELETE - usuwanie danych
15. REST API – METODY
CRUD ≠ HTTP?
CRUD HTTP
Create POST
Read GET
Update PUT
Delete DELETE
16. 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
17. 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
18. 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
19. POST VS. PUT
OPERACJA UPDATE
POST:
- w ciele możemy podać wszystkie pola lub tylko
niektóre z nich
- nie jest idempotentna, bezpieczna
20. POST VS. PUT
OPERACJA UPDATE
PUT:
- w ciele musimy podać wszystkie pola(wartości)
- jest idempotentna
21. PODSUMOWANIE
Zasób
POST
(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.
23. 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
24. 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
49. 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
50. 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
52. 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.
53. DODATKOWE CYKLE ŻYCIA
clean – czyści wynik działania wcześniejszych
buildów (folder target)
site – generuje dokumentację projektu
54. PLUGINY
Wywołanie celów zdefiniowanych w pluginach za
pomocą komendy mvn [plugin]:[goal]
mvn compile:compile
61. 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
62. INTEGRACYJNE TESTY NA EMBEDOWANYM
TOMCACIE
Cel jaki chcemy uzyskać to:
1. Uruchomić aplikację, którą chcemy testować na
wtyczce Apache Maven Tomcat 7
2. Uruchomić testy posiadające przyrostek
IntegrationTest
3. Po testach wyłączyć serwer
63. INTEGRACYJNE TESTY NA EMBEDOWANYM
TOMCACIE
Wtyczka Surefire odpowiada za uruchomienie
testów JUnit w fazie test
Musimy wyłączyć testy integracyjne z tej fazy
64. INTEGRACYJNE TESTY NA EMBEDOWANYM
TOMCACIE
Wtyczka Failsafe odpowiada za uruchomienie
testów integracyjnych JUnit w fazie integration-test
Dodajemy testy integracyjne i aktywujemy plugin
68. 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
69. 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ą
70. 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://
71. 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.
72. 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
77. INTEGRACYJNE TESTY W OPARCIU O
EMBEDDED ELASTICSEARCH
Piszemy prosty mavenowy plugin dla embedded
elasticsearch’a.
78. 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
79. 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
81. 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
82. 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/
83. 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
84. KONFIGURACJA AGENTA JACOCO – JACOCO
MAVEN PLUGIN
Dodajemy jacoco-maven-plugin do naszego
projektu
Konfigurujemy plugin
86. KONFIGURACJA FAILSAFE-PLUGIN
Konfigurujemy failsafe plugin, gdyż to on jest
odpowiedzialny za uruchomienie testów
integracyjnych
87. 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>
88. 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