Zapobiegaj testom jednostkowym, ale zezwalaj na testy integracji w Maven

157

Mam kompilację Maven, w której używam wtyczki SureFire do uruchamiania niektórych testów jednostkowych oraz wtyczki FailSafe do uruchamiania testów integracji. Chciałbym mieć sposób na uruchomienie tylko testów wtyczki FailSafe.

Nie jest dla mnie dobrym rozwiązaniem dodawanie różnych profili lub czegokolwiek w pomie, ponieważ jest to kompilacja wielomodułowa i nie chcę edytować pom każdego modułu.

Istnieją skip.testsi maven.test.skipi skipTestsktóre zatrzymują wszystkie testy i skipITs, które zatrzymują tylko bezpieczną wtyczkę.

Czy jest więc flaga wiersza poleceń podobna do Mavena skipITs, ale z funkcją „onlyITs”?

Matthew Gilliard
źródło
Próbowałeś maven.test.skipczy skipTests?
Thomas,
1
@khmarbaise w teorii, tak. Ale w większości projektów, w których pracowałem, „testy jednostkowe”, gdzie faktycznie testy integracji z bazą danych w pamięci (jeśli miałeś szczęście)
Sean Patrick Floyd
9
@khmarbaise Wiele testów jednostkowych. Bieganie zajmuje im kilka minut i nie potrzebujemy ich do biegania w takich okolicznościach. W szczególności uruchamiamy testy jednostkowe przed zbudowaniem artefaktu (oczywiście), ale chcemy uruchomić IT w wielu środowiskach. W tym momencie nie ma potrzeby ponownego uruchamiania testów jednostkowych.
Matthew Gilliard,
2
Cześć @khmarbaise, w mojej konfiguracji skipTestspomija tylko testy niezawodności, a nie test bezpieczeństwa! Może to nowa funkcja?
danidemi
2
FYI: skipTests jest teraz przestarzały we wtyczce Failsafe 3.0.0-M3 ( SUREFIRE-1611 )
Guillaume Husta

Odpowiedzi:

170

Odkryłem, że najprostszym sposobem na pominięcie tylko testów pewności jest skonfigurowanie pewnego ognia ( ale nie bezpiecznego ) w następujący sposób:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

Pozwala to na uruchomienie mvn verify -Dskip.surefire.testsi tylko pewne, nie zabezpieczone przed awarią, testy zostaną pominięte; przeprowadzi również wszystkie inne niezbędne fazy, w tym przed integracją i po integracji, a także uruchomi verifycel, który jest wymagany do rzeczywistego niepowodzenia kompilacji mavena, jeśli testy integracyjne zawiodą.

Zauważ, że ponownie definiuje to właściwość używaną do określenia, że ​​testy powinny być pomijane, więc jeśli podasz wartość kanoniczną -DskipTests=true, surefire zignoruje ją, ale failafe ją uszanuje, co może być nieoczekiwane, szczególnie jeśli masz już istniejące kompilacje / użytkowników określających tę flagę. Wydaje się, że prostym obejściem jest domyślna skip.surefire.testswartość skipTestsw Twojej <properties>sekcji pom:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

Jeśli potrzebujesz, możesz podać parametr analityczny o nazwie „failafe” skip.failsafe.tests, jednak nie uznałem tego za konieczne - ponieważ testy jednostkowe zwykle są uruchamiane we wcześniejszej fazie, a jeśli chcę uruchomić testy jednostkowe, ale nie testy integracji, uruchomiłbym testfazy zamiast verifyetapu. Twoje doświadczenia mogą się różnić!

Te skip.(surefire|failsafe).testswłaściwości powinny być prawdopodobnie zintegrowane z samym kodem typu surefire / fail safe, ale nie jestem pewien, w jakim stopniu naruszyłoby to zasadę „to dokładnie ta sama wtyczka, z wyjątkiem jednej drobnej różnicy”.

Bacar
źródło
4
Korzystając z tego rozwiązania, mogłem skonfigurować mój framework, tak aby -DskipUnitTests pomijał wtyczkę surefire, -DskipIntegrationTests pomijał wtyczkę odporną na awarie, a DskipTests pomija oba. Dokładnie to, czego potrzebowaliśmy!
Alex Jansen,
2
moje IDE narzeka na „nie można rozwiązać symbolu 'skipTests'” rozwiązaniem było dodanie linii <skipTests>false</skipTests>nadal działa z dowolną kombinacją -DskipTests lub -Dskip.surefire.tests, ponieważ argumenty wiersza poleceń wydają się nadpisywać właściwości stackoverflow.com/questions/13708738 /… Możesz dodać to do swojego rozwiązania
globalworming,
<skipTests>${skip.surefire.tests}</skipTests>nie działa z maven-surefire-pluginwersją 3.0.0-M3. Wszystkie testy sprawdzające się nadal trwają. Ktoś jeszcze to znalazł? Poniższe rozwiązanie Seana Patricka Floyda działa jednak.
John Meyer,
120

Obejściem byłoby zadzwonić:

mvn clean test-compile failsafe:integration-test

Wprawdzie jest to brzydkie, ale może rozwiązać Twój problem.


Lub (kolejny hack):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

Odniesienie:

Sean Patrick Floyd
źródło
1
Druga sugestia zadziałała dla mnie. Test przed integracją został pomyślnie wywołany
Lawrence Tierney
7
Czy to dobry pomysł? Czy to nie spowoduje, że Twoja kompilacja zakończy się powodzeniem, nawet jeśli testy integracji zakończą się niepowodzeniem? To cała istota zabezpieczenia przed awariami, jeśli nie uruchomisz również celu „weryfikacji” . Cytat: „Wtyczka Failsafe nie zawiedzie kompilacji podczas fazy testów integracji”. Musisz uruchomić cel weryfikacji, aby faktycznie powiedzieć, czy testy integracji się powiodły, czy nie!
Bacar
2
@bacar ma rację, ale po prostu użyj verifyzamiast integration-testw drugim rozwiązaniu.
Matthew Gilliard
1
Powinieneś zobaczyć odpowiedź @bacar, aby uzyskać znacznie lepsze rozwiązanie.
FBB
12
Jeśli dodasz failsafe:verifyna końcu pierwszego hack ( mvn clean test-compile failsafe:integration-test failsafe:verify), kompilacja zakończy się niepowodzeniem, jeśli jeden z testów integracji zakończy się niepowodzeniem.
Shadow Man
73

Używam kodu z bloga Antonio Goncalvesa , który działa idealnie.

Możesz użyć następujących właściwości:

-DskipUTs=true za pomijanie testów niezawodności.

-DskipITs=true do pomijania testów bezpieczeństwa.

-DskipTests=true za pominięcie wszystkich testów.

Jest pom.xmlto następujące:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>
Martijn Burger
źródło
2
dzięki, świetne podejście! przydatne jest również nadpisanie domyślnego wykonania surefire (default-test) patrz: stackoverflow.com/questions/11935181/ ...
pls
1
jest to powód, dla którego czasami trzeba przewinąć w dół i poszukać dobrego działającego rozwiązania ze wszystkimi wymaganymi informacjami. Dzięki za udostępnienie
Atul Chaudhary
Naprawdę fajne rozwiązanie. Jednak bezpieczna konfiguracja jest nadmiarowa, tak jak skipITsjest to ustawienie domyślne.
timomeinen
SkipITs to opcja niestandardowa w tej konfiguracji. Masz rację w domyślnej implementacji, ale to nie była kwestia PO.
Martijn Burger
Uznanie, jesteś maven guru! To powinno być w superpomie maven.
Adam
22

Mam nadzieję że to pomoże!

Spróbuj uruchomić test tylko z FailSafe (wtyczka do testu integracji - pozwoli ci to uruchomić tylko testy integracji z tego rodzaju nazwami, domyślnie: * / IT .java, ** / IT.java, * /*ITCase.java ;, ale możesz to łatwo zmienić z pliku pom)

mvn failsafe:integration-test

A kiedy chcesz używać tylko SureFire (wtyczki do testów jednostkowych)

mvn surefire:test

lub jeden test na raz z:

mvn -Dtest=MyUnitlTest
Kati Holasz
źródło
9

Podoba mi się to, więc wszystkie fazy są normalnie wykonywane:

 mvn -Dtest=foo -DfailIfNoTests=false verify
Jérôme Herry
źródło
1
To najłatwiejsze (i szczerze mówiąc najbardziej genialne) rozwiązanie!
Titulum
nie wymaga dodawania czegokolwiek w pomie, o co prosił OP i wykonuje wszystkie fazy zgodnie z opisem. świetna odpowiedź.
jnichols959
1

Aby rozwinąć komentarze @danidemi i @GuillaumeHusta:

FYI: skipTests jest teraz przestarzały we wtyczce Failsafe 3.0.0-M3 ( SUREFIRE-1611 )

Aby pominąć testy jednostkowe, ale nie testy integracji, możesz to zrobić, jeśli używasz najnowszej wersji wtyczki Failsafe:

mvn verify -DskipTests

(jeśli to ci pomoże, poproś o uwagi, o których mowa)

meustrus
źródło
-3

Spróbuj uruchomić testy integracyjne lub jednostkowe w oddzielnym profilu. Następnie możesz po prostu włączyć / wyłączyć profil.

Steven
źródło
Może dodać pomp nadrzędny, w którym definiujesz profil, który działa tylko IT? wszystkie moduły podrzędne projektu mogą dziedziczyć z tego pom, więc nie trzeba zmieniać każdego pom ani uruchamiać modułów za pomocą specjalnych przełączników (ponieważ można aktywować profil w przypadku braku właściwości).
yoosiba,