Java 如何在使用ANT运行类或套件中的所有测试时打印当前正在执行的JUnit测试方法?
我有一组JUnit测试用例,我使用任务从ANT执行它们。在执行测试时,在控制台中,我只能看到当前正在运行的测试用例(即Java类),而不能看到测试方法。有没有一种方法可以打印当前正在执行的测试方法?或者,除了拥有自己的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] 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您需要将它添加到每个测试类或添加到公共基类,然后让每个测试扩展它。这是对每个测试方法的冗余调用。而且很烦人。