1. Overview

In this quick tutorial, we'll look at how we can run a single test using Maven.

2. Unit Tests

We'll first look at the unit tests.

2.1. Maven Plugin

Let's add the maven-surefire-plugin which runs the unit tests:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>

The version - 2.22.2 - is important because some of the explained features aren't available in the earlier releases of Surefire.

2.2. Run a Single Unit Test

The Surefire Plugin provides the test configuration property which determines the file name of test classes.

Now we'll configure it from the command line using the test property:

mvn -Dtest=SampleTest test

Here, we just provide the test class name. Then Surefire turns SampleTest into **/SampleTest.java. As a result, if there is a SampleTest class on any part of the classpath, Surefire runs it.

When we add the java extension, Surefire ignores it:

mvn -Dtest=SampleTest.java test

This produces the same result as the previous example. Because Surefire itself adds java to the final file pattern.

We can also specify the fully qualified class name:

mvn -Dtest=com.javabyexamples.maven.plugins.surefire.SampleTest test

In this case, we're more specific about the test class, since we're specifying both the name and the package. Consequently, this can produce a different result compared to the previous examples. For instance, if we had multiple SampleTest classes in different packages, -Dtest=SampleTest would run all of them. In contrast, -Dtest=com.javabyexamples.maven.plugins.surefire.SampleTest would run only one of them - the one with the matching package.

Now let's run multiple test classes:

mvn -Dtest=SampleTest,AnotherTest test

Here, we're listing different classes separated by commas.

We can also specify multiple test classes using a pattern:

mvn -Dtest=Sam*Test test

Surefire will run all test classes that start with Sam and end with Test.

So far we only dealt with the test classes, not the test methods. Surefire also allows us to run a single test method:

mvn -Dtest=SampleTest#shouldRun test

In the end, only the shouldRun method in SampleTest will run.

We can also specify multiple test methods separated by pluses (+):

mvn -Dtest=SampleTest#shouldRun+shouldFail test

Surefire will run the shouldRun and shouldFail methods.

3. Integration Tests

Let's continue with the integration tests.

3.1. Maven Plugin

Let's add the maven-failsafe-plugin which runs the integration tests:

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

Similar to the Surefire Plugin, the version is important since some features may be missing in the earlier releases. Also, we have a sample executions configuration which can be modified according to our needs .

3.2. Run a Single Integration Test

The Failsafe Plugin also provides a test configuration property that defines the integration tests. Moreover, we can set it through the user property it.test:

mvn -Dit.test=SampleIT verify

The Failsafe Plugin will take the SampleIT and create the **/SampleIT.java pattern. As a result, all SampleIT classes will be run.

The rules that are valid for Surefire are also valid for Failsafe. But let's go over them again one by one.

Since Failsafe ignores the java extension, we don't need to specify it:

mvn -Dit.test=SampleIT.java verify

Similar to Surefire, we can specify the fully qualified name:

mvn -Dit.test=com.javabyexamples.maven.plugins.failsafe.SampleIT verify

We can define multiple test classes separating them by commas:

mvn -Dit.test=SampleIT,AnotherIT verify

Or alternatively, we can use patterns:

mvn -Dit.test=Sam*IT verify

Instead of a single test class, we can run a single test method:

mvn -Dit.test=SampleIT#shouldSayHello verify

Similarly, we can specify multiple test methods:

mvn -Dit.test=SampleIT#shouldSayHello+shouldSayBye verify

4. Summary

In this tutorial, we've looked at how we can run a single test class or a single test method using Maven. For this purpose, we investigated both the Maven Surefire Plugin and the Maven Failsafe Plugin.

Finally, check out the source for all examples over on Github.