How to execute JUnit and TestNG tests in same project using maven-surefire-plugin?

33,113

Solution 1

There is an open issue for this, so there's no elegant way to do this.

It would be far simpler for you to pick a framework and stick with it.

Edit: My previous answer doesn't work because you can't specify dependencies in the execution. I've tried a few approaches, but the best I can manage is to create a profile for the TestNG dependency so you can toggle between TestNG and JUnit testing, there doesn't seem to be a means to run both TestNG and Junit 4 tests.

One other point to note: You can launch your JUnit tests from TestNG, but I think this only works for JUnit 3 tests.

Solution 2

Official way with selecting providers.

You can also specify multiple providers as dependencies, and they will all be run and produce a common report. This may be especially handy with external providers, since there are few use-cases for combining the included providers.

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

More info about this: Mixing TestNG and JUnit tests in one Maven module – 2013 edition

Current Link for this in the maven-surefire-plugin examples. Search for "Running TestNG and JUnit Tests".

You will want to configure the testng provider to ignore the junit tests like so:

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

Solution 3

I have a better solution.

The idea is to create two executions of the maven-surefire-plugin, one for JUnit, one for TestNG. You can disable one of TestNG or JUnit per execution by specifying nonexisting junitArtifactName or testNGArtifactName:

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

Solution 4

There is another wayout for this. You could ask TestNG to run Junit test cases as well. Below is the sample testng.xml to run all test cases

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

Solution 5

Thanks to this link (http://jira.codehaus.org/browse/SUREFIRE-377), here is a solution to my previous problem (having 3 executions instead of 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>
Share:
33,113

Related videos on Youtube

ravinikam
Author by

ravinikam

Updated on July 09, 2022

Comments

  • ravinikam
    ravinikam almost 2 years

    Right now I have both type of tests but when I say "mvn test" it only executes TestNG tests and not Junit. I want to execute both one after another. Any Idea ?

  • Rich Seller
    Rich Seller almost 15 years
    Of course this won't work because you can't add dependencies at the execution level. You could move the testng dependency into a profile to choose either junit or testng executions, but that's not what you're after. I'll have a look at the options and update if I find anything out
  • ravinikam
    ravinikam almost 15 years
    Thanks rich, yeah thats true what you said in comments. I also tried to add property for "Junit" as "true" as described in that issue but doesn't helped me lot so decided to ask here. Thanks anyways :)
  • ravinikam
    ravinikam almost 15 years
    yeah but unfortunately not running for me please refere stackoverflow.com/questions/1238017/…
  • Christophe Furmaniak
    Christophe Furmaniak over 13 years
    this solution works except that it launches the surefire plugin 3 times for me: the normal execution (that launches testng)+ 1 one for testng tests only and 1 for junit tests only.
  • Christophe Furmaniak
    Christophe Furmaniak over 12 years
    Not enough though, because if you want to run a single test using -Dtest=XXX , it may fail depending on the main provider. For instance, as junit is my main provider, trying to run any TestNG test using -Dtest=XXX would fail.
  • dermoritz
    dermoritz over 12 years
    down vote because of 3 times of runnning. imho the best is to configure the default execution with "<testNGArtifactName>none:none</testNGArtifactName>" see jira.codehaus.org/browse/SUREFIRE-377 and James Kato's comment - works great for me
  • lexicore
    lexicore over 12 years
    @dermoritz Well, that one was based on my original idea.
  • LAFK says Reinstate Monica
    LAFK says Reinstate Monica about 10 years
    This should go up. The only problem is that if you have a multi-module project, providers as plugin dependencies are NOT inherited. Plugins are inherited, their executions and configs are, but NOT their dependencies. Aside from that, great way to solve problem.
  • LAFK says Reinstate Monica
    LAFK says Reinstate Monica about 10 years
    This answer is kinda made obsolete by MariuszS answer above (the official way). Also, it did not fire up TestNG tests (at least under Surefire 2.10 and 2.16).
  • Njax3SmmM2x2a0Zf7Hpd
    Njax3SmmM2x2a0Zf7Hpd almost 10 years
    to disable ? <configuration> <junitArtifactName>nonexisting</junitArtifactName> </configuration>
  • seanf
    seanf about 9 years
    This works, although the grouping of results comes out a bit strange.
  • Gábor Lipták
    Gábor Lipták almost 8 years
    Be aware, that TestNG seems to ignore simply problematic tests without saying anything. For example I had a rule (which has to be a public field), which was private, then testng simply ignored the test without saying anything.
  • Jens Dibbern
    Jens Dibbern over 5 years
    Update: That issue is fixed and closed issues.apache.org/jira/browse/SUREFIRE-377
  • Betlista
    Betlista over 3 years
    I just migrated project from JUnit to test NG and realized there are no compilation problems, anything junit:junit:jar:4.12 -> org.testng:testng:jar:7.3.0