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 cla
You can make use of the TestName
rule. Just add the following code to your test class:
@Rule
public TestName testName = new TestName();
@Before
public void printTestMethod() {
System.out.println("Running " + testName.getMethodName());
}
If you do not want to create your own test runner you could try using the stacktrace.
The following Method prints the class and method name of the method that called it.
public static void printMethod() {
System.out.println(Thread.currentThread().getStackTrace()[2]);
}
You would have to call this method in each of your test methods.
Adding showoutput="true"
caused my junit tests to log output as the tests were executing:
junit fork="yes" showoutput="true" printsummary="withOutAndErr"
Derive a class from RunListener
and override the testStarted()
method. It receives a Description
parameter from which you can obtain the test class and the test method -- e.g., description.getMethodName()
.
You can try using the formatter
by setting type as plain.
<formatter type="plain" usefile="false"/>
Or
You can use implement Custom formatters by extending org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter
class.
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()
.