J'essaie d'écrire un test automatisé d'une application qui traduit essentiellement un format de message personnalisé en un message XML et l'envoie à l'autre extrémité. J'ai un bon ensemble de paires de messages d'entrée / sortie, donc tout ce que je dois faire est d'envoyer les messages d'entrée et d'écouter le message XML pour sortir de l'autre côté.
Quand vient le temps de comparer la sortie réelle à la sortie attendue, je rencontre des problèmes. Ma première pensée a été de faire des comparaisons de chaînes sur les messages attendus et réels. Cela ne fonctionne pas très bien car les données d'exemple que nous avons ne sont pas toujours formatées de manière cohérente et il y a souvent des alias différents utilisés pour l'espace de noms XML (et parfois les espaces de noms ne sont pas du tout utilisés.)
Je sais que je peux analyser les deux chaînes, puis parcourir chaque élément et les comparer moi-même et cela ne serait pas trop difficile à faire, mais j'ai l'impression qu'il existe une meilleure méthode ou une bibliothèque que je pourrais exploiter.
Donc, résumée, la question est:
Étant donné deux chaînes Java qui contiennent toutes deux du XML valide, comment allez-vous déterminer si elles sont sémantiquement équivalentes? Points bonus si vous avez un moyen de déterminer quelles sont les différences.
Les éléments suivants vérifieront si les documents sont égaux à l'aide des bibliothèques JDK standard.
normaliser () est là pour s'assurer qu'il n'y a pas de cycles (il n'y en aurait techniquement pas)
Le code ci-dessus exigera que les espaces blancs soient les mêmes dans les éléments, car il les conserve et les évalue. L'analyseur XML standard fourni avec Java ne vous permet pas de définir une fonctionnalité pour fournir une version canonique ou de comprendre
xml:space
si cela va être un problème, vous devrez peut-être un analyseur XML de remplacement tel que xerces ou utiliser JDOM.la source
setIgnoringElementContentWhitespace(false)
Xom possède un utilitaire Canonicalizer qui transforme vos DOM en une forme régulière, que vous pouvez ensuite filtrer et comparer. Ainsi, indépendamment des irrégularités des espaces blancs ou de l'ordre des attributs, vous pouvez obtenir des comparaisons régulières et prévisibles de vos documents.
Cela fonctionne particulièrement bien dans les IDE qui ont des comparateurs visuels de chaînes dédiés, comme Eclipse. Vous obtenez une représentation visuelle des différences sémantiques entre les documents.
la source
La dernière version de XMLUnit peut aider à affirmer que deux XML sont égaux. Aussi
XMLUnit.setIgnoreWhitespace()
etXMLUnit.setIgnoreAttributeOrder()
peut être nécessaire pour le cas en question.Voir le code de travail d'un exemple simple d'utilisation d'unité XML ci-dessous.
Si vous utilisez Maven, ajoutez ceci à votre
pom.xml
:la source
Merci, j'ai étendu cela, essayez ceci ...
la source
S'appuyer sur Tom la réponse de , voici un exemple utilisant XMLUnit v2.
Il utilise ces dépendances maven
..et voici le code de test
La documentation qui décrit cela est https://github.com/xmlunit/xmlunit#comparing-two-documents
la source
skaffman semble donner une bonne réponse.
une autre façon est probablement de formater le XML à l'aide d'un utilitaire de ligne de commande comme xmlstarlet ( http://xmlstar.sourceforge.net/ ), puis de formater les deux chaînes, puis d'utiliser n'importe quel utilitaire diff (bibliothèque) pour différencier les fichiers de sortie résultants. Je ne sais pas si c'est une bonne solution lorsque les problèmes concernent les espaces de noms.
la source
AssertJ 1.4+ a des assertions spécifiques pour comparer le contenu XML:
Voici la documentation
la source
J'utilise Altova DiffDog qui a des options pour comparer structurellement les fichiers XML (en ignorant les données de chaîne).
Cela signifie que (si vous cochez l'option «ignorer le texte»):
et
sont égaux dans le sens où ils ont une égalité structurelle. C'est pratique si vous avez des fichiers d'exemple qui diffèrent en données, mais pas en structure!
la source
Cela comparera les XML de chaîne complète (en les reformatant en cours de route). Il facilite le travail avec votre IDE (IntelliJ, Eclipse), car il vous suffit de cliquer et de voir visuellement la différence dans les fichiers XML.
Je préfère cela à XmlUnit car le code client (code de test) est plus propre.
la source
Le code ci-dessous fonctionne pour moi
la source
Utiliser JExamXML avec une application Java
la source
J'ai exigé la même fonctionnalité que celle demandée dans la question principale. Comme je n'étais pas autorisé à utiliser des bibliothèques tierces, j'ai créé ma propre solution basée sur la solution @Archimedes Trajano.
Voici ma solution.
Il compare deux chaînes XML et prend en charge les mappages d'espaces de noms incompatibles en les convertissant en valeurs uniques dans les deux chaînes d'entrée.
Peut être affiné, c'est-à-dire en cas de traduction d'espaces de noms. Mais pour mes besoins fait juste le travail.
la source
Puisque vous dites «sémantiquement équivalent», je suppose que vous voulez dire que vous voulez faire plus que simplement vérifier que les sorties xml sont (chaîne) égales et que vous voudriez quelque chose comme
<foo> quelques trucs ici </foo> </code>
et
<foo> quelques trucs ici </foo> </code>
lire comme équivalent. En fin de compte, la façon dont vous définissez "sémantiquement équivalent" sur n'importe quel objet à partir duquel vous reconstituez le message aura de l'importance. Créez simplement cet objet à partir des messages et utilisez un égal personnalisé () pour définir ce que vous recherchez.
la source