JUnit Ant任务不会输出到屏幕

时间:2013-08-08 16:06:28

标签: java ant junit

上下文

我正在使用ant1-9-0.jarant-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个文件中。

问题

我需要将输出打印到控制台,因为我想要实时结果(不仅仅是在整个过程结束时)。为此,我在/** 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文件,
  • 如果需要,
  • here是Apache Ant JUnit存储库。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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实现来处理你喜欢的子进程的输出。