Как протестировать проект 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
@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: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 можно проверить, используя следующий способ