Exécutez une seule méthode de test avec maven

519

Je sais que vous pouvez exécuter tous les tests dans une certaine classe en utilisant:

mvn test -Dtest=classname

Mais je veux exécuter une méthode individuelle et -Dtest = classname.methodname ne semble pas fonctionner.

BillMan
la source
3
J'aimerais également savoir comment faire cela. Cependant, si je me suis retrouvé à le faire assez souvent, je pense que le test pourrait être un candidat à répartir dans sa propre classe, vous pouvez donc utiliser la mvn test -Dtest=classnamesyntaxe.
John Paulett
Voulez-vous savoir comment le faire via la ligne de commande uniquement ?? Ou utiliser un IDE (éclipse) fonctionnerait-il pour vous?
Diego Dias
1
Je regardais une ligne de commande. Je pense que le plugin éclipse junit vous permettra de le faire.
BillMan
Je l'ai fait pour Maven 1. Comme je l'ai rappelé, cela impliquait d'apporter des modifications à JUnit, qui est responsable de l'introspection de la classe de test.
kdgregory

Réponses:

698

Pour exécuter une seule méthode de test dans Maven, vous devez fournir la commande sous la forme:

mvn test -Dtest=TestCircle#xyz test

TestCircleest le nom de la classe de test etxyz est la méthode de test.

Les caractères génériques fonctionnent également; à la fois dans le nom de la méthode et le nom de la classe.

Si vous testez dans un projet multi-module, spécifiez le module avec lequel le test est effectué -pl <module-name>.

Pour les tests d'intégration, utilisez l' it.test=...option au lieu de test=...:

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test
Mudit Srivastava
la source
4
Correction de l'erreur "Aucun test n'a été exécuté" en rétrogradant à surefire 2.9
qwerty
15
J'ai corrigé "Aucun test n'a été exécuté!" en passant à 2.14:
alfonx
54
Si vous testez dans un projet multi-modules, vous devez également spécifier le module avec lequel le test est effectué -pl <module-name>.
Jon
22
Permet -DfailIfNoTests=falsede sauter des projets sans test. No Tests Were Executedse produit lorsque vous essayez d'exécuter le test à partir du projet racine et qu'il y a des modules sans tests du tout.
Cherry
4
Cette commande fonctionne !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Notez que "-DTest" commence par UPPER CASE 'T'.
vikas
25

Il y a un problème avec surefire 2.12. C'est ce qui m'arrive en changeant le plugin maven-surefire de 2.12 à 2.11:

  1. mvn test -Dtest=DesignRulesTest

    Résultat:
    [ERREUR] Impossible d'exécuter l'objectif org.apache.maven.plugins: maven-surefire-plugin: 2.12 : test (test par défaut) sur le projet pmd: aucun test n'a été exécuté!

  2. mvn test -Dtest=DesignRulesTest

    Résultat: [INFO] --- maven-surefire-plugin: 2.11 : test (default-test) @ pmd --- ... Running net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest Tests run: 5 , Échecs: 0, Erreurs: 0, Ignoré: 4, Temps écoulé: 4,009 s

Duccio Fabbri
la source
5
Fonctionne à nouveau dans 2.12.1 ou version ultérieure.
yurez
Correction de "Aucun test n'a été exécuté!" en passant à 2.14
alfonx
Si vous utilisez @Category(IntegrationTest.class), utilisez -Dit.test=ClassName, sinon vous obtiendrez No tests were executed!même avec les dernières versions du plugin.
uvsmtid
16

Ce que je fais avec mon TestNG, (désolé, JUnit ne le supporte pas), c'est que je peux assigner un groupe au test que je veux exécuter

@Test(groups="broken")

Et puis exécutez simplement 'mvn -Dgroups = broken'.

tunaranch
la source
1
C'est une bonne réponse. Dans mon cas, le test a essayé de s'exécuter mais certains composants Seam n'étaient pas configurés correctement, il semble donc que cela saute également une partie du code de configuration.
Chris Williams
1
Correct. Vous devez soit mettre groups = rodé dans votre @BeforeMethod, soit faire @BeforeMethod (alwaysRun = true)
tunaranch
Veuillez me faire savoir quel est le groupe ici, car je reçois un problème de compilation.
Paramesh Korrakuti
14

Exécution d'un ensemble de méthodes dans une seule classe de test Avec la version 2.7.3, vous ne pouvez exécuter que n tests dans une seule classe de test.

REMARQUE: il est pris en charge pour junit 4.x et TestNG.

Vous devez utiliser la syntaxe suivante

mvn -Dtest=TestCircle#mytest test

Vous pouvez également utiliser des modèles

mvn -Dtest=TestCircle#test* test

À partir de surefire 2.12.1, vous pouvez sélectionner plusieurs méthodes (JUnit4X uniquement pour le moment, correctifs bienvenus)

mvn -Dtest=TestCircle#testOne+testTwo test

Vérifiez ce lien sur les tests simples

Prasanth Kumar Diddi
la source
2
Dans mon cas, j'ai dû doubler le nom du test TestClass # comme mvn -Dtest = "TestCircle # myTest" test
Pratik Khadloya
@PratikKhadloya Avez-vous une idée du fonctionnement des tests dépendants? Disons que j'ai les méthodes test1 (), test2 (), test3 () dans TestClass et test2 dépend de test1. Comment puis-je exécuter simplement test2 ()?
Ziska
3
Je pense que si vous avez des dépendances entre vos tests, vous faites quelque chose de mal. Chaque test doit être indépendant des autres tests. Vous devez retirer le couplage entre eux.
Pratik Khadloya du
11

Vous pouvez exécuter des classes et des méthodes de test spécifiques en utilisant la syntaxe suivante:

  1. package complet: mvn test -Dtest = "com.oracle.tests. **"

  2. toutes les méthodes dans une classe: test mvn -Dtest = CLASS_NAME1

  3. méthode unique à partir d'une seule classe: test mvn -Dtest = CLASS_NAME1 # METHOD_NAME1

  4. méthode multiple de classe multiple: test mvn -Dtest = CLASS_NAME1 # METHOD_NAME1, CLASS_NAME2 # METHOD_NAME2

Nazmul Hoque Shafin
la source
9

Cette commande fonctionne !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testNotez que "-DTest" commence par UPPER CASE 'T'.

vikas
la source
4
Ne fonctionne pas avec SureFire 2.18.x; il exécute simplement tous les tests.
Janaka Bandara
4

Le paramètre de test mentionné par tobrien vous permet de spécifier une méthode en utilisant un # avant le nom de la méthode. Cela devrait fonctionner pour JUnit et TestNG. Je ne l'ai jamais essayé, il suffit de le lire sur la page du plugin Surefire :

Spécifiez ce paramètre pour exécuter des tests individuels par nom de fichier, en remplaçant les paramètres d'inclusion / exclusion. Chaque modèle que vous spécifiez ici sera utilisé pour créer un modèle d'inclusion formaté comme ** / $ {test} .java, vous pouvez donc simplement taper "-Dtest = MyTest" pour exécuter un seul test appelé "foo / MyTest.java". Ce paramètre remplace les paramètres include / excludes et le paramètre TestNG suiteXmlFiles. depuis 2.7.3 Vous pouvez exécuter un nombre limité de méthodes dans le test en ajoutant #myMethod ou # my * ethod. Si type "-Dtest = MyTest # myMethod" pris en charge pour junit 4.x et testNg

Wesley Hartford
la source
3

Les nouvelles versions de JUnit contiennent le coureur Catégories: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

Mais la procédure de libération de JUnit n'est pas basée sur Maven, les utilisateurs de Maven doivent donc la mettre manuellement dans leurs référentiels.

Andriy Plokhotnyuk
la source
1
Agréable. Mais je ne vois pas comment cela répond à la question.
Pascal Thivent
2
Subj est pris en charge à partir de la version 2.7.3 de maven-surefire-plugin: maven.apache.org/plugins/maven-surefire-plugin/examples/…
Andriy Plokhotnyuk
3

À partir de la version 2.22.1 du plugin surefire (peut-être plus tôt), vous pouvez exécuter un test unique en utilisant la propriété testnames lorsque vous utilisez testng.xml

Étant donné un testng.xml suivant

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="all-tests">
        <classes>
            <class name="server.Atest"/>
            <class name="server.Btest"/>
            <class name="server.Ctest"/>
        </classes>
    </test>
    <test name="run-A-test">
        <classes>
            <class name="server.Atest"/>
        </classes>
    </test>
    <test name="run-B-test">
        <classes>
            <class name="server.Btest"/>
        </classes>
    </test>
    <test name="run-C-test">
        <classes>
            <class name="server.Ctest"/>
        </classes>
    </test>
</suite> 

avec le pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    [...]
    <properties>
        <selectedTests>all-tests</selectedTests>
    </properties>
    [...]
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
            <configuration>
                <suiteXmlFiles>
                    <file>src/test/resources/testng.xml</file>
                </suiteXmlFiles>
                <properties>
                    <property>
                        <name>testnames</name>
                        <value>${selectedTests}</value>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
    [...]
</project>

Depuis la ligne de commande

mvn clean test -DselectedTests=run-B-test

Lectures complémentaires - Maven surefire plugin using testng

bsk
la source
-5

Vous pouvez exécuter une seule classe de test, mais pas une seule méthode dans une classe de test. Vous utilisez le nom simple de la classe et non le nom complet de la classe. Donc, si vous avez un test dans "org.sonatype.test.MyTest" et que c'est le seul test que vous souhaitez exécuter, votre ligne de commande ressemblera à ceci:

mvn test -Dtest=MyTest
Tim O'Brien
la source
J'ai testé la solution décrite sur les commentaires précédents dans un projet de module unique, donc ce que dit ce commentaire n'est pas vrai.
tonio
5
C'était peut-être vrai en 2009 lors de la réponse initiale.
Flurdy