Подтвердить что ты не робот

Surefire не подбирает тесты Junit 4

По какой-то причине я не могу получить плагин Maven 2 Surefire для выполнения тестового класса JUnit 4.

public class SimpleTest {
  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

Однако, если я изменю этот класс на JUnit-3, например,

public class SimpleTest extends junit.framework.TestCase {
  public void testBar() {
     System.out.println("bar");
  }

  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

то он выполняется. Вот что я сделал:

  • проверенная версия Maven: Apache Maven 2.2.1 (r801777; 2009-08-06 20: 16: 01 + 0100)
  • проверенная версия Surefire: после этот совет
  • проверенная версия Surefire: проверены банки Surefire в моем ~/.m2/repository/org/apache/maven/surefire - все они либо версии 2.4.2, либо 2.4.3
  • выполнил a mvn dependency:tree | grep junit, чтобы я зависел только от junit версии 4.7

В модуле, с которым у меня возникает эта проблема, нет тестов JUnit 3.

Есть ли что-то еще, что мне не хватает?

4b9b3361

Ответ 1

mvn -X помог мне выявить следующее:

...
[INFO] [surefire:test {execution: default-test}]
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3:runtime (selected for runtime)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:runtime (selected for runtime)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.testng:testng:jar:jdk15:5.8:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/testng/testng/5.8/testng-5.8-jdk15.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG] Retrieving parent-POM: org.apache.maven.surefire:surefire-providers:pom:2.4.3 for project: null:surefire-testng:jar:null from the repository.
[DEBUG] Adding managed dependencies for unknown:surefire-testng
[DEBUG]   org.apache.maven.surefire:surefire-api:jar:2.4.3
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3
[DEBUG]   org.codehaus.plexus:plexus-utils:jar:1.5.1
[DEBUG]   org.apache.maven.surefire:surefire-testng:jar:2.4.3:test (selected for test)
[DEBUG]     org.apache.maven:maven-artifact:jar:2.0:test (selected for test)
[DEBUG]       org.codehaus.plexus:plexus-utils:jar:1.0.4:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG]     org.testng:testng:jar:jdk15:5.7:test (selected for test)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:test (selected for test)
...
[DEBUG] Test Classpath :
...
[DEBUG]   /home/mindas/.m2/repository/junit/junit/4.7/junit-4.7.jar

Итак, кажется, что проблема исходила из testng jar, требующего JUnit v3.8.1. Несмотря на то, что Test Classpath было настроено на зависимость от JUnit 4, было уже слишком поздно.

testng зависимость находилась в моем POM:

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>5.8</version>
  <scope>test</scope>
  <classifier>jdk15</classifier>
</dependency>

Сразу после того, как я прокомментировал это, тесты начали выполняться.

Извлеченные уроки:

  • mvn dependency:tree не всегда достаточно, mvn -X является другом.
  • уверенность не создана для разработчиков небес (я это понял, глядя на отчеты JIRA проекта). Это особенно верно, поскольку нет других альтернатив, если вы используете Maven.

Спасибо всем за вашу помощь. К сожалению, нет возможности разделить точки ответа между Паскалем и Калебом, но совет Калеба использовать mvn -X помог мне подняться по правильному пути, так что правильные точки ответа пойдут к нему.

Ответ 2

Плагин Surefire определяет, какой поставщик JUnit следует использовать на основе пути к классам. Если в пути к классам имеется несколько версий JUnit, вы можете либо исправить путь к классам, чтобы иметь только одну версию JUnit в пути к классам (как описано выше), либо вы можете явно указать, какой поставщик вы хотите использовать. Например, указывая следующее в ваших (родительских) POM-силах с использованием новейшего поставщика (например, "surefire-junit47" ):

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <!-- Force using the latest JUnit 47 provider -->
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <artifactId>surefire-junit47</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

Обратите внимание, однако, что Surefire 2.7 изменил способ определения того, какие классы unit test запускаются. Новое поведение при использовании Surefire 2.7 (или более поздней версии) с JUnit 4 заключается в том, что любой тест без аннотации @Test будет пропущен автоматически. Это может быть здорово, если у вас только JUnit 4 unit tests, но если у вас есть комбинация JUnit 3 и 4 модульных тестов, использование провайдера "surefire-junit47" будет работать неправильно. В таких случаях лучше всего выбрать поставщика "surefire-junit4":

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <!-- Use the older JUnit 4 provider -->
      <artifactId>surefire-junit4</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

Ответ 3

Я не знаю, что вы подразумеваете под "не может выполнить", но помогает ли он явно устанавливать значения, используемые maven-surefire-plugin?

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.4.3</version>
    <configuration>
        <includes>
            <include>**/*Test.java</include>
        </includes>
    </configuration>
</plugin>

Также выполняется ли запуск maven с флагом -X любой полезной информацией?

Ответ 4

Еще одной возможной причиной может быть эта ошибка (закрыта с помощью "Не исправить" ): https://issues.apache.org/jira/browse/SUREFIRE-587

Краткий обзор: тесты, расширяющие TestCase (но не используя аннотации), не будут подхвачены, если их имя не заканчивается "Тест".

Ответ 5

В интересах Googlers, когда у меня была эта проблема, это было потому, что я включил зависимость PowerMock, которая вытащила TestNG, в результате чего тесты [TestNG] не были обнаружены SureFire.

Я использовал вкладку "Иерархия зависимостей" m2eclipse в редакторе POM, чтобы найти зависимость и щелкнуть правой кнопкой мыши, чтобы сгенерировать исключение (см. XML ниже).

Для полноты (и для тех, кто не использует m2eclipse) здесь XML, который исключает зависимость - я натолкнулся на эту функцию Maven, увидев автоматически созданные эти теги:

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-mockito-release-full</artifactId>
  <version>1.4.9</version>
  <classifier>full</classifier>
  <exclusions>
    <exclusion>
      <artifactId>powermock-module-testng</artifactId>
      <groupId>org.powermock</groupId>
    </exclusion>
  </exclusions>
</dependency>

(В моем случае исключить "powermock-module-testng" было достаточно, но вы могли бы исключить TestNG напрямую, если он пришел откуда-то еще.)

Ответ 6

Для какой-то бедной души, которая задается вопросом, почему Maven не подбирает тесты JUnit.

У меня есть как JUnit, так и TestNG как dependecies. Но я хочу, чтобы отказоустойчивость выполняла мои функциональные тесты с помощью TestNG и surefire для запуска моих модульных тестов с использованием JUnit.

Однако я обнаружил, что surefire пытался запустить мои модульные тесты с помощью TestNG и не нашел ничего для запуска. Мои тесты JUnit были пропущены.

Позже я наткнулся на эту проблему Maven и настроил surefire для запуска только тестов "JUnit" следующим образом:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <properties>
      <property>
        <name>junit</name>
        <value>true</value>
      </property>
    </properties>
  </configuration>
</plugin>

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

Ответ 7

Проверка, которую вы сделали, хороша, особенно проверяя, что вы используете версию 2.3+ плагина surefire (по умолчанию вы получите версию 2.4.3 с maven 2.1 super POM, так что это должно быть нормально) и проверка того, что вы не тянете зависимость junit-3.8.1.jar транзитивно.

Теперь, только чтобы проверить, что это не "глобальная проблема" (я не думаю, что это TBH), вы могли бы создать проект с нуля, например, выполнив:

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=maven-junit4-testcase

Затем обновите зависимость junit:

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

И настройте уровень компилятора на 1,5 +

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

Наконец, поставьте SimpleTest.java рядом с AppTest.java и запустите mvn test.

Если запуск mvn test отлично работает для этого проекта (и я ожидаю, что он запустится без проблем), не могли бы вы обновить свой вопрос с помощью конфигурации POM, которую вы используете (из проблем, связанных с проектом)?

Ответ 8

Одно небольшое изменение помогло мне Смешно!!!

Я изменил имя класса из MyClassTest на TestMyClass, Я получил эту идею после того, как мой родительский POM.xml содержит ниже строки

<test.include.pattern> **/Test*.java <test.include.pattern/>

Ответ 9

1.) Включите следующий плагин surefire в pom.xml

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

2.) По умолчанию плагин surefire выбирает тестовый класс из пакета: - src/test/java/....

Итак, перейдите в "Путь сборки" и включите тестовую папку в пути к классам, как показано ниже:

введите описание изображения здесь введите описание изображения здесь

3.) Перейти к → Запустить как → Тест Maven

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.081 
s - in com.bnym.dcm.api.controller.AccountControllerTest
[INFO] Running com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - 
in com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ----------------------------------------------------------------------
--
[INFO] BUILD SUCCESS

Ответ 10

Вы настроили свой maven-compile-plugin для правильного уровня компилятора, например:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
<plugin>

В противном случае у maven будут проблемы с аннотациями

Ответ 11

При попытке выполнить интеграционные тесты возникла аналогичная проблема. У меня была старая версия плагина surefire, который пытался запустить TestNG, а не jUnit. Я изменил номер версии в pom до 2.20, и это сработало.