How to run individual test in the integration-test target in maven

Maven 2Integration TestingMaven Surefire-Plugin

Maven 2 Problem Overview


We have a hundreds of tests defined for our integration-test phase lifecycle in maven, and they take a long time to finish.

What I want to do is run just one test in the integration-test. I tried doing :

mvn -Dtest=<my-test> integration-test

but that does not work. The -Dtest runs only the tests in the unit test goal, not the integration-test phase. I tried the -Dintegration-test=<my-test> instead, and that was ignored.

Is there a way to do that ?


My configuration is:

<plugin> 
	<groupId>org.apache.maven.plugins</groupId> 
	<artifactId>maven-surefire-plugin</artifactId> 
	<executions> 
		<execution> 
			<id>surefire-it</id> 
			<phase>integration-test</phase> 
			<goals> 
				<goal>test</goal> 
			</goals> 
			<configuration> 
				<excludes> 
					<exclude>none</exclude> 
				</excludes> 
				<includes>
					<include>**/api/**</include> 
				</includes> 
	..... 

Maven 2 Solutions


Solution 1 - Maven 2

If you're using the Maven failsafe plugin, you can run a single integration test by setting the it.test property to your fully qualified test class name:

mvn -D it.test=your.TestCase verify

See the failsafe plugin docs for more info.

Solution 2 - Maven 2

The Failsafe documentation would have you specify the test like so:

mvn -Dit.test=BrokenIT verify

However, -Dit.test does not appear to work any longer. Rather, the same parameter used to specify a Surefire test will apparently work for Failsafe as well. For example:

mvn -Dtest=WorksIT verify

I've filed a bug (EDIT: which was closed as "Cannot Reproduce" in 2.12) to correct the documentation.

Solution 3 - Maven 2

just add -DfailIfNoTests=false works for me with testNG. Something like this:

mvn integration-test -Dtest=aITest -DfailIfNoTests=false

Solution 4 - Maven 2

I struggled through this, and I created an additional profile to use when I wanted to run just one integration test. I hope that I've successfully extracted just the right part here:

    <profile>
        <id>integrationTestSingle</id>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>surefire-it</id>
                            <phase>integration-test</phase>
                            <goals>
                                <goal>test</goal>
                            </goals>
                            <configuration>
                                <includes>
                                    <include>**/integration/**/${test}.java</include>
                                </includes>
                                <skipTests>false</skipTests>
                            </configuration>
                        </execution>
                    </executions>
                    <configuration>
                        <argLine>-Xms256M -Xmx768M -XX:MaxPermSize=256M</argLine>
                    </configuration>
                </plugin>

                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>default-test</id>                                
                            <configuration>
                                <skipTests>true</skipTests>
                            </configuration>
                        </execution>
                    </executions>

                </plugin>
            </plugins>
        </build>
    </profile>

Now, I call maven with the integrationTestSingle profile and with -DfailIfNoTests=false -Dtest=NameOfTest, and it doesn't run any of the regular tests during the regular "test" phase, and runs just the NameOfTest test during the integration-test phase.

Solution 5 - Maven 2

I'm not sure about JUnit, but for TestNG the strategy would be to define a suite XML file with only the one test, and then in your POM configure the surefire plugin to only run that. In your POM, you would have something like this (disclaimer, this is untested):

  <plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <executions>
      <execution>
        <phase>integration-test</phase>
        <configuration>
          <suiteXmlFiles>
            <suiteXmlFile>single-test.xml</suiteXmlFile>
          </suiteXmlFiles>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

To configure the suite file, see http://testng.org/doc/documentation-main.html

Solution 6 - Maven 2

Just ran into this myself. Something like this worked well for me:

mvn -Pintegration-test -Dtest=<my-test>

The trick was to ensure that the test-group was mentioned before the -Dtest portion.

Solution 7 - Maven 2

I am using: Apache Maven 3.6.3

openjdk version "11.0.2" 2019-01-15

<groupId>org.codehaus.mojo</groupId>
<artifactId>failsafe-maven-plugin</artifactId>
<version>2.4.3-alpha-1</version>

This command worked for me:

mvn failsafe:integration-test  -Dsurefire.skip=true -DskipIntegrationTests=false -DskipTests=false -Dtest=com.myxyz.func.ITestGate

Solution 8 - Maven 2

Was actually simpler that the answers above by going back to basics with the actual documentation.

Running Junit 5 integration tests:

openjdk version "11.0.11" 2021-04-20
Apache Maven 3.6.3

In the main build just drop in documented failsafe config:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>3.0.0-M5</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Then you can run only a specific integration test with:

mvn -Dtest=\*cs1_\* verify

Note that this version will run your tests in the target folder and if you need to load any external files that are something like src\test\resources\x.y then they are copied to target\test-classes\x.y

Solution 9 - Maven 2

This works for me, when I gonna run only one test method in integration test

    mvn clean -Dit.test=some.package.SomeTestClass#testMethodName integration-test

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJalpeshView Question on Stackoverflow
Solution 1 - Maven 2A LeeView Answer on Stackoverflow
Solution 2 - Maven 2LyleView Answer on Stackoverflow
Solution 3 - Maven 2Fang ZhenView Answer on Stackoverflow
Solution 4 - Maven 2user65839View Answer on Stackoverflow
Solution 5 - Maven 2James KingsberyView Answer on Stackoverflow
Solution 6 - Maven 2filename.exeView Answer on Stackoverflow
Solution 7 - Maven 2user674669View Answer on Stackoverflow
Solution 8 - Maven 2simbo1905View Answer on Stackoverflow
Solution 9 - Maven 2Вячеслав КалякинView Answer on Stackoverflow