Führen Sie eine einzelne Testmethode mit maven aus

519

Ich weiß, dass Sie alle Tests in einer bestimmten Klasse ausführen können, indem Sie:

mvn test -Dtest=classname

Aber ich möchte eine einzelne Methode ausführen und -Dtest = classname.methodname scheint nicht zu funktionieren.

BillMan
quelle
3
Mich würde auch interessieren, wie das geht. Wenn ich es jedoch ziemlich oft mache, denke ich, dass Test ein Kandidat sein könnte, der in eine eigene Klasse aufgeteilt wird, sodass Sie die mvn test -Dtest=classnameSyntax verwenden können.
John Paulett
Möchten Sie wissen, wie es nur über die Befehlszeile geht? Oder würde die Verwendung einer IDE (Eclipse) für Sie funktionieren?
Diego Dias
1
Ich habe auf eine Kommandozeile geschaut. Ich denke, das Junit Eclipse Plugin wird es Ihnen ermöglichen, dies zu tun.
BillMan
Ich habe dies für Maven 1 getan. Wie ich mich erinnerte, mussten Änderungen an JUnit vorgenommen werden, das für die Überprüfung der Testklasse verantwortlich ist.
kdgregory

Antworten:

698

Um eine einzelne Testmethode in Maven auszuführen, müssen Sie den folgenden Befehl eingeben:

mvn test -Dtest=TestCircle#xyz test

Wo TestCircleist der Name xyzder Testklasse und ist die Testmethode.

Platzhalterzeichen funktionieren ebenfalls. sowohl im Methodennamen als auch im Klassennamen.

Wenn Sie in einem Projekt mit mehreren Modulen testen, geben Sie das Modul an, in dem sich der Test befindet -pl <module-name>.

Verwenden Sie für Integrationstests die it.test=...Option anstelle von test=...:

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test
Mudit Srivastava
quelle
4
Der Fehler "Keine Tests wurden ausgeführt" wurde
behoben,
15
Ich habe behoben, dass "keine Tests ausgeführt wurden!" durch Upgrade auf 2.14:
Alfonx
54
Wenn Sie in einem Projekt mit mehreren Modulen testen, müssen Sie auch das Modul angeben, in dem sich der Test befindet -pl <module-name>.
Jon
22
Verwenden Sie -DfailIfNoTests=falsediese Option, um Projekte ohne Test zu überspringen. No Tests Were ExecutedDies passiert, wenn Sie versuchen, einen Test aus dem Root-Projekt auszuführen, und es Module gibt, die überhaupt keine Tests haben.
Cherry
4
Dieser Befehl funktioniert !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Beachten Sie, dass "-DTest" mit UPPER CASE 'T' beginnt.
Vikas
25

Es gibt ein Problem mit todsicheren 2.12. Das passiert mir, wenn ich das Maven-Surefire-Plugin von 2.12 auf 2.11 ändere:

  1. mvn test -Dtest=DesignRulesTest

    Ergebnis:
    [FEHLER] Fehler beim Ausführen des Ziels org.apache.maven.plugins: maven-surefire-plugin: 2.12 : Test (Standardtest) für Projekt pmd: Es wurden keine Tests ausgeführt!

  2. mvn test -Dtest=DesignRulesTest

    Ergebnis: [INFO] --- Maven-Surefire-Plugin: 2.11 : Test (Standardtest) @ pmd --- ... Ausführen von net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest Testlauf: 5 , Fehler: 0, Fehler: 0, Übersprungen: 4, Verstrichene Zeit: 4,009 Sek

Duccio Fabbri
quelle
5
Funktioniert wieder in 2.12.1 oder höher.
Yurez
Behoben "Es wurden keine Tests ausgeführt!" durch Upgrade auf 2.14
Alfonx
Wenn Sie verwenden @Category(IntegrationTest.class), verwenden Sie -Dit.test=ClassName, sonst erhalten Sie No tests were executed!auch mit den neuesten Plugin-Versionen.
Uvsmtid
16

Was ich mit meinen TestNG-Testfällen mache (sorry, JUnit unterstützt dies nicht), ist, dass ich dem Test, den ich ausführen möchte, eine Gruppe zuweisen kann

@Test(groups="broken")

Und dann einfach 'mvn -Dgroups = kaputt' ausführen.

Tunaranch
quelle
1
Das ist eine gute Antwort. In meinem Fall hat der Test versucht, ausgeführt zu werden, aber einige Seam-Komponenten wurden nicht ordnungsgemäß eingerichtet, sodass anscheinend auch ein Teil des Setup-Codes übersprungen wird.
Chris Williams
1
Richtig. Sie müssen entweder groups = in Ihre @BeforeMethod einfügen oder @BeforeMethod (alwaysRun = true)
ausführen
Bitte lassen Sie mich wissen, was hier eine Gruppe ist, da ich ein Kompilierungsproblem bekomme.
Paramesh Korrakuti
14

Ausführen einer Reihe von Methoden in einer einzelnen Testklasse Mit Version 2.7.3 können Sie nur n Tests in einer einzelnen Testklasse ausführen.

HINWEIS: Es wird für Junit 4.x und TestNG unterstützt.

Sie müssen die folgende Syntax verwenden

mvn -Dtest=TestCircle#mytest test

Sie können auch Muster verwenden

mvn -Dtest=TestCircle#test* test

Ab todsicherer 2.12.1 können Sie mehrere Methoden auswählen (JUnit4X nur zu diesem Zeitpunkt, Patches willkommen)

mvn -Dtest=TestCircle#testOne+testTwo test

Überprüfen Sie diesen Link zu einzelnen Tests

Prasanth Kumar Diddi
quelle
2
In meinem Fall musste ich den TestClass # Testnamen wie mvn -Dtest = "TestCircle # myTest" Test
Pratik Khadloya
@PratikKhadloya Irgendeine Idee, wie es für abhängige Tests funktioniert? Angenommen, ich habe die Methoden test1 (), test2 (), test3 () in TestClass und test2 hängt von test1 ab. Wie kann ich nur test2 () ausführen?
Ziska
3
Ich denke, wenn Sie Abhängigkeiten zwischen Ihren Tests haben, machen Sie etwas falsch. Jeder Test sollte unabhängig von anderen Tests sein. Sie müssen die Kupplung zwischen ihnen entfernen.
Pratik Khadloya
11

Sie können bestimmte Testklassen und Methoden mit der folgenden Syntax ausführen:

  1. vollständiges Paket: mvn test -Dtest = "com.oracle.tests. **"

  2. Alle Methoden in einer Klasse: mvn test -Dtest = CLASS_NAME1

  3. Einzelmethode aus einer Klasse: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1

  4. Mehrfachmethode aus mehreren Klassen: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1, CLASS_NAME2 # METHOD_NAME2

Nazmul Hoque Shafin
quelle
10

Dieser Befehl funktioniert !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testBeachten Sie, dass "-DTest" mit UPPER CASE 'T' beginnt.

vikas
quelle
4
Funktioniert nicht mit SureFire 2.18.x; Es werden nur alle Tests ausgeführt.
Janaka Bandara
4

Die Testparameter von tobrien erwähnt können Sie eine Methode angeben , unter Verwendung eines # vor dem Methodennamen. Dies sollte für JUnit und TestNG funktionieren. Ich habe es noch nie versucht, lies es einfach auf der Surefire Plugin Seite :

Geben Sie diesen Parameter an, um einzelne Tests nach Dateinamen auszuführen, wobei die Einschluss- / Ausschlussparameter überschrieben werden. Jedes hier angegebene Muster wird verwendet, um ein Include-Muster zu erstellen, das wie ** / $ {test} .java formatiert ist. Sie können also einfach "-Dtest = MyTest" eingeben, um einen einzelnen Test mit dem Namen "foo / MyTest.java" auszuführen. Dieser Parameter überschreibt die Einschluss- / Ausschlussparameter und den Parameter TestNG suiteXmlFiles. seit 2.7.3 Sie können eine begrenzte Anzahl von Methoden im Test ausführen, indem Sie #myMethod oder # my * ethod hinzufügen. Si-Typ "-Dtest = MyTest # myMethod" wird für junit 4.x und testNg unterstützt

Wesley Hartford
quelle
3

Neue Versionen von JUnit enthalten den Categories Runner: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

Das Freigabeverfahren von JUnit basiert jedoch nicht auf Maven, sodass Maven-Benutzer es manuell in ihre Repositorys stellen müssen.

Andriy Plokhotnyuk
quelle
1
Nett. Aber ich sehe nicht, wie dies die Frage beantwortet.
Pascal Thivent
2
Subj wird von der Version 2.7.3 des Maven-Surefire-Plugins unterstützt: maven.apache.org/plugins/maven-surefire-plugin/examples/…
Andriy Plokhotnyuk
3

Ab der Version 2.22.1 des todsicheren Plugins (möglicherweise früher) können Sie bei Verwendung von testng.xml einen einzelnen Test mit der Eigenschaft testnames ausführen

Gegeben eine folgende testng.xml

<?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> 

mit der 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>

Von der Kommandozeile

mvn clean test -DselectedTests=run-B-test

Weiterführende Literatur - Maven todsicheres Plugin mit testng

bsk
quelle
-5

Sie können eine einzelne Testklasse ausführen, jedoch keine einzelne Methode innerhalb einer Testklasse. Sie verwenden den einfachen Namen der Klasse, nicht den vollständig qualifizierten Namen der Klasse. Wenn Sie also einen Test in "org.sonatype.test.MyTest" haben und dies der einzige Test ist, den Sie ausführen möchten, sieht Ihre Befehlszeile folgendermaßen aus:

mvn test -Dtest=MyTest
Tim O'Brien
quelle
Ich habe die in früheren Kommentaren beschriebene Lösung in einem einzelnen Modulprojekt getestet. Was dieser Kommentar sagt, ist also nicht wahr.
Tonio
5
Möglicherweise war es 2009 wahr, als es ursprünglich beantwortet wurde.
Unruhiger
-9

Meines Wissens bietet das todsichere Plugin keine Möglichkeit, dies zu tun. Aber zögern Sie nicht, eine Ausgabe zu eröffnen :)

Pascal Thivent
quelle