Reputation: 3235
I am trying to find an approach that will allow me to run a single test from a JUnit class using only command-line and java.
I can run the whole set of tests from the class using the following:
java -cp .... org.junit.runner.JUnitCore org.package.classname
What I really want to do is something like this:
java -cp .... org.junit.runner.JUnitCore org.package.classname.method
or:
java -cp .... org.junit.runner.JUnitCore org.package.classname#method
I noticed that there might be ways to do this using JUnit annotations, but I would prefer to not modify the source of my test classes by hand (attempting to automate this). I did also see that Maven might have a way to do this, but if possible I would like to avoid depending on Maven.
So I am wondering if there is any way to do this?
Key points I'm looking for:
Upvotes: 118
Views: 128833
Reputation: 13690
For anyone looking to do this in JUnit5!
JUnit5 includes a fat jar for running tests on the command line.
You can download the jar manually from Maven Central: https://central.sonatype.com/artifact/org.junit.platform/junit-platform-console-standalone
Or you can let mvn
get it:
mvn dependency:get -Dartifact=org.junit.platform:junit-platform-console-standalone:1.11.3
# copy the jar to this dir for convenience
mvn dependency:copy -Dartifact=org.junit.platform:junit-platform-console-standalone:1.11.3 -DoutputDirectory=.
Now, you can run the jar like this:
java -jar junit-platform-console-standalone-1.11.3.jar execute --help
Finally, to run a test, you need to provide one of the selection options (see the help menu printed by the above command), e.g. to select a class called hello.HelloTest
, use this command:
java -jar junit-platform-console-standalone-1.11.3.jar execute -cp <classpath-for-the-class-under-test> --select-class=hello.HelloTest
If you want to select a method, e.g. hi
:
java -jar junit-platform-console-standalone-1.11.3.jar execute -cp <classpath-for-the-class-under-test> --select=method:hello.HelloTest#hi
Upvotes: 0
Reputation: 523
The following command works fine.
mvn -Dtest=SqsConsumerTest -DfailIfNoTests=false test
Upvotes: 1
Reputation: 81054
You can make a custom, barebones JUnit runner fairly easily. Here's one that will run a single test method in the form com.package.TestClass#methodName
:
import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;
public class SingleJUnitTestRunner {
public static void main(String... args) throws ClassNotFoundException {
String[] classAndMethod = args[0].split("#");
Request request = Request.method(Class.forName(classAndMethod[0]),
classAndMethod[1]);
Result result = new JUnitCore().run(request);
System.exit(result.wasSuccessful() ? 0 : 1);
}
}
You can invoke it like this:
> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner
com.mycompany.product.MyTest#testB
After a quick look in the JUnit source I came to the same conclusion as you that JUnit does not support this natively. This has never been a problem for me since IDEs all have custom JUnit integrations that allow you to run the test method under the cursor, among other actions. I have never run JUnit tests from the command line directly; I have always let either the IDE or build tool (Ant, Maven) take care of it. Especially since the default CLI entry point (JUnitCore) doesn't produce any result output other than a non-zero exit code on test failure(s).
NOTE: for JUnit version >= 4.9 you need hamcrest library in classpath
Upvotes: 88
Reputation: 9691
We used IntelliJ, and spent quite a bit of time trying to figure it out too.
Basically, it involves 2 steps:
% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java
% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest
Upvotes: 0
Reputation: 2965
I use Maven to build my project, and use SureFire maven plugin to run junit tests. Provided you have this setup, then you could do:
mvn -Dtest=GreatTestClass#testMethod test
In this example, we just run a test method named "testMethod" within Class "GreatTestClass".
For more details, check out http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html
Upvotes: 76