Surefire не збирає тестів на 5 червня


113

Я написав простий метод тестування з 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

Так чи інакше, тефтер не визнавав цього тестового класу. Моє 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
Зараз ви повинні використовувати спеціальну реалізацію плагіну-підтвердження. Ознайомтеся з прикладами команди джунітів тут
jah

1
Питання ґрунтується на застарілій версії, але ця відповідь ґрунтується на поточній (станом на грудень 2016 року).
Миколай

@Nicolai Дякую за оновлення відповіді. У будь-якому разі, я б вдячний вашій редакції, якщо у вас є час.
Алі Дехгані

1
Ця помилка більше не виникає. Найбільш вірогідний випадок відсутності виконання тесту висвітлюється цим питанням .
Миколай

Переконайтесь, що тестові файли знаходяться в потрібному місці. За замовчуванням тест повинен бути зрідженням основного в папці 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>

25
Варто зауважити, що на даний момент версійна версія 2.20.1 не працює з провайдером 5 липня, тому 2.19.1, використаний у вибірці, все ще діє, незважаючи на минулий рік.
сплеск

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 з конфігурації Surefire. Я написав короткий пост про це тут - springframework.guru/…
Джон Томпсон

51

Оновлення 2

Проблема була вирішена в Maven Surefire Plugin v2.22.0

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

Мейвен

<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.0</version>
</dependency>

Градле

compile group: 'org.apache.maven.plugins', name: 'maven-surefire-plugin', version: '2.22.0'

Оновлення

Як зазначав Мар'ян , остання версія платформи JUnit 5 Surefire Provider (1.2.0) підтримує останню версію плагіна Maven Surefire (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>



Приклад

пом.хмл

<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 --- [ІНФОРМАЦІЯ]
[ІНФОРМАЦІЯ] -------------- -----------------------------------------
[ІНФОРМАЦІЯ] ТЕСТИ
[ІНФОРМАЦІЯ] - -------------------------------------------------- ---
[ІНФОРМАЦІЯ] Запуск тесту.TestScenario [ІНФОРМАЦІЯ] Виконання
тестів: 1, Невдачі: 0, Помилки: 0, Пропущено: 0, Час минув: 0,005 с - в тесті.TestScenario
[ІНФОРМАЦІЯ]
[ІНФОРМАЦІЯ] Результати:
[ІНФО ]
[ІНФОРМАЦІЯ] Виконання тестів: 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
Це працює лише через тест на ім'я класу. Перейменуйте клас у ExampleScenario - він не буде виявлений. (Surefire 2.22.0)
Олексій Виноградов

@AlexeiVinogradov Так. Це очікувана поведінка. Більше інформації можна знайти тут: stackoverflow.com/a/6178629/3523579
Михайло Холодков

bevare, версія двигуна Джуніт проти батьківської версії весняного завантаження. Просто вкажіть залежність junit-jupiter-engine: 5.1 не працює там, де є новіші версії. Весняний завантажувач все ще попередньо налаштував JUnit4 <junit.version> 4.13.
Вуф

20

З документації JUnit 5 :

Починаючи з версії 2.22.0, Maven Surefire надає підтримку для виконання тестів на платформі JUnit.

Додатково ви можете прочитати в maven-surefire-pluginдокументації :

Використання платформи JUnit 5

Щоб розпочати роботу з платформою JUnit, вам потрібно додати принаймні одну TestEngineреалізацію до свого проекту. Наприклад, якщо ви хочете писати тести з Юпітером, додайте тестовий артефакт 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


9

Я зіткнувся з цим питанням з JUnit5 та Maven, але також зауважив, що, навіть якщо в залежність додадуть лише двигун junit-jupiter, тести будуть працювати на деяких проектах, а не на інших . І я якось бачу ту саму схему в коментарях тут: У коментарі @Alex вище ви можете бачити, що у нього немає жодних проблем, навіть із більш ранніми версіями surefire / junit / платформи.

Деякий час почухавши голову, я зрозумів, що ті проекти, де тести не запускалися, - це проекти, де назви методів тестів не містять слова "тест". Хоча 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 Холодкова, оновлена ​​відповідь виправляє всі питання одразу!


Я також щойно зазнав проблеми з mvn 3.5.0, jdk 1.8.0_101, де в моєму класі не було "Тесту", і тест не був підібраний, це допомогло мені знайти це!
dann.dev

Так, дійсно, ви повинні відповідати maven.apache.org/surefire/maven-surefire-plugin/examples/… Але я говорив про щось інше.
Фабієн М

Так, виявилося, що у мене були дві проблеми, перша не пам’ятала основних правил перевірки тестування Maven. Другий не робив проект оновлення Maven> для затемнення, щоб забрати пускову установку junit 5.
dann.dev

Я хотів би додати, що клас та методи повинні бути загальнодоступними.
Jónás Balázs

6

У серпні 2019 року я зіткнувся з тією ж проблемою, про яку я запитав тут: Мейвен мовчки не вдається знайти тести 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>

Це правильний і стислий підхід. Працює з OpenJDK 11 та JUnit 5.6.2.
срібло

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>

Моє питання полягало в тому, що я не junit-vintage-engineбув залежною, і всі мої тести були написані для 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>

Ви повинні обернути <dependency>в <dependencies>вашій вибірці коду.
користувач1053510


1

У мене була подібна проблема, яка також змусила Surefire розпізнавати нульові тести.

Моя проблема виявилася пов'язаною з наступним (із документації на JUnit 5.1.0 / maven ):

Через витік пам’яті в Surefire 2.20 та проблеми, що працюють на Java 9, постачальник junit-platform-surefire наразі працює лише з Surefire 2.19.1.

Я намагався використовувати останні версії Surefire (2.21.0) і junit-platform-surefire-провайдер (1.1.0), і це не спрацювало (ні в Java 8, ні в 9)

Перехід на Surefire 2.19.1 вирішив мою проблему.

Відповідно до цього випуску виправлення буде включено у версію 1.2.0 провайдера junit-platform-surefire (наразі доступний лише як SNAPSHOT).


1
Я спробував SNAPSHOT, і все працює (з Surefire 2.21.0). Сподіваємось, він все ще працює на момент випуску.
користувач7610

1

Одне, що я помітив, мені вдалося змусити його працювати:

  • Названня мого тестового класу ClinicCalendarShouldне отримує Maven
  • Названня мого тестового класу ClinicCalendarTestДОБАЄТЬСЯ забраний Maven

Отже, якщо я не пропускаю якусь конфігурацію чи параметр чи будь-що інше у плагіні surefire, за замовчуванням потрібно назвати свої тестові класи XXXTest.


0

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

Але я використовую M6версію на Junit5.


Не так просто (принаймні на даний момент). Дивіться посібник користувача JUnit 5
FrVaBe

@FrVaBe дивно, що це працює чудово на моїй версії m6.
LazerBanana

2
Я втомився surefire-2.20.1 + junit-5.0.2, і це не спрацювало. Я також спробував surefire-2.20.1 + junit-5.1.0-M6, і це не вийшло
Ерік

0

У моєму випадку плагін-версія не отримав правильної версії для jupiter-engine / api. І це було навіть за умови запуску Maven 3.6.1 und surefireplugin Версії 2.22.2!

Тепер моя конфігурація плагін-підтвердження виглядає так:

<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 плагіну надійної версії для мене це було не так!

Сподіваюся, що це допомагає ...


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.