gpt4 book ai didi

java - 每个测试为 Jenkins 上的 JUnit 测试套件分离了 stdout/stderr

转载 作者:太空宇宙 更新时间:2023-11-04 10:24:20 27 4
gpt4 key购买 nike

如何指示 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 会生成一个简洁的 XML 文件,供 CI 进一步处理(发布)。不幸的是,所有 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 功能?

最佳答案

JUnit 似乎没有内置方法可以通过 Ant 执行此操作。我最终自己实现了这个功能。

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

不幸的是,@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 版本完全可以做到这一点。

关于java - 每个测试为 Jenkins 上的 JUnit 测试套件分离了 stdout/stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50720732/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com