1

XQuery を使用して、同じ XML 構造を持つ 2 つのテスト結果セットを分析しています。以下の関数は、2 つの結果セットのテスト ケースの個別の比較である要素の新しいセットを作成します。テスト ケースごとに、2 つのセットに 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 の間のすべての組み合わせの順列を作成しているように見えますが、その理由はわかりません。重複を除外しようとしますが、正確な重複ではありません。$new-case の代わりに $old-case を使用しているようです。

4

2 に答える 2