Korzystając z Maven’a do zarządzania projektem najczęściej do uruchamiania testów korzystamy z komendy mvn test
. Czy ta komenda na pewno uruchomi je wszystkie i czy możemy je uruchamiać jakoś inaczej?
Stan zastany
Testy możemy podzielić na 3 główne grupy testowe tj. E2E, Integracyjne oraz Jednostkowe. Jednak nas jako programistów interesuje również czy uruchamiając dany test uruchamiamy cały kontekst używanego przez nas frameworka (np. Spring Boota) czy nie, co się bezpośrednio przekłada na czas trwania testów.
Najczęściej przeze mnie spotykanym stanem na istniejącym projekcie jest taki gdzie wszystkie klasy testowe mają w nazwie słowo Test np. SomeClassTest.java itp. A testy są uruchamiane poprzez komendę mvn test
.
Testy jednostkowe
Komenda „mvn test” uruchamia fazę test
cyklu życia projektu za którą odpowiada plugin Surefire
. W tej fazie są uruchamiane wszystkie testy jednostkowe. Maven nie rozróżnia testów jednostkowych na podstawie tego czy jest uruchamiany kontekst frameworka czy nie podczas testów.
Maven rozróżnia klasy testowe po ich nazwach:
- jednostkowe – posiadają w swojej nazwie słowo „Test”
- integracyjne – posiadają w swojej nazwie znaki „IT”
Więc jeżeli nazwiemy swoją klasę np. MyClassIntegrationTest.java
to zostanie ona zakwalifikowany przez Maven’a do testów jednostkowych pomimo, że może być to test integracyjny uruchamianym wraz z kontekstem frameworka.
Czasami się zdarza, że tego chcemy np. w sytuacji kiedy chcemy przetestować kluczowe dla naszego modułu operacje na prawdziwej bazie danych a nie na bazie inMemory.
Ta faza projektu nie uruchamia testów integracyjnych.
Testy integracyjne
Ale jak w takim razie uruchomić testy integracyjne? Ręczne wywoływanie testów integracyjnych nie wydaje się zbyt rozsądnym rozwiązaniem.
Aby uruchomić testy integracyjne musimy skonfigurować Failsafe plugin
który służy do uruchamiania między innymi testów integracyjnych. Aby włączyć plugin do projektu musimy minimalnie skonfigurawać nasz plik pom.xml.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
Powyższy kod dodaje plugin failsafe do faz: integration-test oraz verify. Jest to minimalna konfiguracja i należy dodać plugin do obu faz cyklu życia. Oczy wiście można pominąć dodanie go do jednego ale wtedy:
- Można zrezygnować z
integration-test
, ale to oznacza, że testy integracyjne nie zostaną uruchomione. W takim przypadkufailsafe
nie będzie miał żadnych testów do zweryfikowania w fazieverify
, więc ten etap stanie się zbędny. - Można zrezygnować z
verify
, ale nie jest to zalecane, ponieważ po uruchomieniu testów integracyjnych w fazieintegration-test
, wyniki tych testów powinny być zweryfikowane. Jeśli nie ma fazyverify
, błędy w testach integracyjnych mogą być przeoczone.
Możemy dostosować do naszych potrzeb pliki jakie będę uruchamiane podczas wykonywania fazy testów integracyjnych.
<configuration>
<includes>
<include>**/*IT.java</include>
<include>**/*E2E.java</include>
</includes>
</configuration>
Dodając powyższy kod w konfiguracji pom.xml doprecyzowujemy z jakimi przyrostkami będą brane pliki pod uwagę przez maven-failsafe-plugin. Powyższy kod będzie uruchamiał testy integracyjne oraz End to End.
Aby uruchomić wszystkie testy integracyjne należy skorzystać z komendy:
mvn failsafe:integration-test
Pełen kod konfiguracji mavana jest następujący:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
<configuration>
<includes>
<include>**/*IT.java</include>
<include>**/*E2E.java</include>
</includes>
</configuration>
</executions>
</plugin>
Maven verify
Często chcemy uruchomić wszystkie testy na raz np. przed wykonaniem merge’a. Do tego najlepiej nadaje się faza verify. Uruchamiając poniższą komendę uruchomiamy wszystkie testy jakie mamy w programie zarówno jednostkowe jak i integracyjne (jeżeli skonfigurowaliśmy pom.xml).
mvn verify
Mamy już skonfigurowanego pom’a oraz wiem jak wywoływać testy jednostkowe i integracyjne w poszczególnych konfiguracjach. Ale możemy zadać sobie jeszcze jedno pytanie: „Jak w takim razie uruchomić tylko testy integracyjne lub tylko end to end, skoro mvn failsafe:integration-test uruchamia wszystkie zdefiniowne w pom’ie?”. Aby uruchomić tylko jeden rodzaj testów (np. E2E) skorzystamy z parametru -Dit.test-*E2E.java. Możemy poszczególne testy wywołać albo z posiomu integration-test albo verigy w zależności czego oczekujemy.
mvn failsafe:integration-test -Dit.test=*E2E.java
: Gdy chcesz szybko uruchomić tylko testy E2E bez potrzeby pełnej weryfikacji i raportowania.
mvn verify -Dit.test=*E2E.java
: Gdy chcesz pełny cykl weryfikacyjny, obejmujący uruchomienie testów E2E oraz pełną weryfikację wyników testów i ich raportowanie.
Podsumowanie
Spojrzeliśmy na testy z punktu widzenia Maven. Dowiedzieliśmy się jak uruchamiać poszczególne rodzaje testów, oraz jak konfigurować pom.xml i nazywać testy aby były uruchamiane w tych fazach projektu w których my chcemy aby były uruchamiane.
Uruchamianie testów:
- Jednostkowych
mvn test
- Integracyjnych
mvn failsafe:integration-test
- Wszystkich
mvn verify
- Wybranej grupy testów
mvn failsafe:integration-test -Dit.test=*E2E.java
mvn verify -Dit.test=*E2E.java
