1. Обзор
Обычно мы выполняем тесты во время сборки Maven с помощью плагина Maven surefire .
В этом руководстве будет показано, как использовать этот плагин для запуска одного тестового класса или тестового метода.
2. Введение в проблему
Плагин Maven surefire прост в использовании. У него только одна цель: проверить
.
Поэтому при конфигурации по умолчанию мы можем выполнить все тесты в проекте командой: mvn test
.
Иногда нам может понадобиться выполнить один единственный тестовый класс или даже один тестовый метод.
В этом руководстве мы возьмем JUnit 5 в качестве примера поставщика тестирования, чтобы решить, как его достичь.
3. Пример проекта
Чтобы показать результаты теста более простым способом, давайте создадим пару простых тестовых классов:
class TheFirstUnitTest {
// declaring logger ...
@Test
void whenTestCase_thenPass() {
logger.info("Running a dummyTest");
}
}
class TheSecondUnitTest {
// declaring logger ...
@Test
void whenTestCase1_thenPrintTest1_1() {
logger.info("Running When Case1: test1_1");
}
@Test
void whenTestCase1_thenPrintTest1_2() {
logger.info("Running When Case1: test1_2");
}
@Test
void whenTestCase1_thenPrintTest1_3() {
logger.info("Running When Case1: test1_3");
}
@Test
void whenTestCase2_thenPrintTest2_1() {
logger.info("Running When Case2: test2_1");
}
}
В классе TheFirstUnitTest
у нас есть только один тестовый метод. Однако TheSecondUnitTest
содержит четыре метода тестирования. Все имена наших методов следуют шаблону « когда…тогда… ».
Для простоты мы заставили каждый тестовый метод выводить строку, указывающую, что этот метод вызывается.
Теперь, если мы запустим mvn test
, все тесты будут выполнены:
$ mvn test
...
[INFO] Scanning for projects...
...
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.foreach.runasingletest.TheSecondUnitTest
16:58:16.444 [main] INFO ...TheSecondUnitTest - Running When Case2: test2_1
16:58:16.448 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_1
16:58:16.449 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_2
16:58:16.450 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_3
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.065 s - in com.foreach.runasingletest.TheSecondUnitTest
[INFO] Running com.foreach.runasingletest.TheFirstUnitTest
16:58:16.453 [main] INFO ...TheFirstUnitTest - Running a dummyTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in com.foreach.runasingletest.TheFirstUnitTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
[INFO]
...
Итак, теперь давайте скажем Maven выполнять только указанные тесты.
4. Выполните один тестовый класс
Плагин Maven surefire предоставляет параметр « test
», который мы можем использовать для указания тестовых классов или методов, которые мы хотим выполнить.
Если мы хотим выполнить один тестовый класс, мы можем выполнить команду: mvn test -Dtest=”TestClassName”.
Например, мы можем передать -Dtest="TheFirstUnitTest"
в команду mvn
, чтобы выполнить только класс TheFirstUnitTest :
$ mvn test -Dtest="TheFirstUnitTest"
...
[INFO] Scanning for projects...
...
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.foreach.runasingletest.TheFirstUnitTest
17:10:35.351 [main] INFO com.foreach.runasingletest.TheFirstUnitTest - Running a dummyTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 s - in com.foreach.runasingletest.TheFirstUnitTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
...
Как видно из вывода, выполняется только тот тестовый класс, который мы передали параметру « test
».
5. Выполните один метод тестирования
Кроме того, мы можем попросить плагин Maven surefire выполнить один тестовый метод, передав -Dtest=”TestClassName#TestMethodName”
в команду mvn
.
Теперь давайте выполним метод whenTestCase2_thenPrintTest2_1()
в классе TheSecondUnitTest
:
$ mvn test -Dtest="TheSecondUnitTest#whenTestCase2_thenPrintTest2_1"
...
[INFO] Scanning for projects...
...
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.foreach.runasingletest.TheSecondUnitTest
17:22:07.063 [main] INFO ...TheSecondUnitTest - Running When Case2: test2_1
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 s - in com.foreach.runasingletest.TheSecondUnitTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
...
Как мы видим, на этот раз мы выполнили только указанный тестовый метод.
6. Подробнее о параметре теста
До сих пор мы показали, как выполнить один тестовый класс или тестовый метод, предоставив соответствующее значение параметра теста .
На самом деле, плагин Maven surefire позволяет нам устанавливать значение параметра теста
в разных форматах для гибкого выполнения тестов.
Далее мы покажем некоторые часто используемые форматы:
- Выполнить несколько тестовых классов по имени:
-Dtest="TestClassName1, TestClassName2, TestClassName3..."
- Выполнение нескольких тестовых классов по шаблону имени:
-Dtest="*ServiceUnitTest"
или-Dtest="The*UnitTest, Controller*Test"
- Укажите несколько методов тестирования по имени:
-Dtest="ClassName#method1+method2"
- Укажите несколько имен методов по шаблону имени:
-Dtest=”ClassName#whenSomethingHappens_*”
Наконец, давайте посмотрим еще один пример.
Допустим, мы хотим выполнить только все методы whenTestCase1…
в классе TheSecondUnitTest
.
Итак, следуя шаблону, о котором мы говорили выше, мы надеемся, что -Dtest=”TheSecondUnitTest#whenTestCase1*”
выполнит эту работу:
$ mvn test -Dtest="TheSecondUnitTest#whenTestCase1*"
...
[INFO] Scanning for projects...
...
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.foreach.runasingletest.TheSecondUnitTest
17:51:04.973 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_1
17:51:04.979 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_2
17:51:04.980 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_3
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 s - in com.foreach.runasingletest.TheSecondUnitTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
...
Да, как мы и ожидали, были выполнены только три метода тестирования, соответствующие указанному шаблону имени.
7. Заключение
Плагин Maven surefire предоставляет тестовый
параметр. Это дает нам большую гибкость в выборе тестов, которые мы хотим выполнить.
В этой статье мы обсудили некоторые часто используемые форматы значений тестового
параметра.
Кроме того, на примерах мы рассмотрели, как запускать только указанные тестовые классы или тестовые методы с помощью Maven.
Как всегда, код статьи можно найти на GitHub .