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

不想你离开。 提交于 2019-12-01 22:22:38

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().

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.

Wayne Cannon

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().

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.

user5174719

Adding showoutput="true" caused my junit tests to log output as the tests were executing:

junit fork="yes" showoutput="true" printsummary="withOutAndErr"

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());
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!