我有一个 Spock
@Unroll
测试,如下所示:
@Unroll
def 'A session uses the TLS protocol #enabledProtocolsOfSocket #protocolOfSession'() {
given:
// ...
expect:
// ...
where:
enabledProtocolsOfSocket | protocolOfSession
["TLSv1.3"] | "TLSv1.3"
["TLSv1.2", "TLSv1.3"] | "TLSv1.3"
["TLSv1.2"] | "TLSv1.2"
["TLSv1.2", "TLSv1.1"] | "TLSv1.2"
["TLSv1.1", "TLSv1.2"] | "TLSv1.2"
["TLSv1.1"] | "NONE"
["TLSv1"] | "NONE"
["TLSv1", "TLSv1.1"] | "NONE"
["TLSv1.1", "TLSv1"] | "NONE"
}
这会导致此 JUnit 结果 XML:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.acme.TlsProtocolSpec" tests="9" skipped="0" failures="0" errors="0" timestamp="2024-07-19T17:23:47" hostname="acme-build5eb650" time="0.403">
<properties/>
<testcase name="A session uses the TLS protocol [TLSv1.3] TLSv1.3" classname="com.acme.TlsProtocolSpec" time="0.081"/>
<testcase name="A session uses the TLS protocol [TLSv1.2, TLSv1.3] TLSv1.3" classname="com.acme.TlsProtocolSpec" time="0.037"/>
<testcase name="A session uses the TLS protocol [TLSv1.2] TLSv1.2" classname="com.acme.TlsProtocolSpec" time="0.084"/>
<testcase name="A session uses the TLS protocol [TLSv1.2, TLSv1.1] TLSv1.2" classname="com.acme.TlsProtocolSpec" time="0.07"/>
<testcase name="A session uses the TLS protocol [TLSv1.1, TLSv1.2] TLSv1.2" classname="com.acme.TlsProtocolSpec" time="0.071"/>
<testcase name="A session uses the TLS protocol [TLSv1.1] NONE" classname="com.acme.TlsProtocolSpec" time="0.014"/>
<testcase name="A session uses the TLS protocol [TLSv1] NONE" classname="com.acme.TlsProtocolSpec" time="0.013"/>
<testcase name="A session uses the TLS protocol [TLSv1, TLSv1.1] NONE" classname="com.acme.TlsProtocolSpec" time="0.013"/>
<testcase name="A session uses the TLS protocol [TLSv1.1, TLSv1] NONE" classname="com.acme.TlsProtocolSpec" time="0.013"/>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>
问题是:我无法在结果文件后处理中将这些结果映射到测试 - 没有名为
A session uses the TLS protocol #enabledProtocolsOfSocket #protocolOfSession
的结果(由于占位符),并且没有名为 A session uses the TLS protocol [TLSv1.2, TLSv1.3] TLSv1.3
或 ... 或 的测试。 ..(由于占位符被替换)。
是否有一些功能可以将这些测试运行“分组”或“合并”成一个结果,命名为测试?我正在考虑类似于 xUnit 的
<collection>
Element 的东西,它为每个测试运行包含一个 <test>
子节点,如下所示:
<collection total="9" passed="9" failed="0" skipped="0" name="Test collection for Com.Acme.SomeClass.Tests.SomeTestName" time="0.484">
<test name="Com.Acme.SomeClass.Tests.SomeTestName(someParam: "10")" ...>
</test>
<test name="Com.Acme.SomeClass.Tests.SomeTestName(someParam: "11")" ...>
</test>
...
</collection>
但是,欢迎使用任何解决方案来保留通用命名的测试与所有测试运行之间的关系(即,如果只有一个测试运行失败,则报告测试失败),无论是通过配置 JUnit 输出还是通过某些 Spock特点。
更新
test {
reports {
junitXml.required = true
html.required = true
}
useJUnitPlatform()
}
我在这个方向上搜索了一下,找到了像 mergeReruns
这样的设置(听起来很有用,但用于失败然后重试运行?)和像测试报告聚合插件 这样的插件(按类型聚合,而不是按测试用例聚合?) 这里。所以至少这些没有帮助。
自 Spock 2.x 以来已过时:
不再需要不带参数的简单但是/和:现在有
@Unroll
[...],因此可以从现有代码中删除任何简单的@Unroll
注释。
@Rollup
,它现在报告一个
<testcase>
,这就是我正在寻找的。缺点:这些汇总测试也不会单独显示在 IDE 中;测试名称中的所有
#myParam1
占位符现在也已过时(我猜)。