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/simple-weather/target/\ surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.sonatype.mavenbook.weather.yahoo.WeatherFormatterTest 0 INFO 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 causes Maven to execute all lifecycle phases up to the
test
phase. The Maven Surefire plugin has a test
goal that is bound to the test
phase. This test
goal executes all of the unit tests
that this project can find under src/test/java. In the case of this project,
you can see that the Surefire pluginâs test
goal executes
WeatherFormatterTest
and
YahooParserTest
. When the 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 such as 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
. See
Example 4-16.
Example 4-16. 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, as shown in Example 4-17.
Example 4-17. 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 them
before producing output. Or maybe you are working with a legacy
system that has a series of failing unit tests, and instead of
fixing them, you just want to produce a JAR.
Maven allows you 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 the configuration shown in Example 4-18 to your projectâs pom.xml. To do
this, you would add a plugin
element to your
build
configuration.
Get Maven: The Definitive Guide now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.