3

我有一组 JUnit 测试用例,我使用junit任务从 ANT 执行它们。在执行测试时,在控制台中我只能看到当前正在运行的测试用例(即 Java 类),而不是测试方法。有没有办法可以打印当前正在执行的测试方法?或者除了拥有自己的 JUnit 测试运行器之外,还有其他方法可以做到这一点吗?

示例控制台输出

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

相反,我希望得到像

[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
4

6 回答 6

7

不幸的是,没有很好的方法可以连接到 JUnit。对于使用 TDD 开发的框架,它的敌意令人吃惊。

使用 a@Rule代替:

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() );
    }

}

笔记:

我正在使用静态记录器。这使代码执行得更快,但我的主要原因是记录测试名称是一个交叉问题:我想在一个中心位置启用/禁用此日志记录,而不是为每个测试类配置它。

另一个原因是我有处理构建输出的工具,并且这些工具更容易配置为固定模式:-)

如果您不想要这个,那么只需获取description.getTestClass().

于 2013-09-26T13:06:06.030 回答
1

您可以尝试使用formatterby setting type as plain。

<formatter type="plain" usefile="false"/>

或者

org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter您可以通过扩展类来使用实现自定义格式化程序。

于 2013-03-05T11:48:06.430 回答
1

派生一个类RunListener并覆盖该testStarted()方法。它接收一个Description参数,您可以从中获取测试类和测试方法——例如,description.getMethodName().

于 2017-07-01T08:21:48.460 回答
1

您可以使用该TestName规则。只需将以下代码添加到您的测试类:

@Rule
public TestName testName = new TestName();

@Before
public void printTestMethod() {
    System.out.println("Running " + testName.getMethodName());
}
于 2019-03-07T14:01:13.770 回答
0

如果您不想创建自己的测试运行器,可以尝试使用堆栈跟踪。

以下方法打印调用它的方法的类和方法名称。

public static void printMethod() {
    System.out.println(Thread.currentThread().getStackTrace()[2]);
}

您必须在每个测试方法中调用此方法。

于 2013-03-05T11:35:08.677 回答
0

添加showoutput="true"导致我的junit测试在测试执行时记录输出:

junit fork="yes" showoutput="true" printsummary="withOutAndErr"
于 2015-07-30T17:00:39.937 回答