XML/XPath Matchers for Hamcrest

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Hamcrest - мой любимый инструмент для модульного тестирования. Он заменяет процедурные утверждения org.junit.Assert в JUnit на объектно-ориентированный механизм. Однако, я подробнее обсужу эту тему в другой раз.

Теперь, однако, я хочу продемонстрировать новую библиотеку, опубликованную сегодня на GitHub и Maven Central: jcabi-matchers. jcabi-matchers - это набор матчеров Hamcrest для выполнения утверждений XPath в XML и XHTML документах.

Допустим, например, класс, который находится в процессе тестирования, создает XML-файл, который должен содержать единственный элемент <message> с контентом “hello, world!”.

Вот как этот код будет выглядеть в модульном тесте:

import com.jcabi.matchers.XhtmlMatchers;
import org.hamcrest.MatcherAssert;
import org.junit.Test;
public class FooTest {
  @Test
  public void hasWelcomeMessage() {
    MatcherAssert.assertThat(
      new Foo().createXml(),
      XhtmlMatchers.hasXPaths(
        "/document[count(message)=1]",
        "/document/message[.='hello, world!']"
      )
    );
  }
}

Есть два альтернативных варианта, о которых я знаю, которые делают почти то же самое: xml-matchers от David Ehringer и метод hasXPath() в самом Hamcrest.

Я попробовал оба варианта, но столкнулся с рядом проблем.

Во-первых, Hamcrest hasXPath() работает только с экземпляром Node. С использованием этого метода преобразование String в Node становится повторяющимся и рутинным заданием в каждом модульном тесте.

Вышеуказанное является очень странной ограниченностью Hamcrest в сравнении с jcabi-matchers, которая работает со всем практически, от String до Reader и даже InputStream.

Во-вторых, XmlMatchers из xml-matchers предоставляет очень неудобный способ работы с пространствами имен. Прежде чем вы сможете использовать XPath-запрос с нестандартным пространством имен, вам необходимо создать экземпляр NamespaceContext.

Библиотека предоставляет простую реализацию этого интерфейса, но все же требуется дополнительный код в каждом модульном тесте.

jcabi-matchers упрощает решение проблем с пространствами имен еще больше, так как предопределяет наиболее популярные пространства имен, включая xhtml, xs, xsl, и т.д.

Следующий пример работает сразу после установки — без дополнительной настройки.

MatcherAssert.assertThat(
  new URL("http://www.google.com").getContent(),
  XhtmlMatchers.hasXPath("//xhtml:body")
);

В итоге, моя основная цель при создании библиотеки - это ее простота использования.

Translated by ChatGPT gpt-3.5-turbo/31 on 2023-08-29 at 15:59

sixnines availability badge   GitHub stars