如何指示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功能?
答案 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版本完全可行。