我正在使用 XQuery 分析两组具有相同 XML 结构的测试结果。下面的函数创建了一组新元素,它们是两个结果集的测试用例的单独比较。对于每个测试用例,这两组应该有 1-1 的关系,但我的代码有时会产生 8 个比较,我不知道为什么!
这是用于具有不同数据的两组的输入 XML(例如缩写):
<tests>
<test-group name="TestA">
<test-case name="CaseA1" success="true"/>
<test-case name="CaseA2" success="false"/>
<test-case name="CaseA3" success="true"/>
</test-group>
<test-group name="TestB">
<test-case name="CaseB1" success="false"/>
<test-case name="CaseB2" success="false"/>
<test-case name="CaseB3" success="true"/>
</test-group>
<test-group name="TestC">
<test-case name="CaseC1" success="false"/>
<test-case name="CaseC2" success="false"/>
<test-case name="CaseC3" success="true"/>
</test-group>
</tests>
样本输出:
<test-state delta1="15" delta2="false" isPass="true" fixture="TestA" case="CaseA1"/>
<test-state delta1="12" delta2="true" isPass="false" fixture="TestA" case="CaseA1"/>
<test-state delta1="5" delta2="false" isPass="true" fixture="TestA" case="CaseA1"/>
<test-state delta1="15" delta2="false" isPass="true" fixture="TestC" case="CaseC1"/>
<test-state delta1="12" delta2="true" isPass="false" fixture="TestC" case="CaseC1"/>
<test-state delta1="5" delta2="false" isPass="true" fixture="TestC" case="CaseC1"/>
这是我的 Xquery(例如已修改):
declare function app:runReport() {
let $new-run := collection('collection1')
let $old-run := collection('collection2')
return
<report>
{
for $new-case in $new-run//test-case,
$old-case in $old-run//test-case
where $new-case/@name = $old-case/@name and $new-case/../@name = $old-case/../@name
return
let $new-msg := xs:string($new-case/message)
let $old-msg := xs:string($old-case/message)
let $new-len := string-length($new-msg)
let $old-len := string-length($old-msg)
let $msg-dif := $new-len - $old-len
let $delta1 := fn:compare(xs:string($new-case/@success),xs:string($old-case/@success)) = 0
let $delta2 := abs($msg-dif)
return
<test-state
delta1="{$delta1}"
delta2="{$delta2}"
isPass="{$new-case/@success}"
fixture="{$new-case/../@name}"
case="{$new-case/@name}"
path="unknownPath"/>
}
</report>
};
在我看来,它对 $new-case 和 $old-case 之间的每个组合进行了排列,但我不知道为什么。我会尝试过滤掉重复项,但它们不是完全相同的重复项,有时似乎使用 $old-case 代替 $new-case。