Surefire не принимает тесты Junit 4 - PullRequest
35 голосов
/ 07 января 2010

По некоторым причинам я не могу заставить плагин 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
  • сделал mvn dependency:tree | grep junit, чтобы убедиться, что я зависел только от версии 4.7

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

Что-то еще мне не хватает?

Ответы [ 11 ]

30 голосов
/ 08 января 2010

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 помог мне встать на правильный путь, поэтому правильные баллы ответа идут к нему.

21 голосов
/ 06 апреля 2011

Плагин 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 изменил способ определения классов юнит-тестазапускаются. Новое поведение при использовании Surefire 2.7 (или более поздней) с JUnit 4 заключается в том, что любой тест без аннотации @Test будет пропущен автоматически. Это может быть здорово, если у вас просто JUnit 4модульные тесты, но если у вас есть комбинация модульных тестов 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>
[...]
12 голосов
/ 07 января 2010

Я не знаю, что вы подразумеваете под "не может быть выполнен", но помогает ли это явно установить включения, используемые 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 какую-либо полезную информацию?

9 голосов
/ 04 июля 2013

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

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

4 голосов
/ 05 сентября 2016

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

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

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

Позже я столкнулся с этой проблемой Maven и настроил верный запуск только для тестов "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>

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

4 голосов
/ 03 августа 2011

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

Я использовал вкладку 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 напрямую, если он поступает откуда-то еще.)

1 голос
/ 10 мая 2017

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

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

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

Итак, перейдите в Build Path и включите тестовую папку в classpath, как показано ниже:

enter image description here enter image description here

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
1 голос
/ 21 февраля 2014

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

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

<test.include.pattern> **/Test*.java <test.include.pattern/>
1 голос
/ 07 января 2010

Проверка, которую вы сделали, хороша, особенно проверяя, используете ли вы плагин surefire версии 2.3+ (по умолчанию вы получите версию 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 (из-за проблем в проекте)?

0 голосов
/ 19 мая 2017

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

...