Surefire не собирает тесты Junit 5
Я написал простой тестовый метод с JUnit 5:
public class SimlpeTest {
@Test
@DisplayName("Some description")
void methodName() {
// Testing logic for subject under test
}
}
Но когда я запустил mvn test
, я получил:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running SimlpeTest
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
Как-то, surefire не узнал этот тестовый класс. Мой pom.xml
выглядит так:
<properties>
<java.version>1.8</java.version>
<junit.version>5.0.0-SNAPSHOT</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit5-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>snapshots-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
Любая идея, как сделать эту работу?
Ответы
Ответ 1
maven-surefire-plugin
, на сегодняшний день не имеет полной поддержки JUnit 5. Существует открытая проблема с добавлением этой поддержки в SUREFIRE-1206.
Таким образом, вам необходимо использовать настраиваемый поставщик. Команда JUnit уже разработана; из руководства , вам нужно добавить поставщика junit-platform-surefire-provider
и TestEngine
для нового API:
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<!-- latest version (2.20.1) does not work well with JUnit5 -->
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.0.3</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Также не забудьте объявить зависимость junit-jupiter-api
с областью test
:
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
Ответ 2
Обновление 2
Проблема была исправлена в плагине Maven Surefire v2.22.0
Новая версия доступна в Центральном репозитории Maven.
специалист
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</dependency>
Gradle
compile group: 'org.apache.maven.plugins', name: 'maven-surefire-plugin', version: '2.22.0'
Обновить
Как отметил Мариан, последняя версия JUnit 5 Platform Surefire Provider (1.2.0) поддерживает последнюю версию Maven Surefire Plugin (2.21.0):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
</plugin>
пример
pom.xml
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
TestScenario.java
package test;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class TestScenario {
@Test
@DisplayName("Test 2 + 2 = 4")
public void test() {
Assertions.assertEquals(4, 2 + 2);
}
}
Выход (mvn чистой установки)
...
[INFO] --- подключаемый модуль maven-surefire: 2.21.0: test (default-test) @test --- [INFO]
[ИНФОРМАЦИЯ] ----------------------------------------------- --------
[INFO] ТЕСТЫ
[ИНФОРМАЦИЯ] ----------------------------------------------- --------
[INFO] Запуск теста. Тестовый сценарий
[INFO] Выполнено тестов: 1, сбоев: 0, ошибок: 0, пропущено: 0, истекло время: 0,005 с - в тесте. Тестовый сценарий
[ИНФОРМАЦИЯ]
[INFO] Результаты:
[ИНФОРМАЦИЯ]
[INFO] Выполнено тестов: 1, сбоев: 0, ошибок: 0, пропущено: 0
...
Самый простой способ до сегодняшнего дня:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</plugin>
Ответ 3
Из документации JUnit 5:
Начиная с версии 2.22.0
, Maven Surefire предоставляет встроенную поддержку для выполнения тестов на платформе JUnit.
Кроме того, вы можете прочитать в документации по maven-surefire-plugin
:
Использование платформы JUnit 5
Чтобы начать работу с JUnit Platform, вам нужно добавить хотя бы одну реализацию TestEngine
в ваш проект. Например, если вы хотите написать тесты с Jupiter, добавьте тестовый артефакт junit-jupiter-engine
к зависимостям в POM
Так что этого достаточно для запуска тестов JUnit 5:
<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>
<groupId>davidxxx</groupId>
<artifactId>minimal-pom-junit5</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<junit-jupiter.version>5.2.0</junit-jupiter.version>
<!--optional below but good practice to specify our java version-->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit-jupiter.version}</version>
<scope>test</scope>
</dependency>
<!--optional below -->
<!-- add any JUnit extension you need such as -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit-jupiter.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</plugin>
</plugins>
</build>
</project>
В моем пространстве GitHub я добавил рабочий пример проекта maven, который вы можете просматривать/клонировать.
URL: https://github.com/ebundy/junit5-minimal-maven-project
Ответ 4
Я столкнулся с этой проблемой с JUnit5 и Maven, но также заметил, что, даже если только junit-jupiter-engine был добавлен как зависимость, тесты будут выполняться в одних проектах, а не в других, И я как бы вижу ту же картину в комментариях здесь: в комментарии @Alex выше вы можете видеть, что у него нет проблем, даже с более ранними версиями surefire/junit/platform.
Некоторое время почесав голову, я понял, что в тех проектах, где тесты не запускались, были те, в которых метод имен dit не содержал слово "тест". Хотя это не обязательно http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html
Другими словами:
только с
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
это
@Test
public void something() {
assertTrue(true);
}
НЕ будет запущен, тогда как
@Test
public void testSomething() {
assertTrue(true);
}
БУДЕТ бежать!
Эта проблема разворачивается как русская кукла...
Во всяком случае, +1 для @Mikhail Kholodkov, чей обновленный ответ исправляет все проблемы сразу!
Ответ 5
Просто чтобы дополнить, верный 2.22.0 + junit 5.2.0 + платформа 1.2.0 также работает. Прилагается рабочая пометка для вашего референса:
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jjhome.junit5</groupId>
<artifactId>junit5-hone</artifactId>
<packaging>jar</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>junit5-home</name>
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit5.version>5.2.0</junit5.version>
<platform.version>1.2.0</platform.version>
<surefire.version>2.22.0</surefire.version>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit5.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit5.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit5.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit5.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${platform.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>${platform.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire.version}</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>${platform.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit5.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
Ответ 6
В моем случае это произошло из-за TestNG в пути к классам (SUREFIRE-1527). В Groovy 2.5.5 POM появился модуль groovy-testng
.
Указанный вручную поставщик платформы тестирования (как описано в разделе https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html) решил проблему:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit-platform</artifactId>
<version>2.22.1</version>
</dependency>
Ответ 7
Существует открытая проблема для surefire 2.20
Он работает для меня с серфитом 2.19 + junit-platform- * 1.0.3
Ответ 8
У меня была аналогичная проблема, также вызывающая Surefire распознавание нулевых тестов.
Моя проблема оказалась связанной с следующим (из JUnit 5.1.0/maven):
Из-за утечки памяти в Surefire 2.20 и проблем, запущенных на Java 9, junit-platform-surefire-provider в настоящее время работает только с Surefire 2.19.1.
Я пытался использовать последние версии Surefire (2.21.0) и junit-platform-surefire-provider (1.1.0), и он не работал (ни в Java 8, ни в 9)
Переключение на Surefire 2.19.1 решило мою проблему.
В соответствии с эта проблема исправление будет включено в версию 1.2.0 junit-platform-surefire-provider (в настоящее время доступно как SNAPSHOT).
Ответ 9
Обновление maven-surefire-plugin:2.20
запускает тесты Junit5 без проблем.
Но я использую версию M6
на Junit5.
Ответ 10
Одна вещь, которую я заметил, что я смог заставить это работать:
- Присвоение имени моему тестовому классу
ClinicCalendarShould
не забирается maven - Присвоение имени моему тестовому классу
ClinicCalendarTest
забирается maven
Так что, если я не пропущу какую-то конфигурацию или параметр или что-то еще в плагине surefire, по умолчанию вам нужно назвать свои тестовые классы XXXTest.
Ответ 11
Я столкнулся с той же проблемой в августе 2019 года, о которой я спросил здесь: Maven молча не может найти тесты JUnit для запуска. Эти ответы привели меня в правильном направлении, но я обнаружил, что вы можете решить проблему еще более кратко. Я скопировал свое решение из примера проекта Maven JAnit5.
Начиная с JUnit 5.5.1 и maven-surefire-plugin
2.22.2 вам не нужно добавлять зависимость junit-platform-surefire-provider
. Достаточно указать эту одну зависимость и один плагин в вашем pom.xml
:
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.5.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>
</build>