Главная » XSLT » Тестирование граничных условий и ошибочных данных

0

Задача

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

Решение

Тестирование граничных условий

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

Если шаблон применяется к наборам узлов (в версии 2.0 – к последовательно­стям), то обязательно проверяйте следующие случаи:

?               пустой набор узлов;

?               набор узлов, содержащий один элемент;

?               набор узлов, содержащий два элемента;

?               набор узлов, содержащий нечетное число элементов, большее 1;

?               набор узлов, содержащий четное число элементов, большее 2.

Если шаблон применяется к строке, то проверяйте следующие случаи:

?               пустая строка;

?               строка длины 1;

?               другие строки с разными длинами.

Если в шаблоне для поиска используются функции substring-before или substring-after, то проверяйте следующие случаи:

?               строки, в которые искомая строка не входит;

?               строки, которые начинаются с искомой строки;

?               строки, которые заканчиваются искомой строкой;

?               строка совпадает с искомой;

?               строки, которые содержат несколько вхождений искомой строки (подряд и разделенные каким-то другим текстом).

Если шаблон применяется к числам, то проверяйте следующие случаи:

?               число 0;

?               число 1;

?               отрицательные числа;

?               дроби (0 < x < 1);

?               числа, содержащие целую и дробную части;

?               простые числа;

?               прочие граничные значения, специфичные для конкретной задачи.

Если в шаблон сравниваются два числа X и Y, проверяйте следующие

случаи:

?               X < Y, особенно X = Y – 1 и X = Y – d, где d – небольшое дробное число;

?               X = Y;

?               X > Y, особенно X = Y + 1 и X = Y + d, где d – небольшое дробное число.

Если вы знаете схему подлежащего обработке документа или имеете к ней до­ступ, проверяйте, как поведет себя шаблон, если подать на вход данные, где:

?               необязательные элементы отсутствуют;

?               необязательные элементы присутствуют;

?               элемент, на число экземпляров которого не наложено ограничений, встре­чается только один раз;

?               элемент, на число экземпляров которого не наложено ограничений, встре­чается несколько раз;

Тестирование при ошибочных входных данных

Отказоустойчивые шаблоны и таблицы стилей должны вести себя предсказу­емо при подаче на вход недопустимых данных. В таких случаях для выдачи сооб­щений о некорректных параметрах часто применяется команда xsl:message с атрибутом terminate="yes".

Если шаблон применяется к числам, то проверяйте следующие случаи:

?               NaN (0 div 0);

?               Infinity (1 div 0);

?               -Infinity (-1 div 0)

?               нуль, если такое значение недопустимо (например, для логарифма);

?               отрицательное значение, если оно недопустимо (например, для факториала);

?               не число(например, «foo»)

Если у шаблона или таблицы стилей есть параметры, проверяйте, что проис­ходит при следующих условиях:

?               не задано значение для параметра, не имеющего значения по умолчанию;

?               заданное значение выходит за пределы допустимого диапазона;

?               задано значение недопустимого типа.

Проверить, что некоторый параметр не задан, можно с помощью такого приема:

<xsl:param name="param1">

<xsl:message terminate="yes">

$param1 не задан. </xsl:message>

</xsl:param>

Однако не гарантируется, что этот прием всегда будет работать, поскольку в стандарте не утверждается, что параметр вычисляется в тот момент, когда для него передано значение. Но большинство процессоров XSLT ведут себя в этом от­ношении «дружелюбно». Если хотите полной уверенности, то можете присвоить параметру заведомо недопустимое значение (например, 1 div 0) и проверить его в теле шаблона:

<xsl:param name="param1" select="1 div 0" />

<xsl:if test="$param1 = 1 div 0"> <xsl:message terminate="yes">

$param1 не задан или равен Infinity, что недопустимо. </xsl:message>

</xsl:if>

Если вы знаете схему подлежащего обработке документа или имеете к ней доступ, проверяйте, как поведет себя шаблон, если подать на вход документ, который1:

?               полностью расходится со схемой (то есть на вход подан какой-то посторон­ний документ);

?               содержит отдельные элементы, нарушающие схему;

?               нарушает ограничения minOccurs и maxOccurs;

?               нарушает ограничения на типы данных.

Обсуждение

Разрабатывая XSLT-код для собственных нужд, вы сами решаете, насколько отказоустойчивым он должен быть. Но если вашим кодом будут пользоваться и другие люди, то рекомендуется включать обработку ошибок (в пределах разум­ного). Клиенты будут только благодарны, если код работает со всеми допустимы­ми, пусть даже необычными, входными данными.

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

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

По теме:

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