Pytanie Najlepsze praktyki w testach integracyjnych z Maven?


Mam projekt, który buduję z Maven, który wykorzystuje Hibernate (i Spring) do pobierania danych z bazy danych itp.

Moje "testy" dla DAO w moim projekcie przedłużają Spring AbstractTransactionalDataSourceSpringContextTests tak, że DataSource może być podłączony do mojej klasy w ramach testu, aby móc faktycznie uruchomić logikę zapytania / Hibernate, aby pobrać dane, itp.

W kilku innych projektach użyłem tego typu testów wspólnie z bazą danych HSQL (w pamięci lub wskazano na plik), aby móc efektywnie przetestować rzeczywistą logikę zapytań do bazy danych bez polegania na zewnętrznej bazie danych. Działa to świetnie, ponieważ pozwala uniknąć zewnętrznych zależności i "stanu" bazy danych przed uruchomieniem testów (każdy z nich jest zawijany w transakcji, która jest wycofywana) jest dobrze zdefiniowany.

Ciekaw jestem jednak, jak najlepiej zorganizować te testy, które są naprawdę luźnym testem integracji z Mavenem. Czułoby się trochę brudno, aby te testy pozostały src/test/java, ale z tego co przeczytałem nie wydaje się być spójną strategią lub praktyką organizowania testów integracyjnych z Maven.

Z tego, co przeczytałem do tej pory, wydaje mi się, że mogę użyć Wtyczka Failsafe (lub drugie wystąpienie Surefire) i powiązać go z integration-test i mogę również powiązać niestandardową logikę uruchamiania i wyłączania (taką jak uruchamianie / zatrzymywanie instancji HSQL) pre-integration-test lub post-integration-test. Ale czy to naprawdę najlepsza metoda?

Moje pytanie brzmi w zasadzie: jaka jest ogólnie przyjęta najlepsza praktyka w organizowaniu tego z Mavenem? Mam problem ze znalezieniem jakiejkolwiek spójnej odpowiedzi w dokumentacji.

Chciałbym:

  • Oddzielne testy jednostkowe od testów integracyjnych, więc tylko testy jednostkowe są wykonywane podczas test faza
  • Możliwość powiązania niestandardowej logiki uruchamiania / wyłączania z pre-integration-test i post-integration-test
  • Niech raporty z testów integracyjnych zostaną połączone / przedstawione z raportami testów Surefire w jednostce

66
2017-08-04 17:00


pochodzenie


Przenieś testy integracji do oddzielnego projektu i przetestuj jednostki w tym samym projekcie co źródło. - Thorbjørn Ravn Andersen


Odpowiedzi:


Tak jest strona codehaus z pewnymi wytycznymi. Znalazłem bezpieczną wtyczkę trochę hackowania i sprawia, że ​​testowanie jednostkowe w Eclipse jest diabelnie skomplikowane. Zasadniczo robię to, co opisujesz.

Zdefiniuj testy integracji w src / itest / java W fazie testu przed integracją:

  • Wyczyść cel / klasy testowe
  • Użyj build-helper-maven-pluginCel dodawania źródła testowego, aby dodać lokalizację źródła itestu
  • Użyj niestandardowego narzędzia Mojo, aby usunąć src / test / java z konfiguracji, aby testy jednostek nie zostały ponownie skompilowane (nie podoba mi się to, ale jest potrzebne do utrzymania rozdziału testów jednostkowych i integracyjnych).
  • Użyj wtyczki kompilatora, aby skompilować testy integracji

Następnie w fazie testów integracyjnych użyj wtyczki murfire do uruchomienia testów.

Na koniec, połącz wszystkie cele porządkowe z fazą testów po integracji (chociaż normalnie nie są one potrzebne, ponieważ możesz użyć funkcji testowanego odrzucenia () do uporządkowania).

Nie znalazłem jeszcze sposobu na połączenie wyników testu, ponieważ minęła faza raportowania, ale ja mają tendencję do postrzegania testów integracyjnych jako dodatkowej premii, więc dopóki mijają raport, nie jest to tak ważne.

Aktualizacja: Myślę, że warto podkreślić, że możesz uruchomić Jetty z poziomu testów integracyjnych, zamiast używać celu pomostu. Daje to znacznie lepszą kontrolę nad testami. Możesz uzyskać więcej szczegółów od ta odpowiedź i odnośne blogi.


21
2017-08-04 18:44



Czy naprawdę musisz usunąć testy jednostkowe? Z pewnością nie jest to zły pomysł, aby uruchomić je ponownie w czasie testu integracyjnego. - Michael Rutherfurd
Ogólnie masz rację. Nie ma nic złego w prowadzeniu testów jednostkowych, ale mam już 100 projektów na serwerze i muszę przeprowadzić optymalizację, aby zarządzać obciążeniem dostępnego sprzętu. - Rich Seller
Wystarczająco uczciwe, masz dość istotny specjalny przypadek :-) - Michael Rutherfurd
Czy ta odpowiedź jest nadal ważna w 2016 roku? Wygląda na to, że plugin mvn failsafe jest lepszym rozwiązaniem. - zengr


Bardzo prostym sposobem na to jest użycie kategorii JUnit.

Następnie można łatwo przeprowadzić niektóre testy w fazie testowej i inne podczas fazy testów integracyjnych.

Zajmuje to minuty i wymaga tylko 3 kroków.

  1. Zdefiniuj interfejs znacznika
  2. Opisz klasy, które chcesz podzielić
  3. Skonfiguruj wtyczki Maven.

Podany jest tutaj pełny przykład. https://stackoverflow.com/a/10381662/1365383


25
2017-07-04 14:42



bardzo dobre rozwiązanie! - Uberto
Lub jeśli korzystasz z TestNG, możesz określić grupy testów: jednostkę i integrację na przykład. - Kemoda


Ten dobry wpis na blogu sugeruje trzy opcje;

1) Oddzielny moduł do testów integracyjnych

2) Różne katalogi źródłowe

3) Różne wzorce nazw plików

Jeszcze nie wypróbuję wszystkich trzech, więc nie mogę wyrazić opinii, która jest dla mnie korzystna.


7
2017-07-19 10:12



poprawne łącze to javamoods.blogspot.com/2009/12/... - Alex


Wolę drugą opcję, Różne katalogi źródłowe, ale uważam, że dość irytujące muszą kończyć się z IT testami integracyjnymi lub z wyłączeniem pakietów.

Aby tego uniknąć, skończyłem z tą konfiguracją:

<properties>
    <testSource>src/test/java</testSource>
    <testSourceResource>src/test/resources</testSourceResource>
</properties>
<build>
    <testSourceDirectory>${testSource}</testSourceDirectory>
    <testResources>
            <testResource>
            <directory>${testSourceResource}</directory>
            </testResource>
        </testResources>
.....
.....

a następnie nadpisuję obie zmienne w różnych profilach dla testu integracji i akceptacji:

<profiles>
  <profile>
   <id>acceptance-tests</id>
   <properties>
    <testSource>src/acceptance-test/java</testSource>
    <testSourceResource>src/acceptance-test/resources</testSourceResource>
   </properties>
  </profile>
 <profile>
   <id>integration-tests</id>
    <properties>
    <testSource>src/integration-test/java</testSource>
    <testSourceResource>src/integration-test/resources</testSourceResource>
    </properties>
  </profile>
.....
.....
.....

1
2017-09-06 10:15