Модульное тестирование XSLT

Кто-нибудь знает способ написания модульных тестов для преобразования XSLT?

У меня много XSLT-файлов, и проверять их вручную становится все труднее. У нас есть пример XML, и мы можем сравнить его с результирующим выходным XML из преобразования XSL. Тем не менее, я ищу лучший метод испытаний.

7 ответов

В настоящее время я ищу несколько хороших вариантов для этого. В результате я столкнулся с этим вопросом и несколькими другими потенциальными вариантами решения. По общему признанию, я еще не пробовал ни одного из них, таким образом, я не могу говорить об их качестве, но по крайней мере они - некоторые другие пути, потенциально достойные исследования.

  1. Пакет модульного тестирования Дженни Теннисон
  2. UTF-X Модуль модульного тестирования
  3. Juxy
  4. XTC

Кроме того, я нашел следующую статью информативной с точки зрения общей методологии модульного тестирования XSLT.

Модульный тест XSL-преобразований

Попробуйте XSpec, среду тестирования для XSLT. Это позволяет вам создавать декларативные тесты, а также тестовые шаблоны и функции.

Похоже, что в редакторе Oxygen также доступно модульное тестирование. Он " обеспечивает поддержку модульного тестирования XSLT на основе XSpec".

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

Вот несколько простых решений:

  • Используйте xsltproc с фиктивным XML-файлом:

    xsltproc test.xsl mock.xml
    
  • Поваренная книга XSLT - Глава 13

  • Создать document() переменная-заполнитель и комментарий / раскомментируйте ее вручную:

    <xsl:variable name="Data" select="descendant-or-self::node()"/>
    <!-- 
    <xsl:variable name="Data" select="document('foo.xml')" />
    -->
    <xsl:if test="$Data/pagename='foo'">
      <p>hi</p>
    </xsl:if>
    
  • Создайте условие, чтобы поменять комментарий программно:

        <xsl:variable name="Data">
          <xsl:choose>
            <!-- If source XML is inline -->
            <xsl:when test="descendant-or-self::node()/pageName='foo'"/>
             <xsl:value-of select="descendant-or-self::node()"/>
            </xsl:when>
            <!-- If source XML is external -->
            <xsl:otherwise>
             <xsl:value-of select="document('foo.xml')" />
            </xsl:otherwise>
          </xsl:choose>
        </xsl:variable>              
    

Используйте сценарий оболочки, чтобы программно встроить данные в сборку, чтобы полностью автоматизировать тесты.

Рекомендации

Я использую этот инструмент: jxsltunit.

Тест определяется XML-файлом, который затем передается в инструмент. Это пример конфигурации теста:

<xsltTestsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="jxsltunit jxslttestsuite.xsd" xmlns="jxsltunit"
    description="Testsuite Test"
    xml="min-test.xml"
    xslt="min-test.xslt"
    path="pa > ch">
    <xsltTestcase match_number="0">
        <![CDATA[<ch>child 1</ch>]]>
    </xsltTestcase>
    <xsltTestcase match_number="1">
        <![CDATA[<ch>child 2</ch>]]>
    </xsltTestcase>
</xsltTestsuite>

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

Одним из преимуществ этого инструмента является то, что он может выводить результаты в виде файла XML Junit. Этот файл может быть выбран вашим Jenkins для отображения XLST-тестов в результатах ваших тестов. Просто добавьте вызов к инструменту в качестве шага сборки.

Попробуйте пакет модульного тестирования (XSpec) Дженни Теннисон, который представляет собой платформу для модульного тестирования и разработки на основе поведения (BDD) для XSLT, XQuery и Schematron. Он основан на спецификации Spec в RSpec, который является платформой BDD для Ruby.

С XSpec вы можете протестировать шаблон XLT или XPath в соответствии с вашими потребностями. Чтобы узнать, как использовать / обрабатывать / писать (установка | выполнение), нажмите https://github.com/xspec/xspec/wiki/What-is-XSpec

Мы использовали примеры модульных тестов на основе Java, в которых мы предоставляем ожидаемую строку xml после преобразования и вводим строку xml, которую необходимо преобразовать с использованием некоторого XSL. Обратитесь к следующему пакету, если вы хотите узнать больше.

org.custommonkey.xmlunit.Transform
org.custommonkey.xmlunit.Diff
org.custommonkey.xmlunit.DetailedDiff
Другие вопросы по тегам