Surefire не принимает тесты Junit 5

114

Я написал простой тестовый метод с 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
Прямо сейчас вам нужно использовать специальную реализацию плагина surefire. Посмотрите примеры команды junit здесь
jah
1
Вопрос основан на устаревшей версии, но этот ответ основан на текущей (по состоянию на декабрь 2016 года).
Николай
@Nicolai Спасибо за обновление ответа. В любом случае, я был бы признателен за ваше редактирование вопроса, если у вас будет время.
Али Дехгани
1
Эта ошибка больше не возникает. Этот вопрос охватывает наиболее вероятный случай невыполнения теста .
Николай
Убедитесь, что тестовые файлы находятся в нужном месте. По умолчанию test должен быть дочерним по отношению к main в папке src.
Джо

Ответы:

115

На 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>
Tunaki
источник
25
Стоит отметить, что на данный момент surefire 2.20.1 не работает с провайдером junit 5, поэтому использованная в образце версия 2.19.1 все еще актуальна, несмотря на прошедший год.
splatch
1
surefire 2.21.0 тоже не работает, придется
откатиться
@valodzka По мне, это работает с 2.21.0 и более новыми версиями плагина и junit5. См. Junit.org/junit5/docs/current/user-guide/…
Thirler
Проверено: maven-surefire-plugin v2.21.0отлично работает с junit-jupiter-engine v5.2.0и junit-platform-surefire-provider v1.2.0
povis
2
Эта конфигурация не сработает с Surefire 2.22.0 или выше. Вам нужно исключить Junit deps из конфигурации Surefire. Я написал об этом небольшой пост здесь - springframework.guru/…
Джон Томпсон
51

Обновление 2

Проблема исправлена ​​в плагине Maven Surefire v2.22.0.

Новая версия доступна в центральном репозитории Maven.

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 clean install)

...
[INFO] --- maven-surefire-plugin: 2.21.0 : test (default-test) @ test --- [INFO]
[INFO] -------------- -----------------------------------------
[ИНФОРМАЦИЯ] ИСПЫТАНИЯ
[ИНФОРМАЦИЯ] - -------------------------------------------------- ---
[INFO] Запуск теста.TestScenario [INFO] Выполненных
тестов: 1, сбоев: 0, ошибок: 0, пропущенных: 0, прошедшего времени: 0,005 с - в тесте.TestScenario
[INFO]
[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>
Михаил Холодков
источник
1
Это работает только из-за Test в имени класса. Переименуйте класс в ExampleScenario - он не будет обнаружен. (Surefire 2.22.0)
Алексей Виноградов
@AlexeiVinogradov Да. Это ожидаемое поведение. Дополнительная информация доступна здесь: stackoverflow.com/a/6178629/3523579
Михаил Холодков
bevare, версия движка junit и родительская версия с весенней загрузкой. Просто укажите зависимость junit-jupiter-engine: 5.1 не работает там, где работают более новые версии. В Spring boot все еще предварительно настроен JUnit4 <junit.version> 4.13.
Wooff
20

Из документации 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

davidxxx
источник
9

Я столкнулся с этой проблемой с JUnit5 и Maven, но также заметил, что даже если в качестве зависимости был добавлен только junit-jupiter-engine, тесты будут выполняться в одних проектах, а не в других. . И я как бы вижу тот же образец в комментариях здесь: в комментарии @Alex выше вы можете видеть, что у него нет никаких проблем, даже с более ранними версиями surefire / junit / platform.

Почесав голову некоторое время, я понял, что те проекты, в которых тесты не запускались, были теми, в которых имена методов тестирования не содержали слова «test». Хотя это не предусмотрено 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, обновленный ответ которого устраняет все проблемы сразу!

Fabien M
источник
У меня также только что возникла проблема с mvn 3.5.0, jdk 1.8.0_101, где в моем имени класса не было «Test», и тест не был выбран, это помогло мне это найти!
dann.dev
Да, действительно, вы должны соответствовать maven.apache.org/surefire/maven-surefire-plugin/examples/… Но я говорил о другом.
Fabien M
Да, оказалось, что у меня было две проблемы, первая заключалась в том, что я не помнил основные правила надежного тестирования maven. Второй не выполнял проект обновления Maven> для eclipse, чтобы поднять пусковую установку junit 5.
dann.dev
Хочу добавить, что класс и методы должны быть общедоступными.
Йонас Балаж,
6

В августе 2019 года я столкнулся с той же проблемой, о которой спрашивал здесь: Maven молча не может найти тесты JUnit для запуска . Эти ответы привели меня в правильном направлении, но я обнаружил, что вы можете решить проблему еще более кратко. Я скопировал свое решение из примера проекта Maven JUnit5 .

Начиная с JUnit 5.5.1 и maven-surefire-plugin2.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>
workerjoe
источник
Это правильный и лаконичный подход. Работает с OpenJDK 11 и JUnit 5.6.2.
серебро
5

В дополнение, также работает surefire 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>
schnell18
источник
Моя проблема заключалась в том, что у меня не было junit-vintage-engineзависимости, и все мои тесты были написаны для JUnit 4.
Марк,
у меня сработала комбинация указанных версий junit, platform и surefire. Спасибо !
CoderTR
4

В моем случае это было из-за 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>
Lu55
источник
Вы должны обернуть <dependency>в <dependencies>вашей выборке кода.
user1053510
1

У меня была аналогичная проблема, из-за которой 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).

Avandeursen
источник
1
Я пробовал снимки, и все работает (с Surefire 2.21.0). Надеюсь, он все еще будет работать на момент выпуска.
user7610
1

Одна вещь, которую я заметил, мне удалось заставить это работать:

  • Имя моего тестового класса ClinicCalendarShouldне подбирается maven
  • Имя моего тестового класса ClinicCalendarTestДЕЙСТВИТЕЛЬНО подбирается maven

Итак, если мне не хватает какой-либо конфигурации или параметра или чего-то еще в плагине surefire, по умолчанию вам нужно назвать свои тестовые классы XXXTest.

Jkilgrow
источник
0

Обновление до maven-surefire-plugin:2.20запускает тесты Junit5 без проблем.

Но использую M6версию на Junit5.

LazerBanana
источник
Не все так просто (по крайней мере, на данный момент). См. Руководство пользователя JUnit 5
FrVaBe 01
@FrVaBe странно, он отлично работает на моем с версией m6.
LazerBanana 01
2
Я устал surefire-2.20.1 + junit-5.0.2, и он не работал. Я также попробовал surefire-2.20.1 + junit-5.1.0-M6, и это не сработало
Эрик
0

В моем случае плагин surefire не получил правильную версию для jupiter-engine / api. И это было даже при запуске Maven 3.6.1 и surefireplugin версии 2.22.2!

Теперь моя конфигурация плагина surefire выглядит так:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>5.5.2</version>
                </dependency>
            </dependencies>
        </plugin>

        ...
    </plugins>
</pluginManagement>

Более того, мне пришлось форсировать эти версии:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-engine</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-commons</artifactId>
            <version>1.5.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Похоже, 5.5.2 была связана с неправильной версией платформы 1.3.2 вместо 1.5.2 в моем случае.

Все тесты JUnit5 теперь подобраны. Даже с 2.22.0 плагина surefire этого не произошло!

Надеюсь, это поможет...

кортик
источник
0

Я столкнулся с одной junit5и той же проблемой, и maven-surefireтесты терпели неудачу. Однако все junit4шло нормально. У меня сработала комбинация ниже, я не добавляю управление версиями. Используйте junit-bomдля управления зависимостями. С помощьюspring-boot 2.1.4

   <dependencyManagement>
    <dependencies>
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>5.6.1</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Обязательно обновитесь до последней версии eclipse

garg10май
источник