2013-07-23 6 views
5

Da un po 'di tempo è possibile configurare maven surefire per eseguire i test jUnit e testNG in una build. Non mi dilungherò sui motivi per cui lo sto facendo (ok, suggerimento: testNG è il nostro framework standard ma alcuni framework come jnario richiedono jUnit).Come fare in modo che maven surefire esegua correttamente JUnit e TestNG?

Il modo generale per farlo è quello di configurare il plugin infallibile in questo modo:

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

Questo funziona abbastanza bene, i test JUnit e test TestNG vengono eseguiti.

MA ora vedo che testNG tenta di eseguire anche i test di jUnit (e forse viceversa) senza successo, ovviamente, perché non vedrà nessuna delle sue annotazioni, ma sembra che sia -segna i test a "passati" ... comunque, alcuni strumenti di reporting non mostrano più test falliti nei test di jUnit a meno che non commento la seconda voce di dipendenza.

Esiste un modo migliore per configurare surefire in modo che i test di entrambi i framework vengano eseguiti SOLO dai test runner?

+0

Attraversato nella lista utenti Maven: http: //maven.40175.n5.nabble.com/maven-surefire-selection-providers-td5764817.html –

risposta

1

Non l'ho fatto da solo, ma è possibile provare a configurare due different executions del plugin maven-surefire e configurare una di queste esecuzioni per eseguire solo i test JUnit e l'altro per eseguire solo testNG test. Per distinguere tra i test JUnit und testNG, è necessario inserire i test in diverse directory o utilizzare uno schema di nomi distinguibile e configurare ciascuna delle esecuzioni con l'opportuno inclusion and exclusion patterns.

In teoria questo dovrebbe funzionare :)

+0

Non riesco a tirare l'elemento '' nell'esecuzione. Se potessi, sarebbe davvero la * soluzione *, un'esecuzione limitata a jUnit, l'altra a TestNG :( –

+0

Mi hai sbagliato. Volevo avere entrambe le come nella domanda originale. Configurare diversi include/esclude, che un'esecuzione avrebbe trovato solo i test JUnit e l'altro avrebbe trovato solo testNG.Questo modo i test indesiderati sono filtrati da surefire e non saranno passati ai framework di test –

+1

Ah. Sì, Ho provato anche questo (ed è andata ancora peggio) TestNG get è stato attivato per tutte le esecuzioni e la compilazione fallisce se una esecuzione non ha test da eseguire (sì, c'è una proprietà ...) - sembra che ho trovato un bug, qualcuno dalla mailing list degli utenti esperti mi ha fortemente incoraggiato a [segnalare un problema] (https://jira.codehaus.org/browse/SUREFIRE-1019). +1 per la risposta e l'aiuto! –

4

Aveva lo stesso problema di te. Zero risultati nei rapporti TestNG ma sembra che i test siano stati eseguiti. finalmente questo lavoro su due esecuzioni separate di maven-surefire-plugin

  1. Prima rimuovere la sezione dependencies dal plugin.
    • altrimenti se si utilizza <testNGArtifactName> (e ti bisogno) test saranno eseguiti da TestNG comunque e avrà esito negativo su java.lang.NullPointerException
  2. avere una certa separazione dei test TestNG e test JUnit. Nei nostri nomi classe test case NG termina con TestNg
  3. esecuzione salto predefinito
  4. definiscono due <executions> come di seguito:
<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> 

testati con:

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

Questa configurazione è la marge di spunto da:
Running TestNG-, JUnit3- and JUnit4-tests with Maven Surefire in one run,
your SUREFIRE bug report,
surefire plugin configuration

Speranza che aiuta.

+0

Soluzione eccellente! – bedrin