Esegui un singolo metodo di prova con Maven


519

So che puoi eseguire tutti i test in una determinata classe usando:

mvn test -Dtest=classname

Ma voglio eseguire un metodo individuale e -Dtest = classname.methodname non sembra funzionare.


3
Sarei interessato a sapere come fare anche questo. Tuttavia, se mi ritrovassi a farlo abbastanza spesso, penso che il test potrebbe essere un candidato da suddividere nella sua stessa classe, quindi puoi usare la mvn test -Dtest=classnamesintassi.
John Paulett,

Vuoi sapere come farlo solo dalla riga di comando ?? O usando un IDE (eclissi) funzionerebbe per te?
Diego Dias,

1
Stavo guardando una riga di comando. Penso che il plugin junit eclipse ti permetterà di farlo.
BillMan,

L'ho fatto per Maven 1. Come ho ricordato, si trattava di apportare modifiche a JUnit, che è responsabile dell'introspezione della classe di test.
kdgregory,

Risposte:


698

Per eseguire un singolo metodo di prova in Maven, è necessario fornire il comando come:

mvn test -Dtest=TestCircle#xyz test

dove TestCircleè il nome della classe di test ed xyzè il metodo di test.

Anche i caratteri jolly funzionano; sia nel nome del metodo che nel nome della classe.

Se stai testando in un progetto multi-modulo, specifica il modulo con cui si trova il test -pl <module-name>.

Per i test di integrazione utilizzare l' it.test=...opzione anziché test=...:

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test

4
Risolto l'errore "Nessun test eseguito" con il downgrade a surefire 2.9
qwerty

15
Ho corretto "Nessun test eseguito!" aggiornando a 2.14:
alfonx

54
Se stai testando in un progetto multi-modulo, devi anche specificare il modulo con cui si trova il test -pl <module-name>.
Jon,

22
Utilizzare -DfailIfNoTests=falseper saltare i progetti senza test. No Tests Were Executedaccade quando si tenta di eseguire il test dal progetto principale e sono presenti moduli senza test.
Cherry,

4
Questo comando funziona !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Si noti che "-DTest" inizia con MAIUSCOLO 'T'.
Vik

25

Si è verificato un problema con surefire 2.12. Questo è ciò che mi accade cambiando maven-surefire-plugin da 2.12 a 2.11:

  1. mvn test -Dtest=DesignRulesTest

    Risultato:
    [ERRORE] Impossibile eseguire l'obiettivo org.apache.maven.plugins: maven-surefire-plugin: 2.12 : test (default-test) sul progetto pmd: Nessun test eseguito!

  2. mvn test -Dtest=DesignRulesTest

    Risultato: [INFO] --- maven-surefire-plugin: 2.11 : test (default-test) @ pmd --- ... In esecuzione net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest dei test eseguiti: 5 , Errori: 0, Errori: 0, Ignorato: 4, Tempo trascorso: 4,009 sec


5
Funziona di nuovo in 2.12.1 o versioni successive.
yurez,

Risolto "Nessun test eseguito!" aggiornando a 2.14
alfonx

Se usi @Category(IntegrationTest.class), usa -Dit.test=ClassName, altrimenti otterrai No tests were executed!anche con le ultime versioni dei plugin.
uvsmtid

16

Quello che faccio con il mio TestNG, (scusate, JUnit non supporta questo) casi di test è che posso assegnare un gruppo al test che voglio eseguire

@Test(groups="broken")

E quindi esegui semplicemente "mvn -Dgroups = broken".


1
Questa è una buona risposta Nel mio caso, il test ha tentato di essere eseguito ma alcuni componenti di Seam non sono stati configurati correttamente, quindi sembra che questo salti anche una parte del codice di installazione.
Chris Williams,

1
Corretta. Devi inserire gruppi = suddivisi in @BeforeMethod oppure fare @BeforeMethod (alwaysRun = true)
tunaranch

Per favore fatemi sapere cos'è il gruppo qui, poiché sto riscontrando un problema di compilazione.
Paramesh Korrakuti,

14

Esecuzione di una serie di metodi in una singola classe di test Con la versione 2.7.3, è possibile eseguire solo n test in una singola classe di test.

NOTA: è supportato per junit 4.xe TestNG.

È necessario utilizzare la sintassi seguente

mvn -Dtest=TestCircle#mytest test

Puoi anche usare modelli

mvn -Dtest=TestCircle#test* test

A partire da surefire 2.12.1, è possibile selezionare più metodi (solo JUnit4X in questo momento, patch benvenute)

mvn -Dtest=TestCircle#testOne+testTwo test

Controlla questo link per i singoli test


2
Nel mio caso ho dovuto citare due volte il nome del test TestClass # come mvn -Dtest = Test "TestCircle # myTest"
Pratik Khadloya,

@PratikKhadloya Qualche idea su come funziona per i test dipendenti? Ad esempio, ho i metodi test1 (), test2 (), test3 () in TestClass e test2 dipende da test1. Come posso eseguire solo test2 ()?
Ziska,

3
Penso che se hai dipendenze tra i tuoi test, stai facendo qualcosa di sbagliato. Ogni test dovrebbe essere indipendente da altri test. È necessario rimuovere l'accoppiamento tra di loro.
Pratik Khadloya,

11

È possibile eseguire classi di test e metodi specifici utilizzando la sintassi seguente:

  1. pacchetto completo: mvn test -Dtest = "com.oracle.tests. **"

  2. tutti i metodi in una classe: mvn test -Dtest = CLASS_NAME1

  3. metodo singolo dalla singola classe: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1

  4. metodo multiplo da più classi: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1, CLASS_NAME2 # METHOD_NAME2


9

Questo comando funziona !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testSi noti che "-DTest" inizia con MAIUSCOLO 'T'.


4
Non non funziona con infallibile 2.18.x; esegue solo tutti i test.
Janaka Bandara,

4

Il parametro di test menzionato da tobrien consente di specificare un metodo utilizzando un # prima del nome del metodo. Questo dovrebbe funzionare per JUnit e TestNG. Non l'ho mai provato, basta leggerlo sulla pagina Plugin Surefire :

Specificare questo parametro per eseguire singoli test in base al nome del file, sovrascrivendo i parametri include / exclude. Ogni modello qui specificato verrà utilizzato per creare un modello di inclusione formattato come ** / $ {test} .java, quindi puoi semplicemente digitare "-Dtest = MyTest" per eseguire un singolo test chiamato "foo / MyTest.java". Questo parametro sovrascrive i parametri include / exclude e il parametro TestNG suiteXmlFiles. da 2.7.3 È possibile eseguire un numero limitato di metodi nel test aggiungendo #myMethod o # my * ethod. Si tipo "-Dtest = MyTest # myMethod" supportato per junit 4.xe testNg


3

Le nuove versioni di JUnit contengono il corridore Categorie: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

Ma la procedura di rilascio di JUnit non è basata su Maven, quindi gli utenti Maven devono inserirla manualmente nei loro repository.


1
Bello. Ma non vedo come questo risponda alla domanda.
Pascal Thivent,

2
Subj è supportato dalla versione 2.7.3 di maven-surefire-plugin: maven.apache.org/plugins/maven-surefire-plugin/examples/…
Andriy Plokhotnyuk

3

A partire dalla versione 2.22.1 del plugin surefire (possibilmente precedente) è possibile eseguire test singoli usando la proprietà testnames quando si usa testng.xml

Dato un seguente 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> 

con il 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>

Dalla riga di comando

mvn clean test -DselectedTests=run-B-test

Ulteriori letture - Plugin Maven surefire usando testng


-5

È possibile eseguire una singola classe di test, ma non un singolo metodo all'interno di una classe di test. Si utilizza il nome semplice della classe e non il nome completo della classe. Quindi, se hai un test in "org.sonatype.test.MyTest" e questo è l'unico test che vuoi eseguire, la tua riga di comando sarebbe simile a questa:

mvn test -Dtest=MyTest

Ho testato la soluzione descritta nei commenti precedenti in un progetto a modulo singolo, quindi ciò che sta dicendo questo commento non è vero.
Tonio,

5
Potrebbe essere stato vero nel 2009 quando originariamente ha risposto.
Flurdy

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.