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

前端 未结 6 1322
野性不改
野性不改 2021-01-20 10:24

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

相关标签:
6条回答
  • 2021-01-20 10:47

    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());
    }
    
    0 讨论(0)
  • 2021-01-20 10:48

    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.

    0 讨论(0)
  • 2021-01-20 10:48

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

    junit fork="yes" showoutput="true" printsummary="withOutAndErr"
    
    0 讨论(0)
  • 2021-01-20 10:56

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

    0 讨论(0)
  • 2021-01-20 10:57

    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.

    0 讨论(0)
  • 2021-01-20 11:04

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

    0 讨论(0)
提交回复
热议问题