Java 如何在使用ANT运行类或套件中的所有测试时打印当前正在执行的JUnit测试方法?

Java 如何在使用ANT运行类或套件中的所有测试时打印当前正在执行的JUnit测试方法?,java,junit,ant,junit4,Java,Junit,Ant,Junit4,我有一组JUnit测试用例,我使用任务从ANT执行它们。在执行测试时,在控制台中,我只能看到当前正在运行的测试用例(即Java类),而不能看到测试方法。有没有一种方法可以打印当前正在执行的测试方法?或者,除了拥有自己的JUnit测试运行程序之外,还有其他方法可以做到这一点吗 控制台输出示例 [junit] Running examples.TestCase1 [junit] Tests run: 3, Failures: 0, Errors: 0, Time elapsed: 2.835 sec

我有一组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

如果不想创建自己的测试运行程序,可以尝试使用stacktrace

下面的方法打印调用它的方法的类和方法名

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

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

您可以通过将type设置为plain来尝试使用
格式化程序

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


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

不幸的是,没有很好的方法连接到junit。对于一个用TDD开发的框架来说,它是令人惊讶的敌意

改用
@规则

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

}
import org.junit.rules.TestWatcher;
导入org.junit.runner.Description;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
/**
*记录当前正在运行的测试。
* 
*典型用法:
* 
*{@code@Rule public LogTestName LogTestName=new LogTestName();}
*
*另见:
*
{@link org.junit.Rule} *
{@link org.junit.rules.TestWatcher} */ 公共类LogTestName扩展了TestWatcher{ 私有最终静态记录器log=LoggerFactory.getLogger(“junit.logTestName”); @凌驾 受保护的无效启动(说明){ debug(“Test{}”,description.getMethodName()); } }
注:

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

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

如果您不想这样做,那么只需获取用于
说明的记录器。getTestClass()

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

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

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

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

@Rule
public TestName testName = new TestName();

@Before
public void printTestMethod() {
    System.out.println("Running " + testName.getMethodName());
}

你为什么要这样做?有时,其中一种测试方法似乎挂起了钩。我想动态地知道这是哪个测试用例。然而,你认为我们不应该期待这样一个特性有什么正当的理由吗?是的,它在一般情况下没有用处。它没有提供有价值的信息。在一般情况下,什么测试失败才重要。哪个版本的JUnit?3或4?使用
仅在执行所有测试后打印摘要。但我需要的是,在执行每个测试时,必须打印测试方法的名称。现在,我想这是实现我想要的最好、最简单的方法。这个类驻留在哪里?替我说maven@BalajiBoggaramRamanarayan当前位置这不是正式课程。你必须复制到你的代码中。我的意思是问-是否有一个特定的位置来放置这个类文件。例如:src/test/java或src/test/resources。不管怎样,我明白了。谢谢:)@pinkpather您需要将它添加到每个测试类或添加到公共基类,然后让每个测试扩展它。这是对每个测试方法的冗余调用。而且很烦人。