2008-11-09 9 views
9

J'ai un tas de tests unitaires qui ont besoin de vérifier les sorties XML.La meilleure façon de comparer 2 documents XML dans .NET

J'ai commencé à comparer des chaînes de caractères, mais cela ne va pas évoluer à mesure que le formatage et les différences superficielles se mettent en travers.

Quel est le moyen le plus simple pour évaluer si le XML généré est sémantiquement identique à ce que le test attend?

Fermé en double de How would you compare two XML Documents?

+0

Même question [ici] (http://stackoverflow.com/questions/167946/how-would-you-compare-two-xml-documents). –

Répondre

11

Microsoft propose ses outils XML Diff/classes here. Je ne l'ai pas personnellement utilisé, mais il semble que ça va commencer:

« En utilisant la classe xmldiff, le programmeur est en mesure de déterminer si les deux fichiers sont en fait différents basés sur les conditions qui sont importantes à leur application »

il semble faire face à différentes commandes, l'espacement, les préfixes d'espace de noms, etc.

5

C'est l'un de ces problèmes qui sonne comme ça va être facile à commencer w mais, plus vous creusez, plus vous trouvez de profondeur dans l'espace du problème.

Il existe un certain nombre d'outils pré-existants qui feront des diffs xml - à la fois dans une interface graphique (dans le même esprit que les outils de diff textuels), et pilotés par la ligne de commande. d être après). XMLDiff est un tel cas, comme cela a déjà été mentionné. Les problèmes commencent lorsque vous posez des questions telles que: que dois-je produire? Voulez-vous juste un code de retour qui dit si elles sont identiques ou différentes (à des fins de test unitaire, cela peut être suffisant) - ou voulez-vous un rapport qui vous indique quelles sont les différences? (pourrait également être utile pour les tests unitaires si vous voulez trouver quel est le problème)? Si ce dernier, comment voulez-vous cette information? Voulez-vous modifier la distance? Voulez-vous interpréter les valeurs numériques et vous dire la différence entre elles?

Qu'en est-il de la commande des nœuds? Est-ce que les nœuds enfants doivent être dans un ordre particulier - ou s'il s'agit des mêmes nœuds mais dans un ordre différent, est-ce correct?

Vous voudrez probablement aussi spécifier ce que vous souhaitez comparer. Les espaces de noms doivent-ils correspondre? L'espace est-il significatif n'importe où? Y a-t-il certains nœuds que vous voulez toujours ignorer (par exemple un attribut "temps"), ou voulez-vous un contrôle plus fin sur quels nœuds sont comparés et lesquels ne le sont pas?

Pour les comparaisons numériques, voulez-vous tenir compte des tolérances? Pour les comparaisons textuelles (nœuds de texte), l'espace dans est-il significatif? Qu'en est-il de la capitalisation?

Et vous pouvez continuer encore et encore (comme je l'ai fait dans une analyse pour un tel projet où je travaille récemment). Chaque outil aborde ces problèmes à différents degrés et de différentes manières.

Vous pouvez décider de le garder aussi simple que possible et opter pour quelque chose qui effectue une comparaison directe, nœud par noeud, sans interprétation - et à la fin, vous dire si elles sont identiques ou différentes. Je crois que xmldiff vous donnera cela (et un peu plus). Si vous voulez gérer des cas tels que des ordres de nœuds différents ou ignorer certaines branches, vous pouvez appliquer une transformation xslt à votre document de test avant la comparaison, pour le normaliser en fonction de vos règles.

Questions connexes