我正在处理需要由XSL和输出XML解析的大而复杂的字典数据(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>
some 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中,标签的名称以及内容的顺序(与输入文件相比)已经更改。 我需要比较Input中的所有文本字段是否在输出中可用。 我认为最好的解决方案是创建测试,它将从每个标签中提取文本并逐字符串地比较,输出标签toutt在output.xml中不存在于日志文件中??
答案 0 :(得分:2)
我建议使用两种测试:首先对较小的受控数据集进行单元测试,该数据应该是您在大字典中找到的数据的模型。这可以被视为xslt进程的单元测试。我通常会从较大的数据集中提取几个代表性的部分,并将它们与测试代码一起存储。然后,测试将转换应用于测试数据,并对结果进行断言,验证转换是否成功使用。
此外,您应该在生产系统中构建完整性检查,以便(例如)确保处理的节点总数与您的预期相符。例如,在具有大量条目的字典中,您可以运行一个步骤来计算所有条目,然后再运行另一个条目来处理它们。然后在最后,查看您处理的条目数,并确保计数与您的预期相同。这也很有用,因为它提供了输出进度条的方法(%完成)。
无论如何,这就是我们所做的。
如果输出中的文本与输入中的文本相同,如您的示例Marcin,您可以使用xslt相当容易地比较它们。如果您使用空的xslt样式表(只是<xslt:stylesheet />
节点)处理xml文件,那么您将只返回文本,没有标记。我认为xmllint也可以做到这一点。因此,只需在输入和输出上运行,然后使用简单的文本比较(如差异)进行比较。
答案 1 :(得分:1)
可以使用此技术:
<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> <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.
解释:
在每个<nodeProcessed/>
元素的处理中添加了一个特殊的仅测试元素(<num>
)。
我们捕获变量中的输出,然后计算<nodeProcessed/>
个元素的数量,并将它们与必须处理的<num>
个元素的总数进行比较。