лучший / самый эффективный способ тестирования XSLT - PullRequest
0 голосов
/ 23 октября 2011

Я работаю с большими и сложными словарными данными (XML), которые необходимо проанализировать с помощью XSL и вывести XML.

, что считается «лучшим» способом проверки, обрабатывает ли XSL все узлыиз XML (входные данные)?

, пожалуйста, рассмотрите этот простой пример, я думаю, что он будет представлять природу проблемы:

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<a>
   <b>
      <c>
         some1
         <d>text2</d>
         more text1
      </c>
   </b>
   <b>
      <c>
         some2
         <d>text2</d>
         more text2
      </c>
   </b>
   <d>text3</d>
   <e>
      text
      <d>4</d>
   </e>
</a>

Некоторые tarnsformations.xsl

output.xml

<?xml version="1.0" encoding="UTF-8"?>
<amodified>
   <bmodified>
      some1
      <dd>text2</dd>
      more text1
   </bmodified>
   <bmodified>
      some2
      <dd>text2</dd>
      more text2
   </bmodified>
   <dd>text3</dd>
   <ed>text</ed>
   <dd>4</dd>
</amodified>

В output.xml изменены имена тегов, а также порядок содержимого (по сравнению с входным файлом).Мне нужно сравнить, если все текстовые поля из ввода доступны в выводе.Я думаю, что лучшим решением было бы создать тест, который будет извлекать текст из каждого тега и сравнивать его строка за строкой, выводя теги, которых нет в output.xml, в файл журнала ...?

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Я бы порекомендовал два вида тестов: первый - юнит-тест на меньшем контролируемом наборе данных, который должен быть моделью для данных, которые вы найдете в большом словаре. Это можно считать модульным тестом для вашего процесса xslt. Обычно я извлекаю несколько репрезентативных фрагментов из большого набора данных и сохраняю их вместе с тестовым кодом. Затем тест применяет преобразование к тестовым данным и делает утверждения о результате, подтверждая, что преобразование было успешно использовано.

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

Во всяком случае, это то, что мы делаем.

Если текст в выходных данных совпадает с текстом во входных данных, как в вашем примере, Marcin, вы можете легко сравнить их с помощью xslt. Если вы обработаете XML-файл с пустой таблицей стилей xslt (только узел <xslt:stylesheet />), вы получите только текст без разметки. Я думаю, что xmllint может сделать это тоже. Так что просто запустите это как на входе, так и на выходе, и сравните, используя простое сравнение текста (например, diff).

1 голос
/ 23 октября 2011

Можно использовать эту технику :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common">
 <xsl:output method="text"/>

 <xsl:template match="/*">
     <xsl:variable name="vrtfResults">
       <xsl:apply-templates select="num"/>
     </xsl:variable>

     <xsl:variable name="vProcessed" select=
     "count(ext:node-set($vrtfResults)/nodeProcessed)"/>

     <xsl:variable name="vAll" select="count(num)"/>

     <xsl:text>From the existing </xsl:text>
     <xsl:value-of select="$vAll"/>
     <xsl:text> &lt;num> elements </xsl:text>
     <xsl:value-of select="$vProcessed"/>
     <xsl:text> were processed.</xsl:text>
 </xsl:template>

 <xsl:template match="num">
  <nodeProcessed/>
  <num><xsl:value-of select="2*."/></num>
 </xsl:template>
</xsl:stylesheet>

при применении к следующему документу XML :

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

желаемый результат получен :

From the existing 10 <num> elements 10 were processed.

Пояснение :

  1. Специальный элемент только для тестирования (<nodeProcessed/>) имеетдобавлен в обработку каждого <num> элемента.

  2. Мы фиксируем выходные данные в переменной, затем подсчитываем количество <nodeProcessed/> элементов и сравниваем их с общим числом<num> элементов, которые должны быть обработаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...