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

У меня есть программа maven, она отлично компилируется. Когда я запускаю mvn test, он не запускает никаких тестов (в заголовке TEST говорится There are no tests to run.).

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

Модульные тесты отлично работают с eclipse (оба с его стандартным пакетом junit и когда я вместо этого включаю junit.jar, загруженный maven). Также mvn test-compile правильно создает класс в тестовых классах. Я запускаю это на 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:

[DEBUG] Configuring mojo org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-surefire-plugin:2.7.1, parent: [email protected]]
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test' with basic configurator -->
[DEBUG]   (s) basedir = /Users/aaron/Programs/my_program
[DEBUG]   (s) childDelegation = false
[DEBUG]   (s) classesDirectory = /Users/aaron/Programs/my_program/target/classes
[DEBUG]   (s) disableXmlReport = false
[DEBUG]   (s) enableAssertions = true
[DEBUG]   (s) forkMode = once
[DEBUG]   (s) junitArtifactName = junit:junit
[DEBUG]   (s) localRepository =        id: local
      url: file:///Users/aaron/.m2/repository/
   layout: none

[DEBUG]   (f) parallelMavenExecution = false
[DEBUG]   (s) pluginArtifactMap = {org.apache.maven.plugins:maven-surefire-plugin=org.apache.maven.plugins:maven-surefire-plugin:maven-plugin:2.7.1:, org.apache.maven.surefire:surefire-booter=org.apache.maven.surefire:surefire-booter:jar:2.7.1:compile, org.apache.maven.surefire:surefire-api=org.apache.maven.surefire:surefire-api:jar:2.7.1:compile, org.apache.maven.surefire:maven-surefire-common=org.apache.maven.surefire:maven-surefire-common:jar:2.7.1:compile, org.apache.maven.shared:maven-common-artifact-filters=org.apache.maven.shared:maven-common-artifact-filters:jar:1.3:compile, org.codehaus.plexus:plexus-utils=org.codehaus.plexus:plexus-utils:jar:2.0.5:compile, junit:junit=junit:junit:jar:3.8.1:compile, org.apache.maven.reporting:maven-reporting-api=org.apache.maven.reporting:maven-reporting-api:jar:2.0.9:compile}
[DEBUG]   (s) printSummary = true
[DEBUG]   (s) project = MavenProject: my_group:my_program:1.0-SNAPSHOT @ /Users/aaron/Programs/my_program/pom.xml
[DEBUG]   (s) projectArtifactMap = {junit:junit=junit:junit:jar:4.8.1:test}
[DEBUG]   (s) redirectTestOutputToFile = false
[DEBUG]   (s) remoteRepositories = [       id: central
      url: http://repo1.maven.org/maven2
   layout: default
snapshots: [enabled => false, update => daily]
 releases: [enabled => true, update => never]
]
[DEBUG]   (s) reportFormat = brief
[DEBUG]   (s) reportsDirectory = /Users/aaron/Programs/my_program/target/surefire-reports
[DEBUG]   (s) session = [email protected]
[DEBUG]   (s) skip = false
[DEBUG]   (s) skipTests = false
[DEBUG]   (s) testClassesDirectory = /Users/aaron/Programs/my_program/target/test-classes
[DEBUG]   (s) testFailureIgnore = false
[DEBUG]   (s) testNGArtifactName = org.testng:testng
[DEBUG]   (s) testSourceDirectory = /Users/aaron/Programs/my_program/src/test/java
[DEBUG]   (s) trimStackTrace = true
[DEBUG]   (s) useFile = true
[DEBUG]   (s) useManifestOnlyJar = true
[DEBUG]   (s) workingDirectory = /Users/aaron/Programs/my_program
[DEBUG] -- end configuration --
[INFO] Surefire report directory: /Users/aaron/Programs/my_program/target/surefire-reports
[DEBUG] Setting system property [user.dir]=[/Users/aaron/Programs/my_program]
[DEBUG] Setting system property [localRepository]=[/Users/aaron/.m2/repository]
[DEBUG] Setting system property [basedir]=[/Users/aaron/Programs/my_program]
[DEBUG] Using JVM: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.7.1:compile (selected for compile)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.7.1:compile (selected for compile)
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-booter/2.7.1/surefire-booter-2.7.1.jar Scope: compile
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: compile
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-junit4:jar:2.7.1:test (selected for test)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.7.1:test (selected for test)
[DEBUG] Adding to surefire test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-junit4/2.7.1/surefire-junit4-2.7.1.jar Scope: test
[DEBUG] Adding to surefire test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: test
[DEBUG] Test Classpath :
[DEBUG]   /Users/aaron/Programs/my_program/target/test-classes
[DEBUG]   /Users/aaron/Programs/my_program/target/classes
[DEBUG]   /Users/aaron/.m2/repository/junit/junit/4.8.1/junit-4.8.1.jar
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.7.1:compile (selected for compile)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.7.1:compile (selected for compile)
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-booter/2.7.1/surefire-booter-2.7.1.jar Scope: compile
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: compile
Forking command line: /bin/sh -c cd /Users/aaron/Programs/my_program && /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -jar /Users/aaron/Programs/my_program/target/surefire/surefirebooter6118081963679415631.jar /Users/aaron/Programs/my_program/target/surefire/surefire4887918564882595612tmp /Users/aaron/Programs/my_program/target/surefire/surefire9012255138269731406tmp

-------------------------------------------------------
 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] ------------------------------------------------------------------------
[INFO] Total time: 2.089s
[INFO] Finished at: Mon May 30 12:03:09 EDT 2011
[INFO] Final Memory: 7M/62M
[INFO] ------------------------------------------------------------------------

Ответ 1

По умолчанию Maven использует следующие соглашения об именах при поиске тестов:

  • Test*
  • *Test
  • *TestCase

Ваш тестовый класс не соответствует этим соглашениям. Вы должны переименовать его или настроить плагин Maven Surefire для использования другого шаблона для тестовых классов.

Ответ 2

Я также обнаружил, что код unit test должен помещаться в тестовую папку, он не может быть признан тестовым классом, если вы поместите его в основную папку. например.

Wrong

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

Right

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

Ответ 3

Еще одна вещь, которая может привести к тому, что Maven не сможет найти тесты, если упаковка пакета не будет объявлена ​​правильно.

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

Ответ 4

ОБНОВИТЬ:

Как сказал @scottyseus в комментариях, начиная с Maven Surefire 2.22.0, достаточно следующего:

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

Источник: https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven.

Ответ 5

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

Ответ 6

Maven не будет запускать ваши тесты, если проект имеет <packaging>pom</packaging>

Вам нужно установить упаковку в jar (или какой-либо другой тип артефакта java) для запуска тестов: <packaging>jar</packaging>

Ответ 7

Проверьте, что (для jUnit - 4.12 и Eclipse surefire plugin)

  • Добавить требуемую версию jUnit в POM.xml в зависимостях. Сделайте Maven → Обновить проект, чтобы увидеть необходимые банки, экспортированные в проект.
  • Тест-класс находится под папкой src/test/java и подкаталогами этой папки (или базовая папка может быть указана в POM в config testSourceDirectory). Имя класса должно иметь хвостовое слово "Test".
  • Метод тестирования в тестовом классе должен содержать аннотацию @Test

Ответ 8

Обнаружено, если вы префикс теста с помощью "Абстрактного", он также будет проигнорирован.

Ответ 9

Если у вас есть общее приложение Java/ Groovy, и все, что у вас есть, это Groovy unit tests, то Maven не найдет никаких тестов. Это можно устранить, добавив один unit test в src/test/java.

Ответ 10

У меня также была аналогичная проблема, после изучения выяснилось, что зависимость testng вызывает эту проблему. После удаления зависимости testng от pom (как мне больше не нужно), он начал работать отлично для меня.

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.8</version>
        <scope>test</scope>
    </dependency>

Ответ 11

Многие из этих ответов были довольно полезны для меня в прошлом, но я хотел бы добавить дополнительный сценарий, который стоил мне времени, так как он может помочь другим в будущем:

Убедитесь, что тестовые классы и методы общедоступны.

Моя проблема заключалась в том, что я использовал функцию автоматической генерации тестовых классов/методов в моей IDE (IntelliJ) и по какой-то причине он создал их как закрытые для пакета. Я считаю, что это легче пропустить, чем можно было бы ожидать.

Ответ 12

/my_program/src/test/java/ClassUnderTestTests.java

должно быть

/my_program/src/test/java/ClassUnderTestTest.java

Maven находит эти концы Test или запускается с Test для автоматического запуска.

Тем не менее, вы можете использовать

mvn surefire:test -Dtest=ClassUnderTestTests.java 

запустить ваши тесты.

Ответ 13

Если имя вашего класса теста не соответствует стандартному соглашению об именах (как выделено @axtavt выше), вам нужно добавить имя шаблона/класса в pom.xml, чтобы Maven выбрал тест -

...
<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>**/*_UT.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build> 
...

Ответ 14

Другая причина не запускать тестовые примеры со мной - у меня было свойство с именем "test" для совершенно разных целей, но это мешало плану surefire. Таким образом, проверьте свои POM для:

<properties>
  <test>.... </test>
  ...
</properties>

и удалите его.

Ответ 15

Еще один совет (в дополнение к предыдущим ответам):

В Eclipse перейдите в Свойства вашего проекта> нажмите " Run/Debug Settings:

"Эта страница позволяет вам управлять конфигурациями запуска с текущим выбранным ресурсом"

Там вы можете добавить (Новый...) или удалить (Удалить) любые тесты JU (JUnit), которые есть в вашем проекте (в папке src/test/java или в курсе).

Ответ 16

Вот точный код, который мне пришлось добавить в мой pom.xml:

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

И вот мои зависимости:

    <dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.easytesting</groupId>
        <artifactId>fest-assert-core</artifactId>
        <version>2.0M10</version>
        <scope>test</scope>
    </dependency>
    <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>

Ответ 17

Если вы написали свои тесты в JUnit 4 и добавили зависимости JUnit 5 в плагин surefire, ваши тесты не будут выполняться.

В этом случае просто прокомментируйте зависимости JUnit 5 от плагина surefire:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <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.0.0</version>-->
                <!--</dependency>-->
                <!--<dependency>-->
                    <!--<groupId>org.junit.jupiter</groupId>-->
                    <!--<artifactId>junit-jupiter-engine</artifactId>-->
                    <!--<version>${junit.version}</version>-->
                <!--</dependency>-->
            <!--</dependencies>-->
        </plugin>

Ответ 18

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

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

Ответ 19

Я столкнулся с той же проблемой, она решена с помощью изменения ниже в pom.xml:

<build>
    <testSourceDirectory>test</testSourceDirectory>

...

изменился на:

<build>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>

Ответ 20

junitArtifactName может также иметь место, если используемый JUnit не является стандартным (junit:junit), но, например...

<dependency>
    <groupId>org.eclipse.orbit</groupId>
    <artifactId>org.junit</artifactId>
    <version>4.11.0</version>
    <type>bundle</type>
    <scope>test</scope>
</dependency>

Ответ 21

Если кто-то искал, а я не решил, у меня была библиотека для разных тестов:

<dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${org.junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>

Когда я установил junit, все заработало, я надеюсь и помогу этому:

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>

Ответ 22

я использовал, используя этот код

<sourceDirectory>src_controller</sourceDirectory>
  <testSourceDirectory>src_test</testSourceDirectory>

на мой pom.xml, просто убедитесь, что testng файл в конкретном там

<suiteXmlFile>/Users/mac/xxx/xxx/xx.xxxx.xx/xxx.restassured.xx/testng.xml</suiteXmlFile>

Ответ 23

Такая проблема может возникнуть при использовании surfire плагина 3.x. x+ с JUnit5 и по ошибке аннотировать тестовый класс с @Test аннотацией из JUnit4.

Используйте org.junit.jupiter.api.Test (JUnit5) вместо org.junit.Test (Junit4)

ПРИМЕЧАНИЕ: это может быть трудно заметить, так как IDE может запускать эту проблему без проблем, как тест JUnit4.

Ответ 24

Следующее сработало просто отлично для меня в Junit 5

https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.0</version>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.22.0</version>
        </plugin>
    </plugins>
</build>
<!-- ... -->
<dependencies>
    <!-- ... -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.4.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.4.0</version>
        <scope>test</scope>
    </dependency>
    <!-- ... -->
</dependencies>
<!-- ... -->

Ответ 25

Еще одна легко пропускаемая проблема - убедитесь, что файл вашего класса имеет расширение .java

Ответ 26

В моем случае мы переносим мультимодульное приложение на Spring Boot. К сожалению, maven не выполнил все тесты в модулях. Наименование тестовых классов не изменилось, мы соблюдаем соглашения об именах.

В конце это помогло, когда я добавил зависимость surefire-junit47 в плагин maven-surefire-plugin. Но я не мог объяснить, почему, это было методом проб и ошибок:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<dependencies>
  <dependency>
    <groupId>org.apache.maven.surefire</groupId>
    <artifactId>surefire-junit47</artifactId>
    <version>${maven-surefire-plugin.version}</version>
  </dependency>
</dependencies>