Как протестировать проект Maven с помощью XMLUnit2?

Опубликовано: 19 Февраля, 2023

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
                        http://maven.apache.org/maven-v4_0_0.xsd">
    <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




@Test
public 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




@Test
public 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:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <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




@Test
public 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());
    }
  
@Test
public 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 можно проверить, используя следующий способ