2013-07-23 12 views
5

Seit einiger Zeit ist es maven todsichere möglich, jUnit Tests und testNG Tests in einem Build auszuführen. Ich werde die Gründe, warum ich das mache, nicht weiter ausführen (ok, Tipp: testNG ist unser Standard-Framework, aber einige Frameworks wie jnario erfordern jUnit).Wie kann maven todsichere JUnit und TestNG Tests richtig ausführen?

Die allgemeine Art und Weise, es zu tun ist, um die todsichere Plugin wie folgt zu konfigurieren:

JUnit-Tests und TestNG Tests ausgeführt Das funktioniert ganz gut, erhalten
<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)

.

ABER - jetzt sehe ich, dass testNG versucht, auch die jUnit-Tests auszuführen (und vielleicht umgekehrt) - natürlich ohne Erfolg, weil es keine seiner Anmerkungen sehen wird, aber es sieht so aus -markiert die Tests auf "bestanden" ... Wie auch immer, einige Reporting-Tools zeigen keine Testfehler in jUnit-Tests mehr an, wenn ich den zweiten Abhängigkeitseintrag nicht kommentiere.

Gibt es eine bessere Möglichkeit, todsichere zu konfigurieren, so dass Tests von beiden Frameworks NUR von ihren Testläufern ausgeführt werden?

+0

Cross-Posted auf der Maven-Users-Liste: http: //maven.40175.n5.nabble.com/maven-todsichere-auswählende-provider-td5764817.html –

Antwort

1

Ich habe es selbst nicht gemacht, aber Sie könnten versuchen, zwei different executions des maven-surefire-plugin zu konfigurieren und eine dieser Ausführungen so zu konfigurieren, dass nur JUnit-Tests und die anderen nur testNG-Tests ausführen. Um zwischen JUnit- und testNG-Tests unterscheiden zu können, sollten Sie entweder die Tests in verschiedenen Verzeichnissen ablegen oder ein unterscheidbares Namensschema verwenden und jede der Ausführungen mit passendem inclusion and exclusion patterns konfigurieren.

In der Theorie sollte dies funktionieren :)

+0

Ich kann das '' Element in die Ausführung nicht ziehen. Wenn ich könnte, dann wäre es wirklich * die * Lösung, eine Ausführung beschränkt auf jUnit, die andere auf TestNG :( –

+0

Du hast mich falsch verstanden. Ich meinte beide wie in der ursprünglichen Frage. Aber du könntest konfiguriere verschiedene includes/excludes, dass eine Ausführung nur JUnit-Tests finden würde und die andere nur testNG-Tests finden würde Auf diese Weise werden die unerwünschten Tests von todsicheren Filtern ausgefiltert und nicht an die Test-Frameworks weitergegeben. –

+1

Ah. Ja, Ich habe das auch versucht (und es ist noch schlimmer geworden) TestNG wird für alle Ausführungen aktiviert und der Build scheitert, wenn eine Ausführung keinen Test hat (ja, da ist eine Eigenschaft ...) - es sieht so aus, als ob ich einen Bug gefunden hätte, jemanden von der Maven Users-Mailing-Liste ermutigte mich dringend, [ein Problem zu melden] (https://jira.codehaus.org/browse/SUREFIRE-1019) +1 für Antwort & Hilfe –

4

Hatte das gleiche Problem wie Sie. Zero führt zu TestNG-Berichten, sieht aber so aus, als wären Tests ausgeführt worden. Schließlich diese Arbeit auf zwei getrennten Ausführungen von maven-surefire-plugin

  1. Entfernen Sie zuerst den dependencies Abschnitt von Plugin bekommen.
    • sonst, wenn Sie verwenden <testNGArtifactName> (und wir werden es brauchen) Tests ohnehin von TestNG ausgeführt werden und wird nicht auf java.lang.NullPointerException
  2. gewisse Trennung von TestNG Tests und JUnit-Tests haben. In unserem Fall NG Namen Testklasse endet mit TestNg
  3. überspringen Standardausführung
  4. definieren zwei <executions> wie unten:
<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> 

Getestet mit:

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

Diese Konfiguration ist die marge von Ideen von:
Running TestNG-, JUnit3- and JUnit4-tests with Maven Surefire in one run,
your SUREFIRE bug report,
surefire plugin configuration

Ich hoffe, es hilft.

+0

Ausgezeichnete Lösung! – bedrin

Verwandte Themen