XFA-Daten von zwei PDF-Dokumenten miteinander komplett zu vergleichen, ist insofern nicht sinnvoll, weil sie meistens ein Erstellungs- und Änderungsdatum enthalten. Deshalb bietet PDFUnit den Vergleich von XFA-Daten auf der Basis von XPath-Ausdrücken an.
Folgendes Tag steht für Tests zur Verfügung:
<!-- Tag to compare XFA data: --> <haveSameXFAData />
Das Ergebnis der XPath-Auswertung muss für beide PDF-Dokumente identisch sein:
<testcase name="haveSameXFAData_ResulttypeNode"> <assertThat testDocument="test/test.pdf" masterDocument="master/master.pdf" > <haveSameXFAData> <matchingXPath expr="//default:pageSet" withResultType="NODE" defaultNamespace="http://www.xfa.org/schema/xfa-template/2.6/" /> </haveSameXFAData> </assertThat> </testcase>
Wie das Beispiel zeigt, muss der erwartete Ergebnistyp angegeben werden.
Die verfügbaren Ergebnistypen sind als Konstanten für das Attribut
withResultType
definiert. Es sind:
<!-- Result types for XPath-processing: -->
withResultType="BOOLEAN"
withResultType="NUMBER"
withResultType="NODE"
withResultType="NODESET"
withResultType="STRING"
Whitespaces bleiben beim Vergleich unberücksichtigt.
Werden zwei Dokumente verglichen, die beide keine XFA-Daten enthalten, wirft PDFUnit eine Exception. Es macht keinen Sinn, etwas zu vergleichen, das es nicht gibt.
Die XPath-Ausdrücke dürfen auch XPath-Funktionen enthalten:
<testcase name="haveSameXFAData_ResulttypeBoolean"> <assertThat testDocument="test/test.pdf" masterDocument="master/master.pdf" > <haveSameXFAData> <matchingXPath expr="count(//default:field) = 3" withResultType="BOOLEAN" defaultNamespace="http://www.xfa.org/schema/xfa-template/2.6/" /> </haveSameXFAData> </assertThat> </testcase>
Test mit „boolean“ als erwartetem Ergebnistyp
(BOOLEAN
) sind insofern kritisch, weil in XPath
nicht zwischen „nicht gefunden“ und „false“
unterschieden werden kann.
Eine ausführliche Beschreibung für das Arbeiten mit XPath in PDFUnit steht in Kapitel 8: „XPath-Einsatz“.
Beachten Sie den Umgang mit dem Default-Namensraum. Er muss mit dem Attribut
defaultNamespace=".."
deklariert werden, denn eine automatische
Erkennung ist nicht möglich, weil ein XML-Dokument prinzipiell mehrere
Default-Namensräume haben kann.
Sie können mehrere XPath-Vergleiche in einem Test ausführen, sogar mit wechselndem Default-Namensraum. Überlegen Sie sich aber, ob Sie den folgenden Test nicht lieber in einzelne Tests aufteilen:
<!-- Test with multiple XPath expressions. It is not recommended to create tests in this way. But PDFUnit has to ensure that it works. --> <testcase name="haveSameXFAData_MultipleDefaultNamespaces"> <assertThat testDocument="test/test.pdf" masterDocument="master/master.pdf" > <haveSameXFAData> <matchingXPath expr="//default:agent/@name[.='designer']" withResultType="BOOLEAN" defaultNamespace="http://www.xfa.org/schema/xci/2.6/" /> <matchingXPath expr="//default:subform/@name[.='movie']" withResultType="BOOLEAN" defaultNamespace="http://www.xfa.org/schema/xfa-template/2.6/" /> <matchingXPath expr="//default:locale/@name[.='nl_BE']" withResultType="BOOLEAN" defaultNamespace="http://www.xfa.org/schema/xfa-locale-set/2.7/" /> </haveSameXFAData> </assertThat> </testcase>