Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run single test from a JUnit class using command-line

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:

  • Ability to run a single test from a JUnit test class
  • Command Line (using JUnit)
  • Avoid modifying the test source
  • Avoid using additional tools
like image 763
Kevin Jalbert Avatar asked Feb 15 '12 04:02

Kevin Jalbert


People also ask

How do you run a single test case?

During development, you may run a single test class repeatedly. To run this through Maven, set the test property to a specific test case. The value for the test parameter is the name of the test class (without the extension; we'll strip off the extension if you accidentally provide one).

How do I call one JUnit test from another?

You could put that code in a utility method in a common class, and invoke the common code in both tests. use case: your app/framework supports several databases. so you have one base test class which contains tests for all features and one extension per database which creates the connection, loads the initial DDL/data.


1 Answers

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

like image 198
Mark Peters Avatar answered Sep 24 '22 14:09

Mark Peters