Search code examples
javajunitantjunit4

How to print current executing JUnit test method while running all tests in a class or suite using ANT?


I have a set of JUnit Test Cases and I execute them from ANT using the junit task. While executing the tests, in the console I get to see only which test case (i.e. Java class) is currently running, but not the test method. Is there a way I can print the current executing test method? Or is there any other way to do this other than having my own JUnit test runner?

Sample Console Output

[junit] Running examples.TestCase1
[junit] Tests run: 3, Failures: 0, Errors: 0, Time elapsed: 2.835 sec

Instead I wish to get the output like

[junit] Running examples.TestCase1
[junit] Running examples.TestCase1.test1
[junit] Running examples.TestCase1.test2
[junit] Running examples.TestCase1.test3
[junit] Tests run: 3, Failures: 0, Errors: 0, Time elapsed: 2.835 sec

Solution

  • Unfortunately, there is no good way to hook into JUnit. For a framework that was developed with TDD, it's astonishingly hostile.

    Use a @Rule instead:

    import org.junit.rules.TestWatcher;
    import org.junit.runner.Description;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * Log the currently running test.
     * 
     * <p>Typical usage:
     * 
     * <p>{@code @Rule public LogTestName logTestName = new LogTestName();}
     *
     * <p>See also:
     * <br>{@link org.junit.Rule}
     * <br>{@link org.junit.rules.TestWatcher}
     */
    public class LogTestName extends TestWatcher {
    
        private final static Logger log = LoggerFactory.getLogger( "junit.logTestName" );
    
        @Override
        protected void starting( Description description ) {
            log.debug( "Test {}", description.getMethodName() );
        }
    
    }
    

    Notes:

    I'm using a static logger. That makes the code execute faster but my main reason is that logging test names is a cross-cutting concern: I would like to enable/disable this logging in a central place instead of configuring it for each test class.

    Another reason is that I have tools which process the build output and those are easier to configure for a fixed pattern :-)

    If you don't want this, then just get the logger for description.getTestClass().