Question

J'ai un cours avec un ToString méthode qui produit du XML.Je souhaite le tester unitairement pour m'assurer qu'il produit du XML valide.J'ai une DTD pour valider le XML.

Dois-je inclure la DTD sous forme de chaîne dans le test unitaire pour éviter une dépendance dessus, ou existe-t-il un moyen plus intelligent de procéder ?

Était-ce utile?

La solution

Si votre programme valide le XML par rapport à la DTD lors d'une exécution normale, vous devez simplement obtenir la DTD à partir de l'endroit où votre programme l'obtiendra.

Si ce n'est pas le cas et que la DTD est extrêmement courte (seulement quelques lignes), alors la stocker sous forme de chaîne dans votre code est probablement acceptable.

Sinon, je le mettrais dans un fichier externe et demanderais à votre test unitaire de le lire à partir de ce fichier.

Autres conseils

j'ai utilisé UnitéXml dans le passé et je l'ai trouvé utile.

Il peut être utilisé pour valider XML par rapport à un schéma ou comparer votre XML à une chaîne.Il est suffisamment intelligent pour comprendre les règles d'analyse XML.Par exemple, il sait que "<e1/>" est équivalent à "<e1></e1>" et peut être configuré pour ignorer ou inclure des espaces.

Utiliser une DTD dans le test unitaire pour tester sa validité est une chose, tester le contenu correct en est une autre.

Vous pouvez utiliser la DTD pour vérifier la validité du XML généré que je lirais simplement comme vous le faites dans votre programme.Personnellement, je ne l'inclurais pas en ligne (sous forme de chaîne) ;il existe toujours une dépendance entre votre code d'application et le test unitaire.Lorsque le XML généré change, la DTD changera également.

Pour tester le contenu correct, j'irais UnitéXML.

Affirmation de XML à l'aide de XMLUnit :

XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true);

Diff diff = new Diff(expectedDocument, obtainedDocument);
XMLAssert.assertXMLIdentical("xml invalid", diff, true);

Une chose que vous pourriez rencontrer est le fait que le XML généré peut contenir des identifiants changeants (attributs id/uid ou similaires).Ceci peut être résolu en utilisant un DifférenceListener lors de l'affirmation du fichier XML généré.

Exemple d'implémentation d'un tel DifferenceListener :

public class IgnoreVariableAttributesDifferenceListener implements DifferenceListener {

    private final List<String> IGNORE_ATTRS;
    private final boolean ignoreAttributeOrder;

    public IgnoreVariableAttributesDifferenceListener(List<String> attributesToIgnore, boolean ignoreAttributeOrder) {
        this.IGNORE_ATTRS = attributesToIgnore;
        this.ignoreAttributeOrder = ignoreAttributeOrder;
    }

    @Override
    public int differenceFound(Difference difference) {
        // for attribute value differences, check for ignored attributes
        if (difference.getId() == DifferenceConstants.ATTR_VALUE_ID) {
            if (IGNORE_ATTRS.contains(difference.getControlNodeDetail().getNode().getNodeName())) {
                return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
            }
        }
        // attribute order mismatch (optionally ignored)
        else if (difference.getId() == DifferenceConstants.ATTR_SEQUENCE_ID && ignoreAttributeOrder) {
            return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
        }
        // attribute missing / not expected
        else if (difference.getId() == DifferenceConstants.ATTR_NAME_NOT_FOUND_ID) {
            if (IGNORE_ATTRS.contains(difference.getTestNodeDetail().getValue())) {
                return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
            }
        }

        return RETURN_ACCEPT_DIFFERENCE;
    }

    @Override
    public void skippedComparison(Node control, Node test) {
        // nothing to do
    }
}

en utilisant DifferenceListener :

    XMLUnit.setIgnoreWhitespace(true);
    XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true);

    Diff diff = new Diff(expectedDocument, obtainedDocument);
    diff.overrideDifferenceListener(new IgnoreVariableAttributesDifferenceListener(Arrays.asList("id", "uid"), true));

    XMLAssert.assertXMLIdentical("xml invalid", diff, true);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top