我正在使用ant1-9-0.jar
,ant-junit-1.9.0.jar
和ant-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
,但没有成功。你有什么建议吗?
Sysouts
,build.xml
文件,答案 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实现来处理你喜欢的子进程的输出。