Научитесь проверять XML-документы, тестировать выражения XPath и утверждать XML-узлы или значения с помощью XmlAssert, который поставляется с библиотекой XmlUnit. Вот краткий справочник по использованию XmlAssert.
импорт статического org.xmlunit.assertj.XmlAssert.assertThat;assertThat(xml).nodesByXPath("//widget/debug").exist();assertThat(xml).valueByXPath("//widget/debug").isEqualTo("on");
1. Зависимость Maven
Включите в проект последнюю версию зависимостей xmlunit-core и xmlunit-assertj3.
<зависимость><groupId>org.xmlunit</groupId><artifactId>xmlunit-core</artifactId><версия>2.9.0</версия></зависимость><зависимость><groupId>org.xmlunit</groupId><artifactId>xmlunit-assertj3</artifactId><версия>2.9.0</версия></зависимость>
2. Чтение XML-источников
Поскольку XmlAssert является расширением XmlUnit, мы можем читать и тестировать XML из всех источников, которые поддерживает XmlUnit. Например:
- java.яз.Строка
- java.io.Файл
- java.io.InputStream
- java.io.Читатель
- массив байтов
- org.w3c.dom.Document и т. д.
Ввод.изФайла("widget.xml");Input.fromString("<widget><id>1</id><name>demo</name></widget>");Input.fromStream(XmlUnitExamples.class.getResourceAsStream("widget.xml"));Input.fromReader(new StringReader("<widget><id>1</id><name>demo</name></widget>"));Input.fromByteArray("<widget><id>1</id><name>demo</name></widget>".getBytes());DocumentBuilder b = DocumentBuilderFactory.newInstance().newDocumentBuilder();Документ document = b.parse(new File("widget.xml"));Ввод.изДокумента(документ);
Мы можем передать любой из созданных выше типов входных данных XML в метод assertThat().
assertThat(Input.fromFile("widget.xml")).hasXPath("//widget/debug");
3. API XmlAssert.assertThat()
Метод assert() является статическим методом-фабрикой в классе XmlAssert. Это точка входа текучего интерфейса для написания утверждений на основе библиотеки AssertJ с использованием XmlAssert.
Импортируйте это поверх каждого тестового класса, в котором мы хотим создать такие утверждения.
import static org.xmlunit.assertj.XmlAssert.assertThat;
4. Примеры утверждений XML
Давайте быстро рассмотрим утверждения, поддерживаемые API XmlAssert.
4.1 Проверка XML-документа
Мы можем проверить общую структуру XML-документа, а также проверить ее на соответствие заданному документу схемы XSD.
assertThat(xml).isValid();assertThat(xml).isValidAgainst(new URL("https://host:port/domain/schema.xsd"));
4.2 Проверка идентичных и похожих XML-файлов
Два XML-файла считаются идентичными, если они имеют одинаковое содержимое, т. е. оба XML-файла имеют одинаковые теги, в одинаковом порядке и с одинаковыми значениями.
Два XML-файла считаются схожими, если они имеют одинаковые теги и значения, но порядок тегов отличается.
По умолчанию XmlUnit сопоставляет теги XML на том же уровне глубины от корневого тега и в том же порядке. Когда мы используем ElementSelectors.byName, он сортирует все теги по имени на той же глубине перед их сопоставлением.
String xml = "<widget><id>1</id><name>demo</name></widget>";String identicalXml = "<widget><id>1</id><name>demo</name></widget>";String similarXml = "<widget><name>demo</name><id>1</id></widget>";assertThat(xml).and(identicalXml).areIdentical();assertThat(xml).and(similarXml).areIdentical();assertThat(xml).and(similarXml).withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)).areSimilar();assertThat(xml).and("<widget><id>1</id></widget>").withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)).areNotSimilar();
4.3 Проверка существования узла
Для проверки выражений XPath используйте следующие методы.
- hasXPath(): принимает значение true, если существует узел(ы), представленный выражением xpath.
- doesNotHaveXPath(): принимает значение true, если узел(ы) НЕ существуют, представленные выражением xpath.
- nodesByXPath(): возвращает список узлов для добавления дополнительных проверок.
assertThat(xml).hasXPath("//widget/id");assertThat(xml).doesNotHaveXPath("//widget/debug/test");assertThat(xml).nodesByXPath("//widget/debug").exist();assertThat(xml).nodesByXPath("//widget/window").haveAttribute("location");assertThat(xml).nodesByXPath("//widget/window").containsAnyNodeHavingXPath("title");
4.4 Тестирование значений
Передайте выражение xpath в метод valueByXPath(), значения которого мы хотим проверить. Он возвращает экземпляр ValueAssert, который предоставляет методы утверждения для результата String оценки XPath.
assertThat(xml).valueByXPath("//widget/debug").isEqualTo("on");assertThat(xml).valueByXPath("//widget/window/title").isNotBlank();assertThat(xml).valueByXPath("count(//widget/window/locations/location)").isEqualTo(2);
Мы можем использовать много полезных методов, таких как проверка значений узлов. Названия этих методов говорят сами за себя.
- Для проверки значений NULL, пустых и пустых значений: isBlank(), isNotBlank(), isEmpty(), isNotEmpty(), isNullOrEmpty()
- Для проверки регистров: isLowerCase(), isUpperCase()
- Для проверки равенства: isEqualToIgnoringCase(), isNotEqualToIgnoringCase()
- Для проверки начала и конца строки: startsWith(), doesNotStartWith(), endsWith(), doesNotEndWith()
- Для сопоставления регулярных выражений: matches(), doesNotMatch()
- Для проверки частей содержимого: contains(), doesNotContain(), containsSequence(), containsOnlyOnce(), containsOnlyDigits(), isSubstringOf()
- Для проверки XML-фрагмента, извлеченного с помощью xpath: isXmlEqualToContentOf()
- Для проверки с(без) нормализованными пробелами и новыми строками: containsWhitespaces(), containsOnlyWhitespaces(), doesNotContainAnyWhitespaces(), doesNotContainOnlyWhitespaces(), isEqualToIgnoringWhitespace(), isNotEqualToIgnoringWhitespace(), isEqualToNormalizingWhitespace(), isNotEqualToNormalizingWhitespace(), isEqualToNormalizingNewlines()
- Для проверки длины строки и размеров коллекции: hasSameSizeAs(), hasSize(), hasSizeLessThan(), hasSizeLessThanOrEqualTo(), hasSizeGreaterThan(), hasSizeGreaterThanOrEqualTo(), hasSizeBetween()
- Для проверки количества строк в контенте: hasLineCount()
5. Заключение
В этом руководстве по XmlAssert мы научились создавать различные типы источников XML и утверждать два XML-документа для идентичных, похожих и узловых значений с помощью xpath.