سؤال

لدي فصل دراسي مع أ ToString الطريقة التي تنتج XML.أريد اختبار الوحدة للتأكد من أنها تنتج ملف XML صالحًا.لدي DTD للتحقق من صحة XML مقابل.

هل يجب علي تضمين DTD كسلسلة ضمن اختبار الوحدة لتجنب التبعية عليه، أم أن هناك طريقة أكثر ذكاءً للقيام بذلك؟

هل كانت مفيدة؟

المحلول

إذا كان برنامجك يتحقق من صحة XML مقابل DTD أثناء التنفيذ العادي، فيجب عليك فقط الحصول على DTD من أي مكان سيحصل عليه برنامجك.

إذا لم يكن الأمر كذلك وكان DTD قصيرًا للغاية (فقط بضعة أسطر)، فمن المحتمل أن يكون تخزينه كسلسلة في التعليمات البرمجية الخاصة بك أمرًا جيدًا.

بخلاف ذلك، سأضعه في ملف خارجي وأطلب من اختبار الوحدة الخاص بك قراءته من هذا الملف.

نصائح أخرى

لقد استخدمت XmlUnit في الماضي ووجدت أنه مفيد.

يمكن استخدامه للتحقق من صحة XML مقابل مخطط أو مقارنة XML الخاص بك بسلسلة.إنه ذكي بما يكفي لفهم قواعد تحليل XML.على سبيل المثال، يعرف أن "<e1/>" يعادل "<e1></e1>" ويمكن تهيئته لتجاهل المسافات البيضاء أو تضمينها.

إن استخدام DTD في اختبار الوحدة لاختبار صلاحيته شيء، واختبار المحتوى الصحيح شيء آخر.

يمكنك استخدام DTD للتحقق من صحة ملف XML الذي تم إنشاؤه والذي سأقرأه ببساطة بالطريقة التي تفعلها في برنامجك.أنا شخصيا لن أدرجه في السطر (كسلسلة)؛هناك دائمًا تبعية بين رمز التطبيق الخاص بك واختبار الوحدة.عندما يتغير ملف XML الذي تم إنشاؤه، سيتغير DTD أيضًا.

لاختبار المحتوى الصحيح الذي سأختاره XMLUnit.

تأكيد XML باستخدام XMLUnit:

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

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

شيء واحد قد تصادفه هو حقيقة أن ملف XML الذي تم إنشاؤه قد يحتوي على معرفات متغيرة (سمات id/uid أو ما شابه ذلك).يمكن حل هذه المشكلة باستخدام أ DifferenceListener عند تأكيد ملف XML الذي تم إنشاؤه.

مثال على تطبيق 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
    }
}

باستخدام 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top