在 JUnit XML 结果文件中对来自 Spock 的 @Unroll 测试进行分组(或合并)

问题描述 投票:0回答:1

我有一个 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: &quot;10&quot)" ...>
    </test>
    <test name="Com.Acme.SomeClass.Tests.SomeTestName(someParam: &quot;11&quot)" ...>
    </test>
    ...
</collection>

但是,欢迎使用任何解决方案来保留通用命名的测试与所有测试运行之间的关系(即,如果只有一个测试运行失败,则报告测试失败),无论是通过配置 JUnit 输出还是通过某些 Spock特点。

更新

正如 @leonard-brünings 指出的:构建工具在这里很有趣,因为它产生所述输出。我目前使用 Gradle 8.5(Groovy 3.0.17、Spock 2.4-M4-groovy-4.0),配置如下:

test { reports { junitXml.required = true html.required = true } useJUnitPlatform() }
我在这个方向上搜索了一下,找到了像 

mergeReruns

 这样的设置(听起来很有用,但用于失败然后重试运行?)和像 
测试报告聚合插件 这样的插件(按类型聚合,而不是按测试用例聚合?) 这里。所以至少这些没有帮助。

junit junit5 spock
1个回答
0
投票
似乎

@Unroll

 自 Spock 2.x 以来已过时
:

不再需要不带参数的简单

@Unroll

 [...],因此可以从现有代码中删除任何简单的 
@Unroll
 注释。

但是/和:现在有

@Rollup

,它现在报告一个 
<testcase>
,这就是我正在寻找的。

缺点:这些汇总测试也不会单独显示在 IDE 中;测试名称中的所有

#myParam1

 占位符现在也已过时(我猜)。

© www.soinside.com 2019 - 2024. All rights reserved.