7

语境

我正在使用ant1-9-0.jar,ant-junit-1.9.0.jarant-launcher-1.9.0.jar以编程方式运行 JUnit 测试。

在我的代码中,我有一个返回JUnit Task的函数:

/**
 * Generates a JUnit task which runs every single test in a new JVM
 * @return task The JUnit task
 * @throws Exception
 */
public JUnitTask generateRunTestsTask() throws Exception {
    /* New JUnit task */
    JUnitTask task = new JUnitTask();
    task.init();
    
    /* Summary settings */
    JUnitTask.SummaryAttribute sa = new JUnitTask.SummaryAttribute();
    sa.setValue("withOutAndErr");
    task.setPrintsummary(sa);
    
    /* JVM configuration */
    task.setFork(true);
    task.setDir(new File(this.deliveryBinDir));
    task.createJvmarg().setValue("-Duser.dir=" + this.deliveryBinDir);
    
    /* Output to file */
    FormatterElement.TypeAttribute typeFile = new FormatterElement.TypeAttribute();
    typeFile.setValue("xml");
    FormatterElement formatToFile = new FormatterElement();
    formatToFile.setType(typeFile);
    task.addFormatter(formatToFile);
    
    /* Task options */
    task.setHaltonfailure(false);
    task.setShowOutput(true);
    task.setOutputToFormatters(true);
    
    List<String> testSuites = getTestJarList(this.deliveryLibFolder);
    for (String singleSuite : testSuites) {
        JUnitTest test = new JUnitTest(singleSuite);
        /* Sets reports location */
        test.setTodir(this.testReportsFolder);
        task.addTest(test);
    }
    
    return task;
}

JUnit 测试运行没有问题,并且输出成功存储到.xml文件中。

问题

我需要将输出打印到控制台,因为我想要实时结果(不仅仅是在整个过程结束时)。为此,我FormatterElement在块下方添加了第二个/** Output to file */

/* Output to screen */
FormatterElement.TypeAttribute typeScreen = new FormatterElement.TypeAttribute();
typeScreen.setValue("plain");
FormatterElement formatToScreen = new FormatterElement();
formatToScreen.setType(typeScreen);
formatToScreen.setUseFile(false);
formatToScreen.setOutput(System.out);
task.addFormatter(formatToScreen);

但我的控制台仍然不显示日志。我也尝试删除formatToFile FormatterElement,但没有成功。你有什么建议吗?

笔记:

  • 这些单元测试确实需要分叉,不能更改,
  • 如果您需要更多代码,请告诉我,例如Ant ProjectAnt Target的设置,
  • 单元测试确实Sysouts包含
  • 我已经复制了一个build.xml有效的一致文件,
  • 如果需要,这里是 Apache Ant JUnit 存储库。
4

2 回答 2

4

Stéphane,您的 junit 任务代码似乎对于处理控制台的输出是正确的。

我已经检查了 ANT 的 Main 类的源代码,您需要定义一个构建侦听器才能显示日志。

这是为记录目的定义默认侦听器的工作示例:

BuildLogger logger = new DefaultLogger();
logger.setOutputPrintStream(System.out);
logger.setErrorPrintStream(System.err);
logger.setMessageOutputLevel(Project.MSG_INFO);
logger.setEmacsMode(true);
project.addBuildListener(logger); //add build listener to your define project
于 2013-08-14T10:21:52.920 回答
0

Stéphane,缺少单元测试输出可能与 JUnitTask.executeAsForked() 中存在这个硬编码的子流程流处理程序有关(参见 ant-junit 的源代码):

    Execute execute = new Execute(
        new JUnitLogStreamHandler(
            this,
            Project.MSG_INFO,
            Project.MSG_WARN),
        watchdog);

该方法是私有的,我没有看到明显的“官方”方式来传递另一个流处理程序,所以如果你真的想以不同的方式处理分叉的 JVM 的输出,你可能可以利用 ant-junit 是开源的这一事实,并且创建一个稍微修改的版本,或者使用更详细的 JUnitLogStreamHandler 设置,或者甚至使用您自己的 ExecuteStreamHandler 实现来处理您喜欢的子进程的输出。

于 2013-08-13T20:23:49.400 回答