对于Jenkins上的JUnit测试套件,每个测试分隔stdout / stderr

时间:2018-06-06 12:44:13

标签: java jenkins junit ant

如何指示JUnit(通过Ant)在测试套件中捕获每个测试的sdout和stderr?这甚至可能吗?

假设我有一个简单的Ant任务,它运行一系列详细的JUnit测试。

<target name="integration-tests" depends="init">
    <property name="test.reports" value="${build.dir}/test-reports" />
    <mkdir dir="${test.reports}" />
    <junit showoutput="true" printsummary="yes" fork="yes">
        <formatter type="xml" />
        <classpath>
            <pathelement path="${run.test.classpath}" />
        </classpath>
        <test name="org.example.IntegrationTestsTestSuite" todir="${test.reports}" />
    </junit>
</target>

当CI(在我的案例中为Jenkins)调用此目标时,JUnit会为CI生成一个整齐的XML文件,以便进一步处理(发布)。不幸的是,所有stdout和stderr都合并为两个XML元素的值。

<?xml version="1.0" encoding="UTF-8" ?>
<testsuite errors="0" failures="0" hostname="foo-host" name="org.example.IntegrationTestsTestSuite" skipped="0" tests="3" time="0.115" timestamp="2018-06-06T11:45:45">
  <properties>
    <!-- all properties used by Ant build script here -->
  </properties>
  <testcase classname="org.example.integration.tests.CommonStuff" name="testSomeFooDoingAThing" time="0.088" />
  <testcase classname="org.example.integration.tests.CommonStuff" name="testOtherFooDoingAThing" time="0.023" />
  <testcase classname="org.example.integration.tests.CommonStuff" name="testAnotherFooDoingAThing" time="0.004" />
  <system-out><![CDATA[]]></system-out>
  <system-err><![CDATA[]]></system-err>
</testsuite>

如果一次测试出现问题,即使是成功测试之一(查看单个失败的测试时),CI也会立即显示整个详细输出,从而无法实现此类输出的预期目的。

在我们的IDE(Netbeans)中运行测试时存在同样的问题。但我记得在其他项目中,至少IntelliJ能够在每个测试中显示这样的详细输出(不确定它是否适用于测试套件)。 IntelliJ是做其他事情来发布/预处理输出还是这是一个JUnit功能?

1 个答案:

答案 0 :(得分:0)

似乎没有一种内置的方式让JUnit通过Ant来实现这一点。我最终自己实现了这个功能。

根据@ Mikhail的建议,我查看了@Rule注释,它引导我进入JUnit的TestWatcher课程。它可以用于以编程方式处理测试报告(它是单个测试方法的状态事件的观察者,如“开始”,“失败”,“完成”等)。

不幸的是,@ Rule注释无法轻松应用于整个测试套件,因为它旨在用于出现测试方法的地方。我必须在包含测试用例的每个类中实现custom Suite and Runner和@Rule的虚假存在(在Runner实现中通过RunRules)。

之后,我只是看看JUnit XML report是如何构建的,使用TestWatcher收集所有必需的测试统计信息和输出(当测试方法启动时,只需调用System.setOut()System.setErr() ,然后在测试结束后恢复那些)并自己编写报告文件。

Ant任务不再需要<formatter>元素,因为它只需要调用现在隐式处理它的Suite定义。但是我使用<sysproperty>将目录名称传递给自定义套件,因此它知道通过System.getProperty(String)存储生成的文件的位置。

使用JUnit 4.12版本完全可行。