有谁知道为 XSLT 转换编写单元测试的方法吗?
我有很多 XSLT 文件,手动测试它们变得越来越困难。我们有一个示例 XML,可以将它与 XSL 转换生成的输出 XML 进行比较。不过,我正在寻找更好的测试方法。
我目前也在寻找一些好的选择来做到这一点。结果,我遇到了这个问题,以及其他一些潜在的候选解决方案。诚然,我还没有尝试过其中任何一个,所以我不能评价它们的质量,但至少它们是一些其他可能值得研究的途径。
此外,我发现以下文章在单元测试 XSLT 的一般方法方面提供了丰富的信息。
尝试 XSpec,一个 XSLT 测试框架。 它允许您以声明方式编写测试,并测试模板和函数。
看起来 Oxygen 编辑器也提供了单元测试。它“提供基于 XSpec 的 XSLT 单元测试支持”。
我自己还没有尝试过,但很快就会尝试。
以下是一些简单的解决方案:
将 xsltproc 与模拟 XML 文件一起使用:
xsltproc test.xsl mock.xml
创建一个
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>
使用 shell 脚本在构建中以编程方式内联数据,以完全自动化测试。
参考文献
我们一直在使用基于Java的单元测试用例,其中我们提供转换后预期的xml字符串,并输入需要使用一些XSL转换的xml字符串。 如果您想探索更多,请参阅以下包。
org.custommonkey.xmlunit.Transform
org.custommonkey.xmlunit.Diff
org.custommonkey.xmlunit.DetailedDiff
我正在使用这个工具: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 中的路径进行测试。该路径可以包含一个列表,其中的元素通过其索引进行标识。
该工具的一个好处是它可以将结果输出为 junit XML 文件。您的 Jenkins 可以获取此文件以在测试结果中显示 XLST 测试。只需添加对工具的调用作为构建步骤即可。
尝试 Jenni Tennison 的单元测试包 (XSpec),它是用于 XSLT、XQuery 和 Schematron 的单元测试和行为驱动开发 (BDD) 框架。它基于 RSpec 的 Spec 框架,RSpec 是 Ruby 的 BDD 框架。
使用 XSpec,您可以根据需要测试 XLT 模板或 XPath。 有关如何使用/处理/写入(安装|执行)的概述,请单击 https://github.com/xspec/xspec/wiki/What-is-XSpec