Uruchom pojedynczą metodę testową za pomocą maven

519

Wiem, że możesz uruchomić wszystkie testy w określonej klasie, używając:

mvn test -Dtest=classname

Ale chcę uruchomić indywidualną metodę i -Dtest = nazwa_klasy. Nazwa_metody wydaje się nie działać.

BillMan
źródło
3
Byłbym również zainteresowany tym, jak to zrobić. Jeśli jednak często to robię, myślę, że test może być kandydatem do podziału na własną klasę, więc możesz użyć mvn test -Dtest=classnameskładni.
John Paulett,
Czy chcesz wiedzieć, jak to zrobić tylko za pomocą wiersza polecenia? Czy użycie IDE (zaćmienie) byłoby dla Ciebie przydatne?
Diego Dias,
1
Patrzyłem na linię poleceń. Myślę, że wtyczka junit eclipse pozwoli ci to zrobić.
BillMan,
Zrobiłem to dla Maven 1. Jak pamiętałem, wymagało to wprowadzenia zmian w JUnit, który jest odpowiedzialny za introspekcję klasy testowej.
kdgregory,

Odpowiedzi:

698

Aby uruchomić pojedynczą metodę testową w Maven, musisz podać komendę jako:

mvn test -Dtest=TestCircle#xyz test

gdzie TestCirclejest nazwą klasy testowej i xyzjest metodą testową.

Dzikie znaki również działają; zarówno w nazwie metody, jak i nazwie klasy.

Jeśli testujesz w projekcie wielomodułowym, określ moduł, w którym test się znajduje -pl <module-name>.

Do testów integracyjnych użyj it.test=...opcji zamiast test=...:

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test
Mudit Srivastava
źródło
4
Naprawiono błąd „Nie wykonano żadnych testów”, obniżając wersję do surefire 2.9
qwerty
15
Naprawiłem „Nie wykonano żadnych testów!” aktualizując do 2.14:
alfonx
54
Jeśli testujesz w projekcie złożonym z wielu modułów, musisz także określić moduł, w którym test się znajduje -pl <module-name>.
Jon
22
Służy -DfailIfNoTests=falsedo pomijania projektów bez testu. No Tests Were Executedzdarza się, gdy próbujesz uruchomić test z projektu root i są moduły bez testów w ogóle.
Cherry
4
To polecenie działa !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Zauważ, że „-DTest” zaczyna się od GÓRNEJ OBUDOWY „T”.
vikas,
25

Wystąpił problem z surefire 2.12. Oto co się ze mną zmieniło, zmieniając wtyczkę maven-surefire z 2.12 na 2.11:

  1. mvn test -Dtest=DesignRulesTest

    Wynik:
    [BŁĄD] Nie udało się wykonać celu org.apache.maven.plugins: maven-surefire-plugin: 2.12 : test (test domyślny) w projekcie pmd: Nie wykonano żadnych testów!

  2. mvn test -Dtest=DesignRulesTest

    Wynik: [INFO] --- maven-surefire-plugin: 2.11 : test (test domyślny) @ pmd --- ... Uruchamianie net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest Uruchomienie testów: 5 , Awarie: 0, Błędy: 0, Pominięte: 4, Upływ czasu: 4.009 sek

Duccio Fabbri
źródło
5
Działa ponownie w wersji 2.12.1 lub nowszej.
yurez
Naprawiono „Nie wykonano żadnych testów!” aktualizując do 2.14
alfonx
Jeśli używasz @Category(IntegrationTest.class), używaj -Dit.test=ClassName, w przeciwnym razie otrzymasz No tests were executed!nawet najnowsze wersje wtyczek.
uvsmtid
16

To, co robię z moim TestNG (przepraszam, JUnit nie obsługuje tego), to przypadki, w których mogę przypisać grupę do testu, który chcę uruchomić

@Test(groups="broken")

A następnie po prostu uruchom „mvn -Dgroups = broken”.

tunaranch
źródło
1
To dobra odpowiedź. W moim przypadku test próbował się uruchomić, ale niektóre komponenty Seam nie zostały poprawnie skonfigurowane, więc wygląda na to, że pomija również część kodu instalacyjnego.
Chris Williams,
1
Poprawny. Musisz albo wstawić grupy = włamane do twojego @BeforeMethod, albo zrobić @BeforeMethod (alwaysRun = true)
tunaranch
Daj mi znać, co to jest grupa, ponieważ dostaję problem z kompilacją.
Paramesh Korrakuti
14

Uruchamianie zestawu metod w jednej klasie testowej W wersji 2.7.3 można uruchomić tylko n testów w jednej klasie testowej.

UWAGA: jest obsługiwany przez junit 4.xi TestNG.

Musisz użyć następującej składni

mvn -Dtest=TestCircle#mytest test

Możesz także użyć wzorów

mvn -Dtest=TestCircle#test* test

Od surefire 2.12.1 możesz wybrać wiele metod (obecnie JUnit4X, łatki mile widziane)

mvn -Dtest=TestCircle#testOne+testTwo test

Sprawdź ten link na temat pojedynczych testów

Prasanth Kumar Diddi
źródło
2
W moim przypadku musiałem dwukrotnie zacytować nazwę testu TestClass #, np. Mvn -Dtest = Test "TestCircle # myTest"
Pratik Khadloya
@PratikKhadloya Wiesz, jak to działa w przypadku testów zależnych? Powiedzmy, że mam metody test1 (), test2 (), test3 () w TestClass, a test2 zależy od testu1. Jak mogę uruchomić tylko test2 ()?
Ziska
3
Myślę, że jeśli masz zależności między swoimi testami, robisz coś złego. Każdy test powinien być niezależny od innych testów. Musisz usunąć połączenie między nimi.
Pratik Khadloya
11

Możesz uruchomić określone klasy testowe i metody, stosując następującą składnię:

  1. pełny pakiet: test mvn -Dtest = "com.oracle.tests. **"

  2. wszystkie metody w klasie: test mvn -Dtest = CLASS_NAME1

  3. pojedyncza metoda z pojedynczej klasy: test mvn -Dtest = CLASS_NAME1 # METHOD_NAME1

  4. metoda wielokrotna z wielu klas: test mvn -Dtest = CLASS_NAME1 # METHOD_NAME1, CLASS_NAME2 # METHOD_NAME2

Nazmul Hoque Shafin
źródło
10

To polecenie działa !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testZauważ, że „-DTest” zaczyna się od GÓRNEJ OBUDOWY „T”.

Vikas
źródło
4
Czy nie pracować z SureFire 2.18.x; po prostu uruchamia wszystkie testy.
Janaka Bandara,
4

Badanie parametrów wymienionych przez tobrien pozwala określić metodę używając # przed nazwą metody. To powinno działać dla JUnit i TestNG. Nigdy tego nie próbowałem, po prostu przeczytaj to na stronie wtyczki Surefire :

Określ ten parametr, aby uruchamiać pojedyncze testy według nazwy pliku, zastępując parametry włączeń / wykluczeń. Każdy określony tutaj wzorzec zostanie użyty do utworzenia wzorca dołączania sformatowanego jak ** / $ {test} .java, więc możesz po prostu wpisać „-Dtest = MyTest”, aby uruchomić pojedynczy test o nazwie „foo / MyTest.java”. Ten parametr zastępuje parametry włączania / wyłączania i parametr TestNG suiteXmlFiles. od wersji 2.7.3 Możesz wykonać ograniczoną liczbę metod w teście, dodając #myMethod lub # my * ethod. Typ Si „-Dtest = MyTest # myMethod” obsługiwany przez junit 4.xi testNg

Wesley Hartford
źródło
3

Nowe wersje JUnit zawiera moduł uruchamiający kategorie: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

Ale procedura wydania JUnit nie jest oparta na maven, więc użytkownicy maven muszą ręcznie umieścić go w swoich repozytoriach.

Andrij Plokhotnyuk
źródło
1
Miły. Ale nie rozumiem, jak to odpowiada na pytanie.
Pascal Thivent,
2
Subj jest obsługiwany z wersji 2.7.3 wtyczki maven- surefire
Andriy Plokhotnyuk
3

Począwszy od wtyczki surefire w wersji 2.22.1 (być może wcześniejszej), można uruchomić pojedynczy test, używając właściwości testnames, używając testng.xml

Biorąc pod uwagę następujący 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> 

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

Z linii poleceń

mvn clean test -DselectedTests=run-B-test

Dalsza lektura - wtyczka Maven surefire za pomocą testng

bsk
źródło
-5

Możesz uruchomić jedną klasę testową, ale nie jedną metodę w klasie testowej. Używasz prostej nazwy klasy, a nie pełnej nazwy klasy. Więc jeśli masz test w „org.sonatype.test.MyTest” i jest to jedyny test, który chcesz uruchomić, linia poleceń wyglądałaby następująco:

mvn test -Dtest=MyTest
Tim O'Brien
źródło
Testowałem rozwiązanie opisane w poprzednich komentarzach w projekcie z jednym modułem, więc to, co mówi ten komentarz, nie jest prawdą.
tonio
5
Mogło być prawdą w 2009 r., Kiedy pierwotnie udzielono odpowiedzi.
flurdy