【问题标题】:How to print current executing JUnit test method while running all tests in a class or suite using ANT?如何在使用 ANT 运行类或套件中的所有测试时打印当前正在执行的 JUnit 测试方法?
【发布时间】:2013-03-05 11:16:04
【问题描述】:

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

【问题讨论】:

  • 你为什么要这个?
  • 有时,其中一种测试方法似乎挂起。我想动态地知道是哪个测试用例。不过,您认为我们不应该期待这样的功能有什么正当理由吗?
  • 是的,它在一般情况下没有用。它没有提供有价值的信息。在一般情况下,只有测试失败才重要。
  • 哪个版本的 JUnit? 3 还是 4?

标签: java junit ant junit4


【解决方案1】:

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

改用@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() 的记录器。

【讨论】:

  • 目前,我想这是实现我想要的最好和最简单的方法。
  • 这个类在哪里?在 Maven 中为 ex 说
  • @BalajiBoggaramRamanarayan:这不是官方课程。您必须复制到您的代码中。
  • 我的意思是问 - 是否有一个特定的位置可以放置这个类文件。例如:src/test/java 或 src/test/resources。无论如何,我想通了。谢谢:)
  • @pinkpanther 您需要将它添加到每个测试类或将其添加到一个公共基类,然后让每个测试扩展它。
【解决方案2】:

您可以尝试使用formatter,将类型设置为plain。

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

或者

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

【讨论】:

  • 使用&lt;formatter type="plain" usefile="false"/&gt; 仅在执行所有测试后打印摘要。但我需要的是,在执行每个测试时,必须打印测试方法的名称。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

      • 这是对每个测试方法的冗余调用。而且很烦人。
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        相关资源
        最近更新 更多