Запустити єдиний метод тестування з Maven


519

Я знаю, що ви можете запустити всі тести в певному класі, використовуючи:

mvn test -Dtest=classname

Але я хочу запустити індивідуальний метод, і -Dtest = classname.methodname, здається, не працює.


3
Мені було б цікаво знати, як це зробити. Однак, якщо я виявив, що це роблю досить часто, я думаю, що тест може бути кандидатом, який можна розділити на власний клас, тож ви можете використовувати mvn test -Dtest=classnameсинтаксис.
Джон Полетт

Ви хочете знати, як це зробити лише за допомогою командного рядка ?? Або використання IDE (затемнення) допоможе вам?
Дієго Діас

1
Я дивився на командний рядок. Я думаю, що плагін junit eclipse дозволить вам це зробити.
BillMan

Я зробив це для Maven 1. Як я згадував, він передбачав внесення змін до JUnit, який відповідає за самоаналіз тестового класу.
kdgregory

Відповіді:


698

Щоб запустити єдиний метод тестування в Maven, вам потрібно надати команду як:

mvn test -Dtest=TestCircle#xyz test

де TestCircleназва тестового класу та xyzметод тестування.

Діючі персонажі карт також працюють; як у назві методу, так і в назві класу.

Якщо ви тестуєте в мультимодульному проекті, вкажіть модуль, з яким знаходиться тест -pl <module-name>.

Для інтеграційних тестів використовуйте it.test=...опцію замість test=...:

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

4
Виправлено помилку "Не виконано тестів", перейшовши на версію 2.9
qwerty

15
Я виправив "Жодні тести не виконувалися!" оновивши до 2,14:
alfonx

54
Якщо ви тестуєте в мультимодульному проекті, вам також потрібно вказати модуль, з яким знаходиться тест -pl <module-name>.
Джон

22
Використовуйте -DfailIfNoTests=falseдля пропуску проектів без тесту. No Tests Were Executedтрапляється, коли ви намагаєтеся запустити тест з root проекту, і там є модулі без тестів взагалі.
Вишня

4
Ця команда працює !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Зауважте, що "-DTest" починається з верхнього випадку "T".
vikas

25

Виникла проблема з надійною версією 2.12. Ось що трапляється зі зміною плагіну Maven-surefire з 2.12 на 2.11:

  1. mvn test -Dtest=DesignRulesTest

    Результат:
    [ПОМИЛКА] Не вдалося виконати ціль org.apache.maven.plugins: maven-surefire-plugin: 2.12 : тест (тест за замовчуванням) у проекті pmd: Тести не виконані!

  2. mvn test -Dtest=DesignRulesTest

    Результат: [INFO] --- maven-surefire-плагін: 2.11 : тест (тест за замовчуванням) @ pmd --- ... Запуск net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest Тести запускаються: 5 , Помилки: 0, Помилки: 0, Пропущено: 4, Час минув: 4.009 сек


5
Працює знову в 2.12.1 або пізнішої версії.
yurez

Виправлено "Тести не виконувались!" оновивши до 2,14
альфонкс

Якщо ви користуєтесь @Category(IntegrationTest.class), використовуйте -Dit.test=ClassName, інакше ви отримаєте No tests were executed!навіть з останніми версіями плагінів.
uvsmtid

16

Що я роблю зі своїм TestNG (вибачте, JUnit не підтримує це) тестові випадки - це я можу призначити групу тесту, який я хочу запустити

@Test(groups="broken")

А потім просто запустіть 'mvn -Dgroups = зламаний'.


1
Це хороша відповідь. У моєму випадку тест намагався запустити, але деякі компоненти шва не були налаштовані належним чином, тому, схоже, це також пропускає частину коду настройки.
Кріс Вільямс

1
Правильно. Вам потрібно або поставити групи = розбиті у своєму @BeforeMethod, або зробити @BeforeMethod (alwaysRun = true)
tunaranch

Будь ласка, дайте мені знати, що тут група, оскільки я отримую питання про компіляцію.
Параміш Корракуті

14

Запуск набору методів у єдиному тестовому класі З версією 2.7.3 ви можете запустити лише n тестів у одному тестовому класі.

ПРИМІТКА: він підтримується для junit 4.x та TestNG.

Ви повинні використовувати наступний синтаксис

mvn -Dtest=TestCircle#mytest test

Ви також можете використовувати візерунки

mvn -Dtest=TestCircle#test* test

За станом надійного 2.12.1 ви можете обрати кілька методів (JUnit4X лише в цей час, латки вітаються)

mvn -Dtest=TestCircle#testOne+testTwo test

Перевірте це посилання про окремі тести


2
У моєму випадку мені довелося подвоїти назви тесту TestClass # як тест mvn -Dtest = "TestCircle # myTest"
Pratik Khadloya

@PratikKhadloya Будь-яка ідея, як це працює для залежних тестів? Скажімо, у мене в TestClass є тести test1 (), test2 (), test3 (), а test2 залежить від test1. Як я можу запустити тільки test2 ()?
Зіска

3
Я думаю, якщо ти маєш залежність серед своїх тестів, ти робиш щось не так. Кожен тест повинен бути незалежним від інших тестів. Потрібно зняти муфту між ними.
Пратік Хадлоя

11

Ви можете запустити конкретні тестові класи та метод (и), використовуючи наступний синтаксис:

  1. повний пакет: mvn test -Dtest = "com.oracle.tests. **"

  2. весь метод у класі: mvn test -Dtest = CLASS_NAME1

  3. єдиний метод з одного класу: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1

  4. кілька методів з декількох класів: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1, CLASS_NAME2 # METHOD_NAME2


10

Ця команда працює !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testЗауважте, що "-DTest" починається з верхнього випадку "T".


4
Хто НЕ працює з безпомилковим 2.18.x; він просто запускає всі тести.
Janaka Bandara

4

Параметр тесту, згаданий tobrien, дозволяє вказати метод, використовуючи # перед назвою методу. Це має працювати для JUnit та TestNG. Я ніколи не пробував цього, просто читав його на сторінці Surefire Plugin :

Вкажіть цей параметр для запуску окремих тестів за назвою файлу, замінюючи параметри, що включають / виключають. Кожен шаблон, який ви вкажете тут, буде використовуватися для створення шаблону включення, форматованого як ** / $ {test} .java, тому ви можете просто ввести "-Dtest = MyTest", щоб запустити єдиний тест під назвою "foo / MyTest.java". Цей параметр замінює параметри, що включають / виключають, і параметр TestNG suiteXmlFiles. оскільки 2.7.3 Ви можете виконати обмежену кількість методів у тесті, додавши #myMethod або # my * ethod. Si тип "-Dtest = MyTest # myMethod" підтримується для junit 4.x та testNg


3

Нові версії JUnit містять категорію Runner: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

Але процедура випуску JUnit не заснована на Maven, тому користувачі Maven повинні розмістити її вручну у своїх сховищах.


1
Приємно. Але я не бачу, як це відповідає на питання.
Паскаль Thivent

2
Subj підтримується з версії 2.7.3 maven- surefire
Андрій

3

Оскільки версія надійного плагіна версії 2.22.1 (можливо, раніше), ви можете запустити один тест, використовуючи властивість тестових імен при використанні testng.xml

Дано наступний 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> 

з пом.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>

З командного рядка

mvn clean test -DselectedTests=run-B-test

Подальше читання - Maven surefire плагін за допомогою testng


-5

Ви можете запустити один тестовий клас, але не один метод у межах тестового класу. Ви використовуєте просте ім'я класу, а не повноцінне ім'я класу. Отже, якщо у вас є тест на "org.sonatype.test.MyTest", і це єдиний тест, який ви хочете запустити, ваш командний рядок виглядатиме так:

mvn test -Dtest=MyTest

Я тестував рішення, описане на попередніх коментарях в одному проекті модуля, тому те, що йдеться в цьому коментарі, не відповідає дійсності.
tonio

5
Це, можливо, було правдою в 2009 році, коли було зроблено відповіді.
шквальний

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.