Ich habe eine Klasse mit einer ToString
-Methode, die XML erzeugt. Ich möchte es Unit testen, um sicherzustellen, dass es gültige XML erzeugt. Ich habe eine DTD, um das XML gegen zu validieren.
Soll ich die DTD als Zeichenfolge in den Komponententest aufnehmen, um eine Abhängigkeit zu vermeiden, oder gibt es dafür eine intelligentere Methode?
Wenn Ihr Programm den XML-Code während der normalen Ausführung gegen die DTD validiert, sollten Sie die DTD nur von wo auch immer Ihr Programm erhält.
Wenn nicht und die DTD ist extrem kurz (nur ein paar Zeilen), dann ist es wahrscheinlich in Ordnung, sie als String in Ihrem Code zu speichern.
Sonst würde ich es in eine externe Datei schreiben und den Unit-Test aus dieser Datei lesen lassen.
Ich habe XmlUnit in der Vergangenheit verwendet und festgestellt, dass es nützlich ist.
Es kann verwendet werden, um XML anhand eines Schemas zu validieren oder das XML mit einem String zu vergleichen. Es ist clever genug, die Parserregeln von XML zu verstehen. Zum Beispiel weiß es, dass "& lt; e1 / & gt;" entspricht "& lt; e1 & gt; & lt; / e1 & gt;" und kann konfiguriert werden, um Whitespace zu ignorieren oder einzuschließen.
Die Verwendung einer DTD im Komponententest, um deren Gültigkeit zu testen, ist eine Sache. Das Testen auf den richtigen Inhalt ist eine andere Sache.
Sie können die DTD verwenden, um nach der Gültigkeit des generierten XML zu suchen, das ich einfach so lesen würde, wie Sie es in Ihrem Programm tun. Ich persönlich würde es nicht inline (als String) aufnehmen; Es besteht immer eine Abhängigkeit zwischen Ihrem Anwendungscode und dem Komponententest. Wenn sich das generierte XML ändert, ändert sich auch die DTD.
Um den richtigen Inhalt zu testen, gehe ich zu XMLUnit .
XML mit XMLUnit bestätigen:
%Vor%Eine Sache, auf die Sie stoßen könnten, ist die Tatsache, dass die generierte XML-Datei sich ändernde Kennungen (id / uid-Attribute oder Ähnliches) enthalten könnte. Dies kann durch die Verwendung eines DifferenceListener behoben werden, wenn die generierte XML-Datei aktiviert wird.
Beispielimplementierung eines solchen DifferenceListeners:
%Vor%mit DifferenceListener:
%Vor%Tags und Links language-agnostic unit-testing xml dtd