Как протестировать проект Maven с помощью XMLUnit2?
XML означает расширяемый язык разметки, и он широко используется во многих местах для программных проектов. Всякий раз, когда нам нужно перенести информацию между несколькими операционными системами/несколькими языками, XML является эффективным способом связи. Чтобы легко передавать сообщения, также помогает XML, и он должен быть хорошо сформирован и хорошо структурирован. Тогда будет уместен только способ общения. В этом руководстве мы рассмотрим, как данные XML проверяются с помощью XMLUnit 2.x. XMLUnit 2.x помогает нам тестировать и проверять содержимое XML. С помощью примера проекта Maven давайте посмотрим на концепции.
Пример проекта Maven
Требуемая зависимость Maven для использования XMLUnit 2.x
<dependency>
<groupId>org.xmlunit</groupId>
<artifactId>xmlunit-core</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.xmlunit</groupId>
<artifactId>xmlunit-matchers</artifactId>
<version>2.2.1</version>
</dependency>Давайте создадим пример проекта, содержащий несколько допустимых хорошо структурированных XML для тестирования на XMLUnit 2.x.
Поскольку это проект maven, давайте посмотрим
пом.xml
XML
<?xml version="1.0" encoding="UTF-8"?> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 <modelVersion>4.0.0</modelVersion> <artifactId>gfg_xmlunit-2_sample</artifactId> <name>gfg_xmlunit-2_sample</name> <parent> <groupId>com.gfg</groupId> <artifactId>testing-modules</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.xmlunit</groupId> <artifactId>xmlunit-matchers</artifactId> <version>${xmlunit.version}</version> </dependency> <dependency> <groupId>org.xmlunit</groupId> <artifactId>xmlunit-core</artifactId> <version>${xmlunit.version}</version> </dependency> </dependencies> <properties> <!-- testing --> <xmlunit.version>2.3.0</xmlunit.version> </properties> </project> |
Важные файлы, необходимые для проверки и дифференциации по атрибутам
ИгнорированиеAttributeDifferenceEvaluator.java
Java
import org.w3c.dom.Attr;import org.w3c.dom.Node;import org.xmlunit.diff.Comparison;import org.xmlunit.diff.ComparisonResult;import org.xmlunit.diff.DifferenceEvaluator; public class IgnoringAttributeDifferenceEvaluator implements DifferenceEvaluator { private String attributeName; public IgnoringAttributeDifferenceEvaluator(String attributeName) { this.attributeName = attributeName; } @Override public ComparisonResult evaluate(Comparison comparison, ComparisonResult result) { if (result == ComparisonResult.EQUAL) return result; final Node controlNode = comparison.getControlDetails().getTarget(); if (controlNode instanceof Attr) { Attr attr = (Attr) controlNode; if (attr.getName().equals(attributeName)) { return ComparisonResult.SIMILAR; } } return result; }} |
Давайте начнем тестировать XML один за другим.
validatingForIdentityAmong2XMLs : необходимо брать только действительный XML, и если содержимое и последовательность в документах точно такие же, то приведенный ниже тест будет успешным. Мы взяли образец XML и протестировали XML, и поскольку содержание и последовательность совпадают, они идентичны и дают положительный результат.
Java
@Test public void validatingForIdentityAmong2XMLs(){ String givenXml = "<struct><int>30</int><boolean>true</boolean></struct>"; String testXml = "<struct><int>30</int><boolean>true</boolean></struct>"; assertThat(testXml, isIdenticalTo(givenXml));} |
В случае, если в данных двух XML-файлах видны различия, они обнаруживаются Difference Engine. Обычно, если XML не идентичен, процесс сравнения останавливается на самом первом отличии. Если мы хотим получить все различия вместе с утверждениями, мы можем распечатать их и получить, как показано ниже.
Java
@Testpublic void generationOfDifferencesAmong2XMLs() throws Exception{ String givenXml = "<struct><int>30</int><boolean>true</boolean></struct>"; String testXml = "<struct><boolean>true</boolean><int>30</int></struct>"; Diff myDiff = DiffBuilder.compare(givenXml) .withTest(testXml) .build(); Iterator<Difference> iter = myDiff.getDifferences().iterator(); int size = 0; while (iter.hasNext()) { System.out.println(iter.next().toString()); size++; } assertThat(size, greaterThan(1));} |
Мы можем сравнить XML из данного исходного файла. Данный XML может содержать разные теги, поэтому вместо того, чтобы указывать его в качестве тестовой строки, давайте получим его из файла.
тест, XML-содержимое
XML
<struct> <int>300</int> <boolean>true</boolean></struct> |
содержимое control.xml
XML
<struct> <int>300</int> <boolean>true</boolean></struct> |
Проверка содержимого XML в двух XML-файлах
Java
@Testpublic void validateViaAFileSource(){ ClassLoader sampleClassLoader = getClass().getClassLoader(); String testFilePath = sampleClassLoader.getResource("test.xml") .getPath(); String controlFilePath = sampleClassLoader.getResource("control.xml") .getPath(); assertThat( Input.fromFile(testFilePath), isSimilarTo(Input.fromFile(controlFilePath)));} |
Проверка:
Используя класс Validator, проверка XML выполняется модулем XML 2.x. Класс валидатора можно создать с помощью
Validator validator = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
Давайте посмотрим то же самое, взяв один файл XSD и один файл XML.
студент.xsd
XML
<?xml version = "1.0"?> <xs:element name="class"> <xs:complexType> <xs:sequence> <xs:element name="student" type="StudentObject" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="StudentObject"> <xs:sequence> <xs:element name="name" type="xs:string" /> <xs:element name="age" type="xs:positiveInteger" /> </xs:sequence> <xs:attribute name="id" type="xs:positiveInteger" /> </xs:complexType></xs:schema> |
student_with_error.xml (здесь присутствуют значения, но с ошибками)
XML
<?xml version = "1.0"?><class> <studet id="1000"> <name>Rachel</name> <age>30</age> </student> <studet id="1001"> <name>Ross</name> <age>30</age> </student></class> |
student.xml (действительный XML)
XML
<?xml version = "1.0"?><class> <student id="393"> <name>Rachel</name> <age>30</age> </student> <student id="493"> <name>Ross</name> <age>30</age> </student></class> |
С помощью Validator выполняются следующие шаги.
Java
@Testpublic void validatingWrongXml_AndFailsAgainstXsd_thenCorrect() { Validator validator = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI); validator.setSchemaSource(Input.fromStream(SampleXMLUnitTest.class.getResourceAsStream("/student.xsd")).build()); ValidationResult r = validator.validateInstance(Input.fromStream(SampleXMLUnitTest.class.getResourceAsStream("/student_with_error.xml")).build()); assertFalse(r.isValid()); } @Testpublic void validatingCorrectXml_whenValidatesAgainstXsd_thenCorrect() { Validator validator = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI); validator.setSchemaSource(Input.fromStream(SampleXMLUnitTest.class.getResourceAsStream("/student.xsd")).build()); ValidationResult validationResult = validator.validateInstance(Input.fromStream(SampleXMLUnitTest.class.getResourceAsStream("/student.xml")).build()); Iterator<ValidationProblem> problems = validationResult.getProblems().iterator(); while (problems.hasNext()) { System.out.println(problems.next().toString()); } assertTrue(validationResult.isValid()); } |
XPath можно проверить, используя следующий способ