2016-03-31 1 views
1

J'ai des tests JUnit qui s'exécutent en parallèle dans la phase test et qui sortent un fichier .json par test, et je souhaite appeler une méthode Java personnalisée pour effectuer une agrégation et un post-traitement sur ces fichiers après que tous les tests ont été exécutés terminé l'exécution.Quelle est la méthode recommandée pour exécuter du code à la fin de la phase de test dans Maven?

La phase integration-test est suivie de la phase post-integration-test du cycle de vie de Maven par défaut, mais la phase de test n'est pas suivie d'une phase post-test, et je préférerais ne pas abuser une autre phase à cet effet.

Question: Quelle est la méthode recommandée pour post-traiter les résultats à la fin de la phase test?

+1

Très pertinent http://stackoverflow.com/q/35550818/1743880 – Tunaki

+0

Quel type de post-traitement souhaitez-vous effectuer après les tests unitaires? Si oui, ils ne sont pas indépendants les uns des autres ... ce qui me semble faux ... – khmarbaise

+0

@khmarbaise Je veux fusionner le contenu des fichiers .json dans un seul fichier et générer un rapport à partir de ce fichier. J'ai déjà du code Java pour cela; c'est juste une question de trouver la façon la plus appropriée de l'invoquer. Basé sur la réponse de Tunaki dans la question liée, il semble que la solution recommandée est de créer un plugin Maven et le lier à la phase de test. – rob

Répondre

1

Comme décrit dans another SO post, il n'y a pas de phase post-test dans Maven pour de bonnes raisons (principalement, le test unitaire est un test unitaire).

Cependant, dans votre cas, vous n'avez pas besoin de créer un plugin Maven supplémentaire, ce qui résoudrait probablement le problème mais ajouterait également une couche supplémentaire de complexité en termes de maintenance, de test, de partage.

Puisque vous avez déjà le code requis dans une méthode Java - comme mentionné dans la question - il serait probablement plus logique d'utiliser le Exec Maven Plugin et son objectif java.

Vous pouvez donc simplement ajouter à votre POM:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.1.1</version> 
    <executions> 
     <execution> 
      <phase>test</phase> <!-- executed as post-test, that is, after Surefire default execution --> 
      <goals> 
       <goal>java</goal> 
      </goals> 
      <configuration> 
       <mainClass>com.sample.JsonFileAggregator</mainClass> <!-- your existing Java code, wrapped in a main --> 
       <arguments> 
        <argument>${project.build.directory}</argument> <!-- directory from where to load json files --> 
       </arguments> 
       <classpathScope>test</classpathScope> <!-- if your Java code is in test scope --> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

qui est, liant son exécution à la phase test, Maven exécuté après une liaison par défaut (donc après la valeur par défaut Maven exécution Surefire) et comme tel exécuté comme post-test. Votre code Java existant peut ensuite être appelé via une ligne Java spécialement construite (si elle n'existe pas déjà), lui transmettant potentiellement des arguments (comme le répertoire d'où charger les fichiers .json, dans le fragment ci-dessus dans le dossier target , via sa propriété standard ${project.build.directory}, à titre d'exemple). En outre, comme mentionné dans l'extrait, votre code Java peut être situé dans test portée (c'est-à-dire, sous src/test/java), donc pour le rendre visible, vous devrez également configurer le classpathScope en conséquence.