Maven by Example
4.12. Executing Unit Tests

Now that your project has unit tests, let’s run them. You don’t have
to do anything special to run a unit test; the test phase is a
normal part of the Maven lifecycle. You run Maven tests whenever you
run mvn package or mvn install. If you would like to run all the
lifecycle phases up to and including the test phase, run mvn test:
$ mvn test ... [INFO] [surefire:test] [INFO] Surefire report directory: ~/examples/ch-custom/simple-weather/target/\ surefire-reports
T E S T S
Running org.sonatype.mavenbook.weather.yahoo.WeatherFormatterTest 0INFO YahooParser - Creating XML Reader 177 INFO YahooParser - Parsing XML Response 239 INFO WeatherFormatter - Formatting Weather Data Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.547 sec Running org.sonatype.mavenbook.weather.yahoo.YahooParserTest 475 INFO YahooParser - Creating XML Reader 483 INFO YahooParser - Parsing XML Response Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.018 sec Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
Executing mvn test from the command line caused Maven to execute all
lifecycle phases up to the test phase. The Maven Surefire plugin has
a test goal which is bound to the test phase. This test goal
executes all of the unit tests this project can find under
src/test/java with filenames matching /Test*.java,
/Test.java and */*TestCase.java. In the case of this project,
you can see that the Surefire plugin’s test goal executed
WeatherFormatterTest and YahooParserTest. When the Maven Surefire
plugin runs the JUnit tests, it also generates XML and text reports in
the ${basedir}/target/surefire-reports directory. If your
tests are failing, you should look in this directory for details like
stack traces and error messages generated by your unit tests.
You will often find yourself developing on a system that has failing
unit tests. If you are practicing Test-Driven Development (TDD), you
might use test failure as a measure of how close your project is to
completeness. If you have failing unit tests, and you would still like
to produce build output, you are going to have to tell Maven to ignore
build failures. When Maven encounters a build failure, its default
behavior is to stop the current build. To continue building a project
even when the Surefire plugin encounters failed test cases, you’ll
need to set the testFailureIgnore configuration property of the
Surefire plugin to true.
Ignoring Unit Test Failures.
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
The plugin documents (http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html) show that this parameter declares an expression:
Plugin Parameter Expressions.
testFailureIgnore Set this to true to ignore a failure during \
testing. Its use is NOT RECOMMENDED, but quite \
convenient on occasion.
* Type: boolean
* Required: No
* Expression: ${maven.test.failure.ignore}
This expression can be set from the command line using the -D
parameter:
$ mvn test -Dmaven.test.failure.ignore=true
You may want to configure Maven to skip unit tests altogether. Maybe
you have a very large system where the unit tests take minutes to
complete and you don’t want to wait for unit tests to complete before
producing output. You might be working with a legacy system that has a
series of failing unit tests, and instead of fixing the unit tests,
you might just want to produce a JAR. Maven provides for the ability
to skip unit tests using the skip parameter of the Surefire
plugin. To skip tests from the command-line, simply add the
maven.test.skip property to any goal:
$ mvn install -Dmaven.test.skip=true ... [INFO] [compiler:testCompile] [INFO] Not compiling test sources [INFO] [surefire:test] [INFO] Tests are skipped. ...
When the Surefire plugin reaches the test goal, it will skip the
unit tests if the maven.test.skip properties is set to
true. Another way to configure Maven to skip unit tests is to add
this configuration to your project’s pom.xml. To do this, you would
add a plugin element to your build configuration.
Skipping Unit Tests.
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
