Тесты выполняются в JUnit 4, но не в JUnit 5 - компилируется, но 0 тестов выполняется - PullRequest
0 голосов
/ 23 января 2019

Любой может легко воспроизвести эту проблему за пару минут.

Basic Maven quickstart проект

С IntelliJ 2018.3 и Maven 3.6.0 я создаю совершенно новый проект, используя Mavenархетип maven-archetype-quickstart версия 1.4.

enter image description here

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 Lifecycle.

enter image description here

Тестовые прогоны в JUnit 4

Как часть install, тесты запускаются.Этот quickstart архетип поставляется с одним тестом, который утверждает true.

enter image description here

Результаты отображаются на панели Run IntelliJ.

[INFO] Выполнение work.basil.example.AppTest

[INFO] Выполнено тестов: 1, сбоев: 0, ошибок: 0, пропущено: 0, истекло время: 0.026s - в work.basil.example.AppTest

Итак, я знаю, что тест выполнен.

JUnit 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 с - в работе. Basil.example.AppTest

Весь POM

Вот весь мой файл 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.

enter image description here

Другие версии JUnit 5

Я пробовал следующие версии в моей junit-jupiter-api зависимости:

  • 5.0.0-M1
  • 5.1.1
  • 5.3.0
  • 5.3.2
  • 5.4.0-M1

При каждой попытке я запускал Maven clean & install.Не лучше.Каждая из этих версий сообщила Tests run: 0.

Не вините maven-archetype-quickstart

Я обнаружил эту проблему в совершенно другом проекте, использующем совершенно другой архетип Maven.

Чтобы закрепить это некорректное поведение JUnit 5, я попробовал новый свежий проект, используя очень простой maven-archetype-quickstart.Я обнаружил то же самое поведение: все компилируется, тестовая система работает, но никакие тесты не выполняются под JUnit 5.

1 Ответ

0 голосов
/ 23 января 2019

ТЛ; др

Для JUnit 5 версии 5.4.0-M1 или новее укажите новый одиночный артефакт Maven junit-jupiter «Агрегатор» в вашем POM.

<!--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 , огурец , сценарий Drools, jqwik и больше, которые реализуют интерфейс TestEngine.

Очевидно, junit-jupiter-api артефакт - это только внешнее ярмо. Вы также должны указать одну или несколько TestEngine реализаций для фактического запуска тестов. Например, для запуска винтажных тестов JUnit 4 вам нужны реализации VintageTestEngine, или для запуска тестов JUNit 5 вам нужна реализация JupiterTestEngine.

Таким образом, для запуска тестов JUnit 5 необходимо указать реализацию JupiterTestEngine в POM Maven с артефактом junit-jupiter-engine.

См. Руководство по JUnit 5, в частности, раздел Настройка тестовых двигателей .

См. эту презентацию Марка Филиппа со схемой, показывающей JUnit 5 как платформу, имеющую (A) ядро ​​для инструментов IDE / build с (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>

Простое добавление этой зависимости к проекту, указанному в вашем Вопросе, приведет к запуску ваших тестов.

[ИНФО] Запуск work.basil.example.AppTest

[INFO] Выполнено тестов: 1, сбоев: 0, ошибок: 0, пропущено: 0, истекло время: 0,004 с - в работе.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 Jupiter (Aggregator) . Слово «агрегатор *», по-видимому, относится к нему, объединяющему некоторые из часто используемых артефактов 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>

imagejunit-jupiter adds eight libraries to your project, all you need to run JUnit 5 tests.">

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...