2013-07-23 4 views
5

Со временем можно настроить maven surefire для выполнения тестов jUnit и тестов TestNG в одной сборке. Я не буду раскрывать причины, по которым я это делаю (хорошо, подсказка: testNG - это стандартная среда, но для некоторых фреймворков, таких как jnario, требуется jUnit).Как правильно выполнить maven surefire выполнить JUnit и TestNG?

Общий способ сделать это заключается в настройке безошибочный плагин следующим образом:

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

(taken from here)

Это работает очень хорошо, JUnit тесты и тесты TestNG получить казнены.

BUT - теперь я вижу, что testNG также пытается выполнить тесты jUnit (и, возможно, наоборот) - без успеха, конечно, потому что он не увидит ни одной из своих аннотаций, но похоже, - указывает тесты на «пройденный» ... в любом случае, некоторые средства отчетности не показывают теста в тестах jUnit, если я не комментирую вторую запись зависимостей.

Есть ли лучший способ настроить surefire, чтобы тесты из обеих фреймворков выполнялись ТОЛЬКО их тестовыми бегунами?

+0

Перекрестная ссылка на список Maven-Users-List: http: //maven.40175.n5.nabble.com/maven-surefire-selection-providers-td5764817.html –

ответ

1

Я не сделал это сам, но вы можете попробовать настроить два плагина maven-surefire и настроить одно из этих исполнений только для запуска тестов JUnit, а другое - для запуска тестов testNG. Чтобы различать тесты JUnit und testNG, вы должны либо ставить тесты в разных каталогах, либо использовать различаемую схему имен, и настраивать каждое из исполнений с подходящим inclusion and exclusion patterns.

В теории это должно работать :)

+0

Я не могу вытащить элемент '' в выполнение. Если бы я мог, тогда это действительно было бы * * решением, одно исполнение было ограничено jUnit, а другое - TestNG :( –

+0

Вы ошиблись. Я имел в виду как <зависимостей>, так и в исходном вопросе. configure включает в себя/исключает, что одно выполнение будет только набирать тесты JUnit, а другое будет найдено только тесты testNG. Таким образом, нежелательные тесты отфильтровываются с помощью surefire и не будут переданы в рамки тестирования. –

+1

Ах, да, Я тоже это пробовал (и это стало еще хуже) TestNG get активирован для всех исполнений, и сборка завершается с ошибкой, если одно исполнение не имеет теста для запуска (да, есть свойство ...) - похоже, что я нашел ошибку, кто-то из списка рассылки пользователей maven настоятельно рекомендовал мне [сообщить о проблеме] (https://jira.codehaus.org/browse/SUREFIRE-1019). +1 для ответа и помощи! –

4

была такая же проблема, как вы. Zero приводит к отчетам TestNG, но похоже, что тесты были выполнены. Наконец получить эту работу на два отдельных расстрелах maven-surefire-plugin

  1. Сначала удалите раздел dependencies из плагина.
    • в противном случае, если вы используете <testNGArtifactName> (и мы это нужно) тесты будут выполняться TestNG в любом случае, и потерпит неудачу на java.lang.NullPointerException
  2. Выпей разделение TestNG тестов и JUnit тестов. В нашем случае NG именах теста класса заканчивается TestNg
  3. исполнения пропуска по умолчанию
  4. определяет два <executions>, как показано ниже:
<plugin> 
    <!-- configured to work with JUnit and TestNg in same project separatelly --> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId>    
    <configuration> 
     <!-- whatever you need... --> 
     <!-- skip the default execution, we have separate for Ng and for JUnit --> 
     <skip>true</skip> 
    </configuration> 
    <executions> 
     <execution> 
      <id>TestNg-execution</id> 
      <phase>test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 
       <!-- overwrite skip from default config --> 
       <skip>false</skip> 
       <includes> 
        <include>%regex[.*TestNg.*]</include> 
       </includes> 
       <!-- used to skip JUnit profider --> 
       <junitArtifactName>dev:null</junitArtifactName> 
       <!-- to continue on next execution in case of failures here --> 
       <testFailureIgnore>true</testFailureIgnore> 
      </configuration> 
     </execution> 
     <execution> 
      <id>JUnit-execution</id> 
      <phase>test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 

       <skip>false</skip> 
       <!-- used to skip TestNg profider --> 
       <testNGArtifactName>dev:null</testNGArtifactName> 
       <excludes> 
        <exclude>%regex[.*TestNg.*]</exclude>        
       </excludes> 
      </configuration>      
     </execution> 
    </executions> 
</plugin> 

Протестирован:

<junit-version>4.11</junit-version> 
<maven-surefire-plugin-version>2.16</maven-surefire-plugin-version> 
<org.testng-version>6.8.7</org.testng-version> 

Данной конфигурация является опушкой идеи от:
Running TestNG-, JUnit3- and JUnit4-tests with Maven Surefire in one run,
your SUREFIRE bug report,
surefire plugin configuration

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

+0

Отличное решение! – bedrin

Смежные вопросы