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