692

I know you can run all the tests in a certain class using:

mvn test -Dtest=classname

But I want to run an individual method and -Dtest=classname.methodname doesn't seem to work.

Naman
  • 27,789
  • 26
  • 218
  • 353
BillMan
  • 9,434
  • 9
  • 32
  • 52
  • 3
    I would be interested in knowing how to do this, too. However, if I found myself doing it quite often, I think that test might be a candidate to be split out into its own class, so you can use the `mvn test -Dtest=classname` syntax. – John Paulett Dec 09 '09 at 13:57
  • Do you want to know how to do it via command line only?? Or using an IDE (eclipse) would work for you? – Diego Dias Dec 09 '09 at 14:04
  • 1
    I was looking at a command line. I think the junit eclipse plugin will allow you to do this. – BillMan Dec 09 '09 at 14:21
  • I did this for Maven 1. As I recalled, it involved making changes to JUnit, which is responsible for introspecting the test class. – kdgregory Dec 11 '09 at 13:49

14 Answers14

925

To run a single test method in Maven, you need to provide the command as:

mvn test -Dtest=TestCircle#xyz test

where TestCircle is the test class name and xyz is the test method.

Wild card characters also work; both in the method name and class name.

If you're testing in a multi-module project, specify the module that the test is in with -pl <module-name>.

For integration tests use it.test=... option instead of test=...:

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test
Yan Khonski
  • 12,225
  • 15
  • 76
  • 114
Mudit Srivastava
  • 9,476
  • 1
  • 15
  • 3
  • I wish there was a way to merge answers... this is correct, but the link its taken from is in another post: http://maven.apache.org/plugins/maven-surefire-plugin/examples/single-test.html – cjstehno Jun 28 '11 at 11:54
  • I was wondering if the class name should be a fully qualified class name, with the package name, and the answer is, that while a fully qualified name works, also only the class name works, Maven looks the class up for you. I guess that if the name is ambiguous, it will emit an error. – stivlo Nov 04 '11 at 02:57
  • 4
    Fixed the "No Tests Were Executed" error by downgrading to surefire 2.9 – qwerty Jul 18 '12 at 07:58
  • 2
    So wait, the "solution" is to revert to an old version? What about those of us who actually require more recent versions of surefire? – Adam Parkin Feb 28 '13 at 19:27
  • 16
    I fixed "No Tests Were Executed!" by upgrading to 2.14: – alfonx Mar 17 '13 at 22:40
  • 68
    If you're testing in a multi-module project, you also need to specify the module that the test is in with `-pl `. – Jon Oct 15 '13 at 07:06
  • I had the same problem for testng with surefire 2.9, but version 2.14 and current last 2.17 work. – jan May 14 '14 at 12:28
  • 25
    Use `-DfailIfNoTests=false` to skip projects without test. `No Tests Were Executed` happens when you try to run test from root project and there is modules without tests at all. – Cherry Aug 18 '14 at 03:46
  • 1
    I got `No Tests Were Executed !` too, because i have `jUnit` and `TestNg` together in maven project dependencies. Removing `TestNg` or changing `@Test` annotation to `@org.testng.annotations.Test` solved problem for me. – marioosh Nov 06 '15 at 11:42
  • When running integration tests the phase has to be "integration-test" instead of "test". – diegomtassis Jun 14 '16 at 08:28
  • 11
    This command works !! `mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test` Note that "-DTest" starts with UPPER CASE 'T'. – vikas Aug 07 '17 at 11:10
  • 4
    I just spent 45min with no success until I realized I was missing the "Test" at the end of my test class name. – xdhmoore Jan 13 '18 at 01:33
  • Dont forget the **:** in front of the module name ... `mvn -pl : -Dtest=TestCircle#xyz test` – JohnK Jul 22 '19 at 09:43
  • 1
    For the first example, I found the `test` hanging off the end of the command to be unnecessary – Jordan Morris May 04 '20 at 04:34
  • What is the last `test` word being used for? –  Aug 27 '21 at 10:32
  • that is the goal maven needs to execute – ateebahmed Jul 22 '22 at 14:47
35

There is an issue with surefire 2.12. This is what happen to me changing maven-surefire-plugin from 2.12 to 2.11:

  1. mvn test -Dtest=DesignRulesTest

    Result:
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12:test (default-test) on project pmd: No tests were executed!

  2. mvn test -Dtest=DesignRulesTest

    Result: [INFO] --- maven-surefire-plugin:2.11:test (default-test) @ pmd --- ... Running net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest Tests run: 5, Failures: 0, Errors: 0, Skipped: 4, Time elapsed: 4.009 sec

Yassin Hajaj
  • 21,337
  • 9
  • 51
  • 89
Duccio Fabbri
  • 998
  • 1
  • 10
  • 21
22

Run a single test method from a test class.

mvn test -Dtest=Test1#methodname


Other related use-cases

  • mvn test // Run all the unit test classes

  • mvn test -Dtest=Test1 // Run a single test class

  • mvn test -Dtest=Test1,Test2 // Run multiple test classes

  • mvn test -Dtest=Test1#testFoo* // Run all test methods that match pattern 'testFoo*' from a test class.

  • mvn test -Dtest=Test1#testFoo*+testBar* // Run all test methods match pattern 'testFoo*' and 'testBar*' from a test class.

Amit
  • 33,847
  • 91
  • 226
  • 299
18

What I do with my TestNG, (sorry, JUnit doesn't support this) test cases is I can assign a group to the test I want to run

@Test(groups="broken")

And then simply run 'mvn -Dgroups=broken'.

tunaranch
  • 1,584
  • 1
  • 12
  • 17
17

Running a set of methods in a Single Test Class With version 2.7.3, you can run only n tests in a single Test Class.

NOTE : it's supported for junit 4.x and TestNG.

You must use the following syntax

mvn -Dtest=TestCircle#mytest test

You can use patterns too

mvn -Dtest=TestCircle#test* test

As of surefire 2.12.1, you can select multiple methods (JUnit4X only at this time, patches welcome)

mvn -Dtest=TestCircle#testOne+testTwo test

Check this link about single tests

Hugo Dozois
  • 8,147
  • 12
  • 54
  • 58
  • 3
    In my case i had to double quote the TestClass#test name like mvn -Dtest="TestCircle#myTest" test – Pratik Khadloya Jun 27 '14 at 23:12
  • @PratikKhadloya Any idea how it works for dependent tests? Say, I have test1(), test2(), test3() methods in TestClass and test2 depends on test1. How can I run just test2()? – Ziska Oct 28 '14 at 20:05
  • 5
    I think if you have dependencies amongst your tests, you are doing something wrong. Each test should be independent of other tests. You need to remove the coupling between them. – Pratik Khadloya Oct 29 '14 at 18:41
15

This command works !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Note that "-DTest" starts with UPPER CASE 'T'.

vikas
  • 1,318
  • 4
  • 16
  • 33
12

You can run specific test class(es) and method(s) using the following syntax:

  1. full package : mvn test -Dtest="com.oracle.tests.**"

  2. all method in a class : mvn test -Dtest=CLASS_NAME1

  3. single method from single class :mvn test -Dtest=CLASS_NAME1#METHOD_NAME1

  4. multiple method from multiple class : mvn test -Dtest=CLASS_NAME1#METHOD_NAME1,CLASS_NAME2#METHOD_NAME2

9

First you need to clean your maven project

mvn clean

then you can run specific file and function using

mvn test -Dtest=testClassName#testCaseName

deirdreamuel
  • 609
  • 8
  • 11
8

I tried several solutions provided in this thread, however they were not working for module which depends on a different one. In that case I had to run mvn from the root-module with additional parameters: -am (--also-make), which tells maven to built modules which your test module depends on and -DfailIfNoTests=false, otherwise "No tests were executed!" error appears.

mvn test -pl B -Dtest=MyTestClass#myTest -am -DfailIfNoTests=false

pom.xml section in root:

<modules>
    <module>A</module>
    <module>B</module>
<modules>

B depends on A.

jwpol
  • 1,188
  • 10
  • 22
4

The test parameter mentioned by tobrien allows you to specify a method using a # before the method name. This should work for JUnit and TestNG. I've never tried it, just read it on the Surefire Plugin page:

Specify this parameter to run individual tests by file name, overriding the includes/excludes parameters. Each pattern you specify here will be used to create an include pattern formatted like **/${test}.java, so you can just type "-Dtest=MyTest" to run a single test called "foo/MyTest.java". This parameter overrides the includes/excludes parameters, and the TestNG suiteXmlFiles parameter. since 2.7.3 You can execute a limited number of method in the test with adding #myMethod or #my*ethod. Si type "-Dtest=MyTest#myMethod" supported for junit 4.x and testNg

Wesley Hartford
  • 426
  • 4
  • 6
3

New versions of JUnit contains the Categories runner: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

But releasing procedure of JUnit is not maven based, so maven users have to put it manually to their repositories.

Andriy Plokhotnyuk
  • 7,883
  • 2
  • 44
  • 68
3

As of surefire plugin version 2.22.1 (possibly earlier) you can run single test using testnames property when using testng.xml

Given a following testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="all-tests">
        <classes>
            <class name="server.Atest"/>
            <class name="server.Btest"/>
            <class name="server.Ctest"/>
        </classes>
    </test>
    <test name="run-A-test">
        <classes>
            <class name="server.Atest"/>
        </classes>
    </test>
    <test name="run-B-test">
        <classes>
            <class name="server.Btest"/>
        </classes>
    </test>
    <test name="run-C-test">
        <classes>
            <class name="server.Ctest"/>
        </classes>
    </test>
</suite> 

with the pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    [...]
    <properties>
        <selectedTests>all-tests</selectedTests>
    </properties>
    [...]
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
            <configuration>
                <suiteXmlFiles>
                    <file>src/test/resources/testng.xml</file>
                </suiteXmlFiles>
                <properties>
                    <property>
                        <name>testnames</name>
                        <value>${selectedTests}</value>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
    [...]
</project>

From command line

mvn clean test -DselectedTests=run-B-test

Further reading - Maven surefire plugin using testng

bsk
  • 31
  • 2
3

You need to specify the JUnit test class and its method to be executed.

mvn test -Dtest=com.mycompany.AppTest#testMethod

https://metamug.com/article/java/build-run-java-maven-project-command-line.html#running-unit-tests

Sorter
  • 9,704
  • 6
  • 64
  • 74
-4

You can run a single test class, but not a single method within a test class. You use the simple name of the class not the fully-qualified name of the class. So, if you have a test in "org.sonatype.test.MyTest" and that is the only test you want to run, your command line would look like this:

mvn test -Dtest=MyTest
om-nom-nom
  • 62,329
  • 13
  • 183
  • 228
Tim O'Brien
  • 9,623
  • 5
  • 30
  • 36