从命令行生成JUnit报告

18
我有一个用于云系统测试的设置,它使用Python进行进程级控制和JUnit进行内部状态检查。基本上,我启动几个VM作为云端,然后启动一个JUnit VM,它是云端的成员,但驱动测试并检查内部状态。我们现有的云管理工具由Python驱动,我想保持这种方式。
我有一个工作设置,可以通过命令行运行JUnit。
java -ea -cp <classpath> org.junit.runner.JUnitCore <tests>

但是这并不会产生报告文件。我知道ant能够生成一个xml报告,但我不想在这个过程中涉及到ant(我已经有足够多的部分了)。

是否有一种从命令行启动junit的方法,以便生成报告?

理想情况下,我希望junit测试生成xml报告,python测试生成xml报告,然后将它们合并在一起供我们的CI系统使用。

更新:命令行执行必须支持Windows、Linux和Mac。我们不允许提供外部ant,尽管打包一个内部ant可能是一种选择。


Windows 还是 Unix(以命令行为基础)? - Zack Macomber
1个回答

18
JUnit库没有任何XML输出选项。要实现这样的功能,您需要编写自己的RunListener,它会监听输出,并在您的情况下编写XML文件。
但是,为了获得可以被CI系统读取的正确格式的XML文件,我认为最简单的方法是使用ant,可以通过命令行使用build.xml(JUnitReport)或使用java api:How can i use Apache ANT Programmatically
编辑:最初,我们有四个选项:
  1. 从命令行使用ant
  2. 以编程方式使用ant(使用Java API)
  3. 直接使用XMLJUnitResultFormatter和JUnitCore
  4. 创建一个自定义的RunListener,可以生成正确的XML输出。
鉴于OP添加的限制,我们无法从命令行使用ant,因此排除了1。

在更仔细地查看Ant JUnit任务后,似乎无法与JUnitCore(添加TestListener)一起使用,因为ant直接使用测试类的名称,所以您无法创建桥接类。来自XMLJUnitResultFormatter.java

private void formatError(String type, Test test, Throwable t) {
    ...
    nested.setAttribute(ATTR_TYPE, t.getClass().getName());

    String strace = JUnitTestRunner.getFilteredTrace(t);
    Text trace = doc.createTextNode(strace);
    nested.appendChild(trace);
}

这将消除3。

通过Java API以编程方式调用Ant。我找不到任何最新的文档。这似乎很困难。

因此,最终,我会使用XMLJUnitResultFormatter作为基础,创建一个自定义的RunListener,并将其发布在github.com上,以便正确回答这个问题 :-)


抱歉,我似乎无法显示换行符...如果我理解正确,您建议我应该:1)包括ant jar 2)编写自定义main 3)将ant jar的RunListener添加到JUnitCore实例中 4)让它运行?还是有一个更简短的形式:1)包括ant jar 2)更直接地调用它,它将处理JUnitCore部分? - Matt
1
Ant调用junit,运行测试。因此,您需要提供一个build.xml文件,并调用ant。最简单的方法是确保在系统中某个地方安装了ant,然后只需从命令行执行即可。与java不同的是...您将使用ant... - Matthew Farwell
1
哎呀,我不能执行ant安装的要求。这是来自上级的指示。 - Matt
谢谢,我本来就担心答案会是这样的,但绝对有帮助。 - Matt
8
我在 Schmant 的下载中发现了一个 RunListener,即 AntXmlRunListener。我将所需类提取到 https://github.com/barrypitman/JUnitXmlFormatter 中以便查阅。 - Barry Pitman
显示剩余3条评论

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