Тесты выполняются в JUnit 4, но не в JUnit 5 - компиляция завершена, но 0 тестов выполнено
Любой может легко воспроизвести эту проблему за пару минут.
Basic Maven quickstart
проект
С IntelliJ 2018.3 и Maven 3.6.0 я создаю новый проект с использованием архетипа Maven maven-archetype-quickstart
версия 1.4.
Java 11
В файле POM нового проекта я изменяю свойства для maven.compiler.source
а также maven.compiler.target
с 1.7 по 11, для Java 11.0.2, которую я сейчас использую, Zulu от Azul Systems.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
На панели Maven IntelliJ я запускаю clean
а также install
События жизненного цикла.
Тестовые заезды в Юнит 4
Как часть install
Тесты запускаются. это quickstart
Архетип поставляется с одним тестом, который утверждает true
,
Результаты появляются в Run
панель IntelliJ.
[INFO] Запуск work.basil.example.AppTest
[INFO] Выполнено тестов: 1, сбоев: 0, ошибок: 0, пропущено: 0, истекло время: 0,026 с - в work.basil.example.AppTest
Итак, я знаю, что тест выполнен.
Юнит 5, а не 4
Это все хорошо. Теперь давайте перейдем к JUnit 5, чтобы увидеть проблему.
В POM я изменяю зависимость JUnit от этого:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
…к этому:
<dependencies>
<!--JUnit 5-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Импорт Юпитера (без винтажных испытаний)
Компилятор жалуется на мой AppTest.java
файл. Так что я меняю import
заявления там, чтобы использовать jupiter
пакеты. Я только хочу запускать тесты JUnit 5 в моем новом проекте greedfield, без необходимости в старых тестах JUnit 4. Таким образом, импорт изменяется от этого:
import static org.junit.Assert.assertTrue;
import org.junit.Test;
…к этому:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
Затем я выполняю Maven
> Lifecycle
> clean
& install
,
… И вуаля, проблема: наш тест не выполнен. Отчет видел в Run
панель IntelliJ:
[INFO] Запуск work.basil.example.AppTest
[INFO] Выполнено тестов: 0, сбоев: 0, ошибок: 0, пропущено: 0, истекло время: 0,003 с - в work.basil.example.AppTest
➥ Почему JUnit 5 не может выполнить тот же тест, который JUnit 4 успешно выполнил?
Обновить surefire
плагин
Я подозреваю, что плагин Maven Surefire необходимо обновить. Так в POM я меняю это:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
…к этому:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
Другая clean
& install
, Но не лучше, все еще проходит 0 тестов.
[INFO] Запуск work.basil.example.AppTest
[INFO] Выполнено тестов: 0, сбоев: 0, ошибок: 0, пропущено: 0, истекло время: 0,004 с - в work.basil.example.AppTest
Весь ПОМ
Вот весь мой файл POM.
<?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>
<groupId>work.basil.example</groupId>
<artifactId>tester</artifactId>
<version>1.0-SNAPSHOT</version>
<name>tester</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!--JUnit 5-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
JUnit библиотеки
После выполнения Maven clean
& install
появляются две библиотеки JUnit: junit-jupiter-api
а также junit-platform-commons
,
Другие версии JUnit 5
Я попробовал следующие версии в моем junit-jupiter-api
зависимость:
- 5.0.0-М1
- 5.1.1
- 5.3.0
- 5.3.2
- 5.4.0-М1
С каждой попытки я запускал Maven clean
& install
, Не лучше. Каждая из этих версий сообщила Tests run: 0
,
Не вините maven-archetype-quickstart
Я обнаружил эту проблему в совершенно другом проекте, использующем совершенно другой архетип Maven.
Чтобы закрепить это некорректное поведение JUnit 5, я попробовал новый свежий проект, используя очень простой maven-archetype-quickstart
, Я обнаружил то же самое поведение: все компилируется, тестовый жгут работает, но никакие тесты не выполняются в JUnit 5.
1 ответ
ТЛ; др
Для JUnit 5 версии 5.4.0-M1 или новее укажите новый одиночный артефакт Maven junit-jupiter
"Агрегатор" в вашем ПОМ.
<!--JUnit 5-->
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.4.0-M1</version>
</dependency>
Для более ранних версий укажите как минимум эти два артефакта: junit-jupiter-api
& junit-jupiter-engine
,
JUnit 5 поддерживает несколько фреймворков для тестирования
Из того, что я могу извлечь, JUnit 5 был перепроектирован, чтобы быть ярмом для нескольких платформ тестирования. Эти системы тестирования включают в себя "винтажные" тесты JUnit 4, новые тесты JUnit 5 (новый синтаксис для тестов, с новыми аннотациями и методами) и другие, такие как Specsy, Spek, Cucumber, Drools Scenario, jqwik и другие, которые реализуют TestEngine
интерфейс.
Видимо junit-jupiter-api
Артефакт - это только внешнее ярмо. Вы также должны указать один или несколько TestEngine
реализации для запуска тестов. Например, для запуска винтажных тестов JUnit 4 вам понадобится VintageTestEngine
реализации, или для запуска тестов JUNit 5 вам нужно JupiterTestEngine
реализация.
Таким образом, чтобы запустить тесты JUnit 5, вы должны указать JupiterTestEngine
реализация в вашем Maven POM с junit-jupiter-engine
артефакт.
См. Руководство по JUnit 5, в частности, раздел " Настройка тестовых систем".
Посмотрите эту презентацию Марка Филиппа с диаграммой, показывающей JUnit 5 в качестве платформы, имеющей (A) ядро для IDE/ инструменты сборки с (B) сменными средами написания тестов для программистов, создающих тесты.
junit-jupiter-engine
Как видно из этого примера, добавьте вторую зависимую от JUnit зависимость для JUNit Jupiter Engine. Документация для этого артефакта гласит просто: "Реализация тестового движка JUnit Jupiter, требуется только во время выполнения".
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
Простое добавление этой зависимости в проект, показанный в вашем Вопросе, приведет к запуску ваших тестов.
[INFO] Запуск work.basil.example.AppTest
[INFO] Выполнено тестов: 1, сбоев: 0, ошибок: 0, пропущено: 0, истекло время: 0,004 с - в work.basil.example.AppTest
junit-jupiter-params
В этом же примере показана и третья зависимость JUnit для JUnit Jupiter Params. Хотя этот пример не требуется для выполнения тестового примера, он может служить другим целям. По-видимому, связано с параметризованными тестами.
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
Всего получается 3 зависимости JUnit.
<!--JUnit 5-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
Ваш тот же POM-файл, теперь обновленный на все 3 из этих зависимостей JUnit.
<?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>
<groupId>work.basil.example</groupId>
<artifactId>tester</artifactId>
<version>1.0-SNAPSHOT</version>
<name>tester</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!--JUnit 5-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0-M1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
junit-jupiter
артефакт
Версия 5.4.0 JUnit 5 приносит новый артефакт Maven, junit-jupiter
под названием Юнит Юпитер (Агрегатор). Слово "агрегатор *", по-видимому, относится к нему, объединяющему некоторые из часто используемых артефактов JUnit 5 в Maven, для удобства программирования.
Добавление этого сингла dependency
в вашем POM вы получаете 8 библиотек в вашем проекте.
<!--JUnit 5-->
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.4.0-M1</version>
</dependency>