The Maven Cookbook
7.2. Running JUnit Tests
To execute all of the unit tests in a project, include JUnit as a test scoped dependency in your project's pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.sonatype.mcookbook</groupId> <artifactId>junit-tests</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>junit-tests</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.5</version> <scope>test</scope> </dependency> </dependencies> </project>
Your project should then store unit classes in the default
location of ${basedir}/src/test/java
. The Maven Surefire plugin will
scan these directory for JUnit tests. In this example, a component named
SeriousComponent has a corresponding JUnit test named
SeriousComponentTest.
In this example, the simple component being tested is named SeriousComponent. SeriousComponent contains a single static method to be tested.
Example 7.1. SeriousComponent class
package org.sonatype.mcookbook; public class SeriousComponent { /** * This function tests the seriousness of a String. * Returns false if the string contains the word * "FUNNY", returns true otherwise. */ public static boolean testSeriousness( String text ) { return !text.toUpperCase().contains( "FUNNY" ); } }
This class is tested by a simple JUnit test - SeriousComponentTest shown in the following exmple:
Example 7.2. JUnit test for SeriousComponent
package org.sonatype.mcookbook; import junit.framework.TestCase; public class SeriousComponentTest extends TestCase { public SeriousComponentTest(String name) { super( name ); } public void testSeriousness() throws Exception { assertTrue( SeriousComponent.testSeriousness( "SAD" ) ); assertTrue( SeriousComponent.testSeriousness( "SERIOUS" ) ); assertTrue( SeriousComponent.testSeriousness( "CRAZY" ) ); assertTrue( !SeriousComponent.testSeriousness( "FUNNY" ) ); } }
To execute your unit test, you don't need to do anything. Maven's
default settings are to scan ${basedir}/src/test/java
for unit tests
matching the pattern *Test.java
. To run your unit
test specify the test phase of the default Maven lifecycle and run
mvn test.
$ mvn test
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building junit-tests
[INFO] task-segment: [test]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (MacRoman actually) to copy filtered
resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to /Users/Tim/Library/Code/sonatype/
maven-cookbook/mcookbook-examples/unit/junit-tests/target/classes
[INFO] [resources:testResources {execution: default-testResources}]
[WARNING] Using platform encoding (MacRoman actually) to copy filtered
resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Compiling 1 source file to /Users/Tim/Library/Code/sonatype/
maven-cookbook/mcookbook-examples/unit/junit-tests/target/test-classes
[INFO] [surefire:test {execution: default-test}]
[INFO] Surefire report directory: /Users/Tim/Library/Code/sonatype/
maven-cookbook/mcookbook-examples/unit/junit-tests/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.sonatype.mcookbook.SeriousComponentTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.065 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5 seconds
[INFO] Finished at: Wed Nov 25 14:42:39 CST 2009
[INFO] Final Memory: 17M/80M
[INFO] ------------------------------------------------------------------------
The test results will be made available in
${basedir}/target/surefire-reports
as both an XML file and a text
file.
The TEST-org.sonatype.mcookbook.SeriousComponentTest.xml contains an XML document describing the environment and state of the JVM in addition to data about the test cases which have been executed, and the org.sonatype.mcookbook.SeriousComponentTest.txt file a summary of a successful test or output that contains stack traces generated by a test failure.
If your unit test passes, the org.sonatypemcookbook.SeriousComponentTest.txt will contain the following output:
$ cd target/surefire-reports/ $ more org.sonatype.mcookbook.SeriousComponentTest.txt ------------------------------------------------------------------------------- Test set: org.sonatype.mcookbook.SeriousComponentTest ------------------------------------------------------------------------------- Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.065 sec
If the unit test fails the same file will contain a stack trace that points to a failed assertion on a specific line of the unit test as shown below:
------------------------------------------------------------------------------- Test set: org.sonatype.mcookbook.SeriousComponentTest ------------------------------------------------------------------------------- Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.062 sec <<< FAILURE! testSeriousness(org.sonatype.mcookbook.SeriousComponentTest) Time elapsed: 0.017 sec <<< FAILURE! junit.framework.AssertionFailedError: null at junit.framework.Assert.fail(Assert.java:47) at junit.framework.Assert.assertTrue(Assert.java:20) at junit.framework.Assert.assertTrue(Assert.java:27) at org.sonatype.mcookbook.SeriousComponentTest.testSeriousness( SeriousComponentTest.java:15) ....