Y a-t-il un moyen de "fail fast" pour junit avec le plugin maven surefire?

je travaille actuellement sur un projet java en utilisant maven. Nous utilisons le plugin maven surefire pour exécuter notre Suite junit dans le cadre du processus de construction.

notre suite de tests est en pleine croissance, tant en termes de couverture que de temps d'exécution. Le temps d'exécution est très frustrant et prend beaucoup de temps quand vous finissez par attendre dix minutes pour découvrir qu'un test a échoué dans la première minute de test.

je voudrais trouver un moyen de faire échouer le processus de construction lors de la première erreur/défaillance dans la suite de tests. Je sais que c'est possible pour d'autres outils de construction, mais j'ai été incapable de trouver un moyen de le faire avec maven infaillible.

je sais qu'il y a résoudre un billet pour cette fonctionnalité dans la surefire jira, mais j'espère qu'il existe une solution pour ce.

30
demandé sur Eliza Brock Marcum 2009-12-17 22:00:20

7 réponses

en date du 6 septembre 2015 il apparaît qu'il y a , -Dsurefire.skipAfterFailureCount=1 .

en date du 19 octobre 2015 la version 2.19 est sortie .

27
répondu Captain Man 2017-09-24 12:20:47

autant que je sache, Non , et cela nécessite vraiment la résolution de SUREFIRE-580 . Si vous voulez que cela se produise plus rapidement, vous devriez au moins voter pour la question et, optionnellement, soumettre un patch;)

13
répondu Pascal Thivent 2015-07-24 12:52:01

il peut y avoir une solution de contournement , mais cela dépend de vos besoins et vous devez utiliser un serveur CI qui peut gérer les codes de retour de processus jvm.

l'idée de base est d'arrêter complètement le processus JVM de Maven et de faire savoir à L'OS que le processus s'est arrêté de manière inattendue. Ensuite, un serveur d'intégration continue comme Jenkins / Hudson devrait être en mesure de vérifier un code de sortie non-zéro et vous faire savoir qu'un test a échoué.

la première étape est de faire sortir surefire le JVM à la première défaillance d'essai. Vous pouvez faire cela avec JUnit 4.7 ou plus en utilisant un personnalisé RunListener (mettez-le dans src/test / java):

package org.example
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
public class FailFastListener extends RunListener {
        public void testFailure(Failure failure) throws Exception {
                System.err.println("FAILURE: " + failure);
                System.exit(-1);
        }
}

ensuite, vous devez configurer cette classe pour que surefire l'enregistre avec le JUnit 4 Runner. Modifiez votre pom.xml et ajoutez la propriété de configuration listener au plugin maven-surefire. Vous aurez également besoin de configurer infaillible pour ne pas la fourche d'un nouveau processus de JVM pour l'exécution de tests. Sinon, ça ne fera que continuer avec les prochains cas de test.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.10</version>
    <configuration>
        <forkMode>never</forkMode>
        <properties>
            <property>
                <name>listener</name>
                <value>org.example.FailFastListener</value>
            </property>
        </properties>
    </configuration>
</plugin>

si cela n'aide pas, j'essaierais de bifurquer le plugin Maven surefire junit provider.

Btw, tests unitaires, par définition, doit courir plus vite que de 0,1 secondes. Si votre construction prend tellement de temps en raison des tests de l'unité, vous devrez les faire fonctionner plus rapidement à l'avenir.

10
répondu mhaller 2011-10-18 07:07:49

quelques façons d'accélérer si ce n'est pas exactement ce dont vous avez besoin:

  • s'il s'agit d'une construction à modules multiples, Ajouter -fail-fast de la ligne de commande à l'abandon après le premier module.

  • regarder failsafe pour se déplacer longtemps l'exécution des tests d'intégration sur un phase différente du cycle de vie.

  • Rechercher une solution basée sur le profil pour des tests rapides et lents - Est-il un moyen de dire infaillible pour sauter des tests dans un paquet? .

1
répondu Benjamin Wootton 2017-05-23 12:16:55

ce n'est pas une réponse directe à la question, mais cela peut aussi être utile pour alimenter la sortie de maven à travers grep, pour enlever la plupart des trucs et vous aider à voir où sont les échecs de test.

comme ceci:

mvn test | grep -w 'Running\|Tests'

qui produit la sortie (pour mon code) comme ceci:

Running scot.mygov.pp.test.dashboard.DashboardJsonSerDesCRUDTest
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec
Running scot.mygov.pp.test.dashboard.DashboardBaselineCRUDTest
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 sec
Running scot.mygov.pp.test.dashboard.DashboardDatabaseValidationTest
Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.264 sec
Running scot.mygov.pp.test.dashboard.DashboardServiceWebServiceIsolationCRUDTest
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec

Beaucoup plus facile de voir où la première erreur de l'échec.

1
répondu user2800708 2015-11-16 15:57:43

vous pouvez lancer maven avec --fail-fast option:

l'option -ff est très utile pour les développeurs construit qui veulent avoir un feedback rapide pendant le cycle de développement.

un exemple peut être:

mvn clean test -ff

http://books.sonatype.com/mvnref-book/reference/running-sect-options.html

1
répondu Mike D3ViD Tyson 2017-10-11 10:55:11

cela ne résout pas la question exactement, mais la solution que mon lieu de travail finalement venu avec était d'utiliser le trèfle D'Atlassian pour exécuter des constructions spécialisées de juste des tests relatifs au code changé.

nous avons une construction trèfle qui exécute les tests pour le code modifié et à son tour démarre la construction de test complète.

Cette solution s'est révélée satisfaisante.

0
répondu Eliza Brock Marcum 2014-12-15 14:25:05