Запустите один метод тестирования с Maven

519

Я знаю, что вы можете запустить все тесты в определенном классе, используя:

mvn test -Dtest=classname

Но я хочу запустить отдельный метод, и -Dtest = classname.methodname, похоже, не работает.

Billman
источник
3
Мне было бы интересно узнать, как это сделать тоже. Однако, если я обнаружил, что делаю это довольно часто, я думаю, что тест может быть кандидатом для разделения на собственный класс, так что вы можете использовать mvn test -Dtest=classnameсинтаксис.
Джон Полетт
Вы хотите знать, как это сделать только из командной строки ?? Или использование IDE (Eclipse) будет работать для вас?
Диего Диас
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происходит, когда вы пытаетесь запустить тест из корневого проекта, и есть модули без тестов вообще.
Черри
4
Эта команда работает !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Обратите внимание, что "-DTest" начинается с ВЕРХНЕГО СЛУЧАЯ 'T'.
Викас
25

Есть проблема с верным 2.12. Вот что случилось со мной, изменив maven-surefire-plugin с 2.12 на 2.11:

  1. mvn test -Dtest=DesignRulesTest

    Результат:
    [ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins: maven-surefire-plugin: 2.12 : test (default-test) для проекта pmd: Тесты не выполнялись!

  2. mvn test -Dtest=DesignRulesTest

    Результат: [INFO] --- maven-surefire-plugin: 2.11 : test (default-test) @ pmd --- ... Запуск net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest Выполнено тестов: 5 , Сбои: 0, Ошибки: 0, Пропущено: 4, Время истекло: 4.009 сек.

Дуччо Фаббри
источник
5
Работает снова в 2.12.1 или позже.
Юрез
Исправлено: «Тесты не выполнялись!» путем обновления до 2.14
alfonx
Если вы используете @Category(IntegrationTest.class), используйте -Dit.test=ClassName, в противном случае вы получите No tests were executed!даже с последними версиями плагина.
Uvsmtid
16

Что я делаю с моим TestNG, (извините, JUnit не поддерживает это) контрольные примеры - я могу назначить группу для теста, который я хочу выполнить

@Test(groups="broken")

А затем просто запустите 'mvn -Dgroups = broken'.

tunaranch
источник
1
Это хороший ответ. В моем случае тест попытался выполнить, но некоторые компоненты Seam не были настроены должным образом, поэтому похоже, что это также пропускает некоторую часть кода установки.
Крис Уильямс
1
Правильный. Вам нужно либо поместить groups = broken в ваш @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"
Пратик Хадлоя,
@PratikKhadloya Есть идеи, как это работает для зависимых тестов? Скажем, у меня есть методы test1 (), test2 (), test3 () в TestClass, а test2 зависит от test1. Как я могу запустить только test2 ()?
Ziska
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

Назмул Хоке Шафин
источник
9

Эта команда работает !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testОбратите внимание, что "-DTest" начинается с ВЕРХНЕГО СЛУЧАЯ 'T'.

Викас
источник
4
Кто не работает с безошибочным 2.18.x; он просто запускает все тесты.
Джанака Бандара
4

Тест параметр упоминается tobrien позволяет указать метод с использованием # перед именем метода. Это должно работать для JUnit и TestNG. Я никогда не пробовал это, просто прочитайте это на странице Плагина Surefire :

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

Уэсли Хартфорд
источник
3

Новые версии JUnit содержат бегунок категорий: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

Но процедура выпуска JUnit не основана на maven, поэтому пользователи maven должны вручную поместить ее в свои репозитории.

Андрей Плохотнюк
источник
1
Ницца. Но я не понимаю, как это отвечает на вопрос.
Паскаль Thivent
2
Subj поддерживается в версии 2.7.3 подключаемого модуля
Андрей Плохотнюк,
3

С верным плагином версии 2.22.1 (возможно, ранее) вы можете запускать одиночный тест с использованием свойства testnames при использовании 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> 

с помощью 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>

Из командной строки

mvn clean test -DselectedTests=run-B-test

Дальнейшее чтение - плагин Maven surefire с использованием testng

БСК
источник
-5

Вы можете запустить один тестовый класс, но не один метод внутри тестового класса. Вы используете простое имя класса, а не полное имя класса. Итак, если у вас есть тест в «org.sonatype.test.MyTest» и это единственный тест, который вы хотите запустить, ваша командная строка будет выглядеть так:

mvn test -Dtest=MyTest
Тим О'Брайен
источник
Я протестировал решение, описанное в предыдущих комментариях, в одном модульном проекте, поэтому то, что говорит этот комментарий, неверно.
tonio
5
Возможно, это было правдой в 2009 году, когда первоначально ответили.
17
-9

Насколько мне известно, надёжный плагин не предоставляет никакого способа сделать это. Но не стесняйтесь, чтобы открыть вопрос :)

Паскаль Тивент
источник