Главная » XSLT » Организация автономных тестов

0

Задача

Требуется организовать тесты, чтобы упростить процедуру тестирования.

Решение

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

Обсуждение

Ряд полезных советов по автоматизации тестирования приведен в книге Брайан Керниган, Роб Пайк Практика программирования (Вильямс, 2004). Авто­ры утверждают, что тестовые программы должны что-то выводить только, если тест не проходит. Почему? А кто захочет изучать многие страницы тестовой выдачи в поисках признаков неудачно завершившихся тестов? Если же вы знаете, что успешно выпол­ненный тест ничего не выводит, то по наличию выдачи сразу увидите, где были ошибки. Конечно, нужно предварительно протестировать сам тестовый код и убедиться, что он действительно выполняется, иначе такая техника тестирования бесполезна.

Метод запоминания правильных ответов в атрибутах тестовых элементов работает только для простых тестов, возвращающих одиночный результат. Но ведь некоторые тесты возвращают наборы узлов. В таком случае правильный ответ можно представить в виде дочерних элементов, а затем с помощью операций над множествами из рецепта 9.2 сравнить результаты. Иногда, впрочем, протестировать шаблоны, порождающие наборы узлов, удается и более простым способом. Рассмотрим управляющую програм­му для тестирования шаблона math:lowest. Напомним, что этот шаблон возвращает набор узлов, включающий все вхождения наименьшего числа во входном наборе:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/

Transform" xmlns:math="http://www.exslt.org/math" exclude-result-

prefixes="math test" xmlns:test="http://www.ora.com/XSLTCookbook/test"

id="math:math.lowest">

<xsl:import href="math.min.xslt"/>

<xsl:template name="math:lowest">

<xsl:param name="nodes" select="/.."/>

<xsl:variable name="min">

<xsl:call-template name="math:min">

<xsl:with-param name="nodes" select="$nodes"/> </xsl:call-template> </xsl:variable> <xsl:choose>

<xsl:when test="number($min) = $min">

<xsl:copy-of select="$nodes[. = $min]"/>

</xsl:when> <xsl:otherwise/> </xsl:choose> </xsl:template>

<!— ТЕСТ: HE УДАЛЯТЬ! —>

<xsl:template match="xsl:stylesheet[@id=’math:math.lowest’] |

xsl:include[@href=’math.lowest.xslt’] " xmlns:exsl="http:// exslt.org/common">

<xsl:message> ТЕСТИРУЕТСЯ math.lowest </xsl:message> <xsl:choose>

<xsl:when test="function-available(‘exsl:node-set’)"> <xsl:for-each select="document(”)/*/test:test"> <xsl:variable name="ans"> <xsl:call-template name="math:lowest">

<xsl:with-param name="nodes" select="test:data"/> </xsl:call-template> </xsl:variable>

<xsl:variable name="$ans-ns" select=" exsl:node-set($ans)"/> <xsl:if test="not($ans-ns/* != test:data[. = current( )/@ans]) and

count($ans-ns/*| != count(test:data[. = current( )/@ans])">

<xsl:message>

math:lowest ТЕСТ <xsl:value-of select="@num"/> HE ПРОШЕЛ [<xsl:copy-of select="$ans-ns"/>]

[<xsl:copy-of select="test:data[. = current( )/@ans]"/>] </xsl:message> </xsl:if> </xsl:for-each> </xsl:when> <xsl:otherwise> <xsl:message>

ПРЕДУПРЕЖДЕНИЕ для теста math.lowest требуется exsl:node-set НОМЕР BEРСИИ=[<xsl:value-of select="system-property(‘xsl:version’)"/>] ПРОИЗBОДИТEЛЬ=[<xsl:value-of select="system- property(‘xsl:vendor’)"/>] </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:template>

<test:test num="1" ans="1" xmlns="http://www.ora.com/XSLTCookbook/test"> <data>9</data>

<data>8</data> <data>7</data> <data>6</data> <data>5</data> <data>4</data> <data>3</data> <data>2</data> <data>1</data>

</test:test>

<!– другие тесты … >

</xsl:stylesheet>

Сравнение опирается на поведение оператора !=, когда в обеих частях нахо­дятся наборы узлов: результат равен true, если при попарном сравнении узлов из каждого узла хотя бы у одной пары оказываются разные строковые значения. Можно проверить, что набор узлов, отобранных из тестового набора, и набор уз­лов, которые возвращает шаблон math:lowest, совпадают. Можно также убе­диться, что они содержат одинаковое количество узлов.

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

См. также

Книга Брайан Керниган, Роб Пайк Практика программирования (Вильямс, 2004) посвящена не конкретно XSLT, а содержит рекомендации по тестированию и от­ладке любых программ.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии