wake-up-neo.net

Wie führe ich JUnit- und TestNG-Tests im selben Projekt mit dem maven-surefire-plugin aus?

Im Moment habe ich beide Arten von Tests, aber wenn ich "mvn test" sage, führt es nur TestNG-Tests aus und nicht Junit. Ich möchte beide nacheinander ausführen. Irgendeine Idee ?

36
ravinikam

Es gibt eine offene Ausgabe für thi s. Es gibt also keine elegante Möglichkeit, dies zu tun.

Es wäre viel einfacher für Sie, einen Rahmen auszuwählen und dabei zu bleiben.

Bearbeiten: Meine vorherige Antwort funktioniert nicht, da Sie in der Ausführung keine Abhängigkeiten angeben können. Ich habe einige Ansätze ausprobiert, aber das Beste, was ich schaffen kann, ist, ein Profil für die TestNG-Abhängigkeit zu erstellen Da zwischen TestNG- und JUnit-Tests hin- und hergeschaltet werden kann, scheint es keine Möglichkeit zu geben, TestNG- und Junit 4-Tests auszuführen.

Noch ein weiterer Hinweis: Sie können Ihre JUnit-Tests von TestNG starten , aber ich denke, dass dies nur für JUnit 3-Tests funktioniert.

11
Rich Seller

Offizieller Weg mit Anbieter auswählen .

Sie können auch mehrere Anbieter als Abhängigkeiten angeben, die alle ausgeführt werden und einen gemeinsamen Bericht erstellen . Dies kann besonders bei externen Providern hilfreich sein, da es nur wenige Anwendungsfälle für die Kombination der enthaltenen Provider gibt.

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <dependencies>
        <dependency>
            <groupId>org.Apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>2.18.1</version>
        </dependency>
        <dependency>
            <groupId>org.Apache.maven.surefire</groupId>
            <artifactId>surefire-testng</artifactId>
            <version>2.18.1</version>
        </dependency>
    </dependencies>
</plugin>

Weitere Informationen hierzu: Mischen von TestNG- und JUnit-Tests in einem Maven-Modul - Ausgabe 2013

Aktueller Link hierzu in den maven-surefire-plugin Beispielen . Suche nach " Running TestNG und JUnit Tests ".

Sie müssen den Testng-Provider so konfigurieren, dass er die Junit-Tests ignoriert, wie folgt:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>        
    <properties>
        <property>
            <name>junit</name>
            <value>false</value>
         </property>
    </properties>        
    </configuration>
    [...providers as dependecies, see above...]
</plugin>
40
MariuszS

Ich habe eine bessere Lösung .

Die Idee ist, zwei Ausführungen von maven-surefire-plugin zu erstellen, eine für JUnit, eine für TestNG. Sie können TestNG oder JUnit pro Ausführung deaktivieren, indem Sie nicht vorhandene junitArtifactName oder testNGArtifactName angeben:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <executions>
        <execution>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration> 
                <testNGArtifactName>none:none</testNGArtifactName>
            </configuration>
        </execution>
        <execution>
            <id>test-testng</id>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration> 
                <junitArtifactName>none:none</junitArtifactName>
            </configuration>
        </execution>
    </executions>
</plugin>
12
lexicore

Dafür gibt es einen anderen Weg. Sie können TestNG auch bitten, Junit-Testfälle auszuführen. Nachfolgend finden Sie das Beispiel testng.xml zum Ausführen aller Testfälle

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 
<suite name="TestAll">
 
	<test name="junitTestCases" junit="true">
		<packages>
			<package name="com.test.*" />
			
		</packages>
	</test>
 
 <test name="testNGTestCases" >
		<packages>
			<package name="com.test.*" />
			
		</packages>
	</test>
</suite>

6
jean joseph

Dank dieses Links ( http://jira.codehaus.org/browse/SUREFIRE-377 ) ist hier eine Lösung für mein vorheriges Problem (3 Ausführungen statt 2).

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.10</version>
    <configuration>
       <testNGArtifactName>none:none</testNGArtifactName>
    </configuration>
    <executions>
       <execution>
          <phase>test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
             <junitArtifactName>none:none</junitArtifactName>
             <testNGArtifactName>org.testng:testng</testNGArtifactName>
          </configuration>
       </execution>
    </executions>
</plugin>

Für JUnit ---

<plugin>
   <groupId>org.Apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.19.1</version>
   <dependencies>
  <dependency>
    <groupId>org.Apache.maven.surefire</groupId>
    <artifactId>surefire-junit47</artifactId>
    <version>2.19.1</version>
  </dependency>
</dependencies>

Verwenden Sie bei Bedarf auch die Abhängigkeit für TestNG

2
sathish p

für Junit löste dies mein Problem

<plugin>
   <groupId>org.Apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.19.1</version>
   <dependencies>
  <dependency>
    <groupId>org.Apache.maven.surefire</groupId>
    <artifactId>surefire-junit47</artifactId>
    <version>2.19.1</version>
  </dependency>
</dependencies>
1
Mauricio

Ich habe eine Lösung gefunden, um beide Testtypen mit TestNG auszuführen, ohne die Build-Tool-Konfiguration zu ändern.

Ich habe mit Gradle getestet, sollte aber auch mit Maven zusammenarbeiten.

Beachten Sie, dass dies JUnit-Tests in TestNG ausführt, jedoch nicht umgekehrt.

Der Trick besteht darin, die Anmerkungen beider Frameworks in den Testklassen zu verwenden und TestNG-Asserts für JUnit-Kompatibilität zu verwenden.

import static org.testng.AssertJUnit.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

@org.testng.annotations.Test
public final class ApplicationTest {

    @org.testng.annotations.BeforeClass
    @BeforeClass
    public static void setup () {}

    @org.testng.annotations.AfterClass
    @AfterClass
    public static void cleanup () {}

    @Test public void json () throws IOException {
        assertTrue (true);
    }
}

Mit diesem Hack können Sie vorhandene JUnit-Tests problemlos mit TestNG ausführen, um sie bei Bedarf zu migrieren.

Ich hoffe es hilft!

1
jamming

Ich fand, dass die Lösung darin bestand, das sure-fire-Plugin zur Verwendung von JUnit zu zwingen. Ich habe dies getan, indem ich das todsichere Plugin in dem spezifischen Projekt wie folgt überschrieben habe. Die Abhängigkeit zwingt zur Nutzung von JUnit.

<build>
    <plugins>
        <!-- force sure fire to use junit instead of testng -->
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <dependencies>
                <dependency>
                    <groupId>org.Apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.10</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
1
Clayton

Basierend auf früheren Lösungen. Ich fand das am besten für uns. Ein weiteres Problem, mit dem wir konfrontiert waren, war TestNG, der versuchte, alte JUnit-Tests auszuführen. Wir haben dies vermieden, indem wir alle TestNG-Tests unterschiedlich benannten (z. B. * TestNG.Java). Unten ist die Konfiguration mit zwei Ausführungen des Surefire-Plugins.

    <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>           
                <testNGArtifactName>none:none</testNGArtifactName>   
                <excludes>
                    <exclude>**/*TestNG.Java</exclude>
                </excludes> 
            </configuration>
            <executions>
                <execution>
                    <id>test-testng</id>
                    <phase>test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration> 
                        <junitArtifactName>none:none</junitArtifactName>          
                        <testNGArtifactName>org.testng:testng</testNGArtifactName>   
                        <includes>
                            <include>**/*TestNG.Java</include>
                        </includes>
                        <excludes>
                            <exclude>**/*Test.Java</exclude>
                        </excludes> 
                    </configuration>
                </execution>
            </executions>
        </plugin>
1
chinto

wenn Sie nur testng provider angeben, werden sowohl junit-Tests als auch testng-Tests nur einmal ausgeführt. 
Es gibt also keine Einschränkung bei der Benennung der Tests.

plugin-Versionen: 
surefire-plugin 2.16 (junit47 und testng provider beide Version auf 2.16 gesetzt) 
testng Abhängigkeit 6.8.7 
junit Abhängigkeit 4.7

0
user200905
<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>${Java.version}</source>
                <target>${Java.version}</target>
            </configuration>
        </plugin>
        <!-- ********* Skip Test for Success BUILD ******** -->
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <!-- *********************************************** -->
    </plugins>
</build>

<profiles>
    <!-- ********** Profiles for run test cases ************ -->
    <!-- Profile for run JUnit test dependent tests -->
    <profile>
        <id>junit-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.Apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.10</version>
                    <configuration>
                        <skip>false</skip>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.Apache.maven.surefire</groupId>
                            <artifactId>surefire-junit47</artifactId>
                            <version>2.10</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>

    <!-- Profile for run TestNG dependent tests -->
    <profile>
        <id>testNG-tests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.Apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.10</version>
                    <configuration>
                        <skip>false</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

    <!-- ***************************************************** -->
</profiles>

Dann führen Sie einfach aus: mvn test -Pjunit-tests (für Lauftest basierend auf junit) oder mvn test -PtestNG-Tests (für TestNG-Test basierend).

0
MolodecSerg