Nous avons défini des centaines de tests pour notre cycle de vie d'intégration-tests dans maven, et leur exécution prend beaucoup de temps.
Ce que je veux faire, c'est exécuter un seul test dans le integration-test
. J'ai essayé de faire:
mvn -Dtest=<my-test> integration-test
mais ça ne marche pas. Le -Dtest
exécute uniquement les tests de l'objectif de test unitaire, pas la phase de test d'intégration. J'ai essayé le -Dintegration-test=<my-test>
à la place, et cela a été ignoré.
Y-a-t-il un moyen de faire ça ?
Ma configuration est:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>surefire-it</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<excludes>
<exclude>none</exclude>
</excludes>
<includes>
<include>**/api/**</include>
</includes>
.....
Si vous utilisez le plugin Maven Failafe , vous pouvez exécuter un seul test d'intégration en définissant la propriété it.test
sur votre nom de classe de test complet:
mvn -Dit.test=your.TestCase verify
Voir les docs du plug-in de sécurité pour plus d'informations .
La Documentation Failsafe voudriez-vous spécifier le test de la manière suivante:
mvn -Dit.test=BrokenIT verify
Cependant, -Dit.test ne semble plus fonctionner. Au contraire, le même paramètre utilisé pour spécifier un test Surefire fonctionnera apparemment également pour Failsafe. Par exemple:
mvn -Dtest=WorksIT verify
J'ai classé un bug ( EDIT: qui était fermé en tant que "Cannot Reproduce" dans 2.12) pour corriger la documentation.
J'ai eu du mal à résoudre ce problème et j'ai créé un profil supplémentaire à utiliser lorsque je souhaitais exécuter un seul test d'intégration. J'espère que j'ai réussi à extraire juste la bonne partie ici:
<profile>
<id>integrationTestSingle</id>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>surefire-it</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/integration/**/${test}.Java</include>
</includes>
<skipTests>false</skipTests>
</configuration>
</execution>
</executions>
<configuration>
<argLine>-Xms256M -Xmx768M -XX:MaxPermSize=256M</argLine>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>default-test</id>
<configuration>
<skipTests>true</skipTests>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
Maintenant, j'appelle maven avec le profil integrationTestSingle et avec -DfailIfNoTests=false -Dtest=NameOfTest
. Il n'exécute aucun des tests habituels pendant la phase de test habituelle et exécute uniquement le test NameOfTest
pendant la phase de test d'intégration.
Je ne suis pas sûr de JUnit, mais pour TestNG, la stratégie consisterait à définir un fichier XML de suite avec un seul test, puis, dans votre POM, configurez le plugin surefire pour l'exécuter uniquement. Dans votre POM, vous auriez quelque chose comme ceci (disclaimer, ceci n'est pas testé):
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<phase>integration-test</phase>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>single-test.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Pour configurer le fichier de la suite, voir http://testng.org/doc/documentation-main.html
il suffit d'ajouter que -DfailIfNoTests=false
fonctionne pour moi avec testNG. Quelque chose comme ça:
mvn integration-test -Dtest=aITest -DfailIfNoTests=false
Je suis juste tombé dessus moi-même. Quelque chose comme ça a bien fonctionné pour moi:
mvn -Pintegration-test -Dtest=<my-test>
L'astuce consistait à s'assurer que le groupe test était mentionné avant la partie -Dtest.