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>