The simplest way to run integration tests is to use the Maven failsafe plugin. By default, the Maven surefire plugin executes unit tests during the test phase, while the failsafe plugin runs integration tests in the integration-test phase.
To skip running the tests for a particular project, set the skipTests property to true. You can also skip the tests via the command line by executing the following command: mvn install -DskipTests.
The -DskipTests will skip the execution of both unit tests (surefire) and integration tests (failsafe). In order to just skip the integration tests, we can pass the -DskipITs system property. Finally, it's worth mentioning that the now-deprecated flag -Dmaven. test.
Configure Maven Integration Tests The configuration uses a standard execution goal to run the failsafe plugin during the integration-test phase of the build. You can now do a mvn clean install . This time as well as the unit tests running, the integration tests are run during the integration-test phase.
I found the simplest way to skip only surefire tests is to configure surefire (but not failsafe) as follows:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.14</version>
<configuration>
<!-- skips surefire tests without skipping failsafe tests.
Property value seems to magically default to false -->
<skipTests>${skip.surefire.tests}</skipTests>
</configuration>
</plugin>
This allows you to run mvn verify -Dskip.surefire.tests
and only surefire, not failsafe, tests will be skipped; it will also run all other necessary phases including pre-integration and post-integration, and will also run the verify
goal which is required to actually fail your maven build if your integration tests fail.
Note that this redefines the property used to specify that tests should be skipped, so if you supply the canonical -DskipTests=true
, surefire will ignore it but failsafe will respect it, which may be unexpected, especially if you have existing builds/users specifying that flag already. A simple workaround seems to be to default skip.surefire.tests
to the value of skipTests
in your <properties>
section of the pom:
<properties>
<skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>
If you need to, you could provide an analagous parameter called skip.failsafe.tests
for failsafe, however I haven't found it necessary - because unit tests usually run in an earlier phase, and if I want to run unit tests but not integration tests, I would run the test
phase instead of the verify
phase. Your experiences may vary!
These skip.(surefire|failsafe).tests
properties should probably be integrated into surefire/failsafe code itself, but I'm not sure how much it would violate the "they're exactly the same plugin except for 1 tiny difference" ethos.
A workaround would be to call:
mvn clean test-compile failsafe:integration-test
Admittedly, this is ugly, but it may solve your problem.
Or (another hack):
mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false
Reference:
surefire:test#test
surefire:test#failIfNoTests
I am using the code from Antonio Goncalves Blog , which works perfect.
You can use the following properties:
-DskipUTs=true
for skipping surefire tests.
-DskipITs=true
for skipping failsafe tests.
-DskipTests=true
for skipping all tests.
The pom.xml
is as follows:
<properties>
<skipTests>false</skipTests>
<skipITs>${skipTests}</skipITs>
<skipUTs>${skipTests}</skipUTs>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>${skipUTs}</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.19.1</version>
<executions>
<execution>
<id>run-integration-tests</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
<configuration>
<skipTests>${skipTests}</skipTests>
<skipITs>${skipITs}</skipITs>
</configuration>
</plugin>
</plugins>
</build>
Hope this helps!
Try to run test only with FailSafe (plugin for integration-test - it will allow you to run only integration tests with this kind naming, by default: */IT.java, **/IT.java, */*ITCase.java; , but you can easily change that from pom file)
mvn failsafe:integration-test
And when you want to use only SureFire (plugin for unit-testing)
mvn surefire:test
or one test at a time with:
mvn -Dtest=MyUnitlTest
I do like this so every phases are normally executed:
mvn -Dtest=foo -DfailIfNoTests=false verify
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With