5

Maven не может найти тесты JUnit для запуска

13

У меня есть проект на Maven, который компилируется без проблем. Однако при запуске команды mvn test она не выполняет никаких тестов (в разделе TESTs выдает сообщение «There are no tests to run.»).

Я воспроизвел эту проблему с очень простым проектом, структуру которого я приведу ниже, а также выведу результаты выполнения с флагом -X.

Юнит-тесты работают без проблем из Eclipse (как с его стандартным пакетом JUnit, так и с jUnit.jar, загруженным через Maven). Кроме того, команда mvn test-compile корректно создает класс в директории test-classes. Я работаю на OSX 10.6.7 с Maven 3.0.2 и Java 1.6.0_24.

Вот структура директорий:

/my_program/pom.xml
/my_program/src/main/java/ClassUnderTest.java
/my_program/src/test/java/ClassUnderTestTests.java

pom.xml:

<?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>my_group</groupId>
    <artifactId>my_program</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>My Program</name>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

ClassUnderTest.java:

public class ClassUnderTest {

    public int functionUnderTest(int n) {
        return n;
    }

}

ClassUnderTestTests.java:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class ClassUnderTestTests {

    private ClassUnderTest o;

    @Before
    public void setUp() {
        o = new ClassUnderTest();
    }

    @Test
    public void testFunctionUnderTest_testCase1() {
        Assert.assertEquals(1, o.functionUnderTest(1));
    }

    @Test
    public void testFunctionUnderTest_testCase2() {
        Assert.assertEquals(2, o.functionUnderTest(2));
    }
}

Результат выполнения команды mvn -X test:

[DEBUG] Configuring mojo org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test ...
...
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
There are no tests to run.

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Не могу понять, почему Maven не находит и не запускает тесты. Буду благодарен за помощь!

5 ответ(ов)

1

ОБНОВЛЕНИЕ:

Как отметил @scottyseus в комментариях, начиная с Maven Surefire 2.22.0 достаточно просто добавить следующий код в ваш pom.xml:

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

При использовании JUnit 5 я столкнулся с аналогичной проблемой. Maven Surefire требует плагин для запуска тестов JUnit 5. Добавьте это в ваш pom.xml:

<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-M1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.2.0-M1</version>
        </dependency>
    </dependencies>
</plugin>

Источник: JUnit 5 User Guide

ОБНОВЛЕНИЕ 2021

junit-platform-surefire-provider, который изначально был разработан командой JUnit, был объявлен устаревшим в JUnit Platform 1.3 и прекращен в 1.4. Пожалуйста, используйте нативную поддержку Maven Surefire вместо этого.

1

Да, вы правы. В Java-проектах, использующих систему сборки, такую как Maven или Gradle, тестовые классы должны располагаться в каталоге src/test/java. Если вы поместите тесты в основной каталог src/main/java, система не распознает их как тестовые классы и не сможет выполнить соответствующие тесты.

Пример неправильной структуры:

/my_program/src/main/java/NotTest.java

Правильная структура должна выглядеть так:

/my_program/src/test/java/MyTest.java

Таким образом, убедитесь, что все ваши тестовые файлы находятся в правильной директории, чтобы они могли быть обнаружены и выполнены.

1

Одной из причин, по которой Maven может не находить тесты, является неправильное указание типа упаковки модуля.

В недавнем случае у пользователя в pom.xml было указано <packaging>pom</packaging>, и мои тесты никогда не запускались. Я изменил это на <packaging>jar</packaging>, и теперь всё работает корректно.

0

В вашем случае решение было в добавлении зависимости junit-vintage-engine, которая обеспечивает совместимость с более старыми версиями тестов JUnit и позволяет их запускать. Поскольку вы используете JUnit 5, добавление этого компонента решает проблему.

Вот как выглядит конфигурация зависимости в вашем pom.xml:

<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <scope>test</scope>
</dependency>

Эта зависимость позволит вам запускать старые тесты, написанные для JUnit 4, в среде JUnit 5, что может быть особенно полезно при миграции существующего проекта.

0

Также проверьте, чтобы директория с вашими тестовыми классами (например, src/test/java) соответствовала директории, указанной в свойстве <testSourceDirectory> в вашем pom.xml под секцией <build>. Мне потребовалось некоторое время, чтобы это выяснить.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь