2010-08-30 14 views
8

en utilisant Maven surefire, je ne peux pas exécuter l'exécution du test en parallèle. C'est-à-dire que chacun de mes cas de test doit être exécuté dans une JVM serapate, d'où le forking. En outre, je souhaite que mes cas de test s'exécutent en parallèle. la première partie fonctionne sans problème: je suis capable d'exécuter chaque cas de test dans sa propre JVM. la deuxième partie, cependant est toujours un challene pour moi. Je n'ai pas réussi à faire fonctionner l'analyse paralle des cas de test. Voici comment regarder ma déclaration de plugin comme:Maven Surefire: Impossible de lancer l'exécution du test parallèle

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
      <parallel>methods</parallel> 
      <forkMode>always</forkMode> 
       <argLine>-Xms512m -Xmx512m</argLine> 
     </configuration> 
</plugin> 

J'ai essayé les deux méthodes et des classes, mais ont voit pas de parallélisation. Ma version JUnit est 4.7 comme le montre la déclaration de depency:

<dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.7</version> 
     <scope>compile</scope> 
    </dependency>    

Toute aide serait beaucoup appricated.

Grégoire.

Répondre

7

Je pense que vous êtes censé utiliser le paramètre threadCount lors de l'utilisation du mode parallel:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <forkMode>always</forkMode> 
     <argLine>-Xms512m -Xmx512m</argLine> 
     <parallel>methods</parallel> 
     <threadCount>4</threadCount> 
    </configuration> 
    </plugin> 
2

Assurez-vous que vous obtenez un message de journal quelque chose comme ça

[INFO] Concurrency config is {perCoreThreadCount=false, threadCount=1, parallel=classes, configurableParallelComputerPresent=true} 

Juste avant cette rubrique:

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 

Ce message indique que le fournisseur parallèle de surefire junit est actif.

Si ce n'est pas le cas surefire peut être ramasser une version différente de junit que vous ne le pensez. Tout ce qui est inférieur à 4,7 ne fonctionnera pas. Exécutez mvn dependency: tree pour vérifier quelle (s) version (s) sont présentes.

Vous devriez également passer à surefire 2.6 car un certain nombre de bogues mineurs liés à l'exécution en parallèle ont été corrigés. Pour la même raison, vous devriez utiliser le dernier junit.

+0

Ne voulez-vous pas que perCoreThreadCount soit vrai? Sinon, ayant threadCount 1, signifie que vous exécutez en parallèle avec un seul thread, c'est-à-dire en série? – Nicolai

+0

Non, vous voulez que les threads soient distribués sur chaque core disponible, pas sur tous les threads d'un core. Malheureusement, ils définissent la valeur par défaut à perCoreThreadCount = true, en exécutant tous les threads sur un core. – rwst

0

Etes-vous sûr que cela ne fonctionne pas? Vous ne pouvez pas gagner beaucoup d'accélération si vos tests ne contiennent pas beaucoup de méthodes de test. Avec forkMode = toujours le mieux que vous pouvez faire est d'exécuter toutes les méthodes de test dans une classe, en parallèle.

1

Essayez de changer votre forkMode de toujours à "jamais". Il ne l'indique pas dans sa documentation, mais vous ne pouvez pas avoir fork plus parallèlement à ce moment (nous l'avons trouvé après avoir creusé le code infaillible.)

Juste pour que vous sachiez, vous allez probablement rencontrer des tests qui ne sont pas thread sécurisé en raison de nombreuses bibliothèques de test/de soutien (easymock, powermock, etc) invalidant la possibilité de mettre en parallèle vos tests.

4

J'ai eu le même problème, parce que j'utilise la version 2.7 surefire, après la mise à niveau à 2,12, il a travaillé avec la configuration suivante:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.12</version> 
    <configuration> 
    <parallel>classes</parallel> 
    <forkMode>perthread</forkMode> 
    <threadCount>4</threadCount> 
    </configuration> 
</plugin> 

Il a engendré 4 fils, chacun exécutant son propre jvm.

+1

Cette solution a un bug qui a été résolu dans maven-surefire-plugin 2.13. Consultez ce fil pour plus d'informations: http://stackoverflow.com/questions/11098073/maven-surefire-failsafe-forkmode-perthread-is-not-working-a-workaround – ggarciao

0

Le surefire 2.16 a fixé l'exécution parallèle concernant les tests de JUnit.