Запустити єдиний метод тестування з 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.