JUnit Ant任务不会输出到屏幕

7

上下文

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

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

/**
 * 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`文件中。
问题:
我需要将输出打印到控制台,因为我希望能够实时得到结果(而不仅仅在整个过程结束时)。为此,在`/** Output to file */`块下方添加了第二个`FormatterElement`
/* 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存储库(如果需要)。

你尝试过移除formatToScreen.setOutput(System.out)并使用默认值(应该是System.out,但为了确保一下)。这里有一些可能有帮助的东西,FormatterElement的源代码。http://grepcode.com/file/repository.springsource.com/org.apache.ant/com.springsource.org.apache.tool.ant.taskdefs.optional.junit/1.7.1/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java#FormatterElement - dseibert
我之前已经尝试过这个了。现在我又删除了对 setOutput 的调用,但是没有任何改变。我还删除了默认为 truesetShowOutput(true)setOutputToFormatters(true) - Stéphane Bruckert
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

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 实现来处理子进程的输出,以您喜欢的方式处理。

通过反射,您也可以调用私有方法。 - AlexWien
真的,Alex。不幸的是,Stéphane 不仅需要调用一个私有方法,而是需要修改其内容。具体来说,他需要将另一个流处理程序传递给用于运行分叉进程的本地 Execute 变量。原则上有热交换代码的选项(请参见 https://dev59.com/lm455IYBdhLWcg3wFP9u),但我认为更实际的做法是简单地修改 ant-junit 库(然后可能向库开发团队提出补丁建议)。 - user589555

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接