run a junit test for a single method only
I do not think if that is natively supported by JUnit. However, you have some alternatives:
- Put the required tests in different classes so you can run them separately
- Maybe using the
@Ignore
annotation helps you. - If you're using some IDE, it may support this approach. For instance in Eclipse, unfold the test class in the Package Explorer, select the method you want to run, and click Run As -> JUnit test.
- Here's a quite extensive tutorial on how to create a custom
TestSuit
and an Ant task that can make this for you. - UPDATE In this thread the guys say that "The old junit.textui.TestRunner utility provides a way to run a single method on the command-line, via the runSingleMethod(), but it doesn't support JUnit4 annotated test classes."
It is possible when you use the surefire plugin [1]:
mvn -Dtest=TestClass#test1_shouldbeRun test
[1] http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html
I made a post about this a little while back.
This is possible using JUnit 4 and Ant. The trick is pass the method name[s] as a property on the command line and use a different task if that property was passed.
Given this test class:
import org.junit.Test;
public class FooTests {
@Test
public void firstTest() {
System.out.println("test 1");
}
@Test
public void secondTest() {
System.out.println("test 2");
}
@Test
public void thirdTest() {
System.out.println("test 3");
}
}
Create this ant file:
<project default="test">
<!-- Tell Ant where to find JUnit -->
<path id="classpath.test">
<pathelement location="junit-4.11.jar" />
<pathelement location="hamcrest-core-1.3.jar" />
<pathelement location="." /> <!-- or where ever your test class file is -->
</path>
<target name="test" description="Runs the tests">
<!-- Set a new Ant property "use-methods" to true if the "test-methods" Ant property - which we'll pass in from the command line - exists and is not blank.-->
<condition property="use-methods" else="false">
<and>
<isset property="test-methods"/>
<not>
<equals arg1="${test-methods}" arg2=""/>
</not>
</and>
</condition>
<!-- Sanity check -->
<echo message="use-methods = ${use-methods}"/>
<echo message="test-methods = ${test-methods}"/>
<!-- Run the tests -->
<junit>
<classpath refid="classpath.test" />
<formatter type="brief" usefile="false" />
<!-- The "if" tells JUnit to only run the test task if the use-methods property is true.-->
<test if="${use-methods}" name="FooTests" methods="${test-methods}"/>
<!-- The "unless" tells JUnit to not run the test task if the use-methods property is true.-->
<test unless="${use-methods}" name="FooTests"/>
</junit>
</target>
</project>
Examples
Run all tests.
$ ant
Buildfile: build.xml
test:
[echo] use-methods = false
[echo] test-methods = ${test-methods}
[junit] Testsuite: FooTests
[junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec
[junit]
[junit] ------------- Standard Output ---------------
[junit] test 3
[junit] test 1
[junit] test 2
[junit] ------------- ---------------- ---------------
BUILD SUCCESSFUL
Total time: 0 seconds
Run only the second test by specifying the “test-methods” Ant property on the command line.
$ ant -Dtest-methods=secondTest
Buildfile: build.xml
test:
[echo] use-methods = true
[echo] test-methods = secondTest
[junit] Testsuite: FooTests
[junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.009 sec
[junit]
[junit] ------------- Standard Output ---------------
[junit] test 2
[junit] ------------- ---------------- ---------------
BUILD SUCCESSFUL
Total time: 0 seconds
Run only the second and third tests.
$ ant -Dtest-methods=secondTest,thirdTest
Buildfile: build.xml
test:
[echo] use-methods = true
[echo] test-methods = secondTest,thirdTest
[junit] Testsuite: FooTests
[junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.01 sec
[junit]
[junit] ------------- Standard Output ---------------
[junit] test 3
[junit] test 2
[junit] ------------- ---------------- ---------------
BUILD SUCCESSFUL
Total time: 0 seconds