XSLT单元测试

31

有没有办法为XSLT转换编写单元测试?

我有很多XSLT文件,手动测试它们越来越困难。我们有一个示例XML文件,可以将其与XSLT转换的输出XML进行比较。但是,我正在寻找更好的测试方法。

7个回答

13

1
很不幸,在我开始研究这个任务后不久,它就被搁置了,我从未有机会重新审视它。 - Scott

9
尝试使用 XSpec,这是一个针对 XSLT 的测试框架。它允许您以声明方式编写测试,并测试模板和函数。请点击此处获取更多信息。

1
如何使用XSpec在特定模式下测试转换? - Árpád Magosányi
截至2021年11月,xspec似乎是唯一仍在积极维护的选项。 - mcwayliffe

3

2

以下是几种简单的解决方案:

  • Use xsltproc with a mock XML file:

    xsltproc test.xsl mock.xml
    
  • XSLT Cookbook - Chapter 13

  • Create a document() placeholder variable and comment/uncomment it manually:

    <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>
    
  • Create a condition to swap the comment programmatically:

        <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 脚本来将数据以编程方式内联到构建中,从而完全自动化测试。 参考资料

1

我正在使用这个工具: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测试。只需将调用该工具作为构建步骤添加即可。


1
我们一直在使用基于Java的单元测试用例,在其中提供需要进行转换的输入XML字符串和预期XML字符串,这些转换是使用某些XSL完成的。如果您想进一步了解,请参考以下包。
org.custommonkey.xmlunit.Transform
org.custommonkey.xmlunit.Diff
org.custommonkey.xmlunit.DetailedDiff

运行得很好,不过一些源代码会很有帮助。此外,看起来 xspec 文件在这里无用... 这是一个旧帖子,但仍然相关。 - 3xCh1_23

1
尝试使用Jenni Tennison的单元测试包(XSpec),它是用于XSLT、XQuery和Schematron的单元测试和行为驱动开发(BDD)框架。它基于RSpec的Spec框架,后者是Ruby的BDD框架。使用XSpec,您可以根据需要按模板或XPath进行测试。有关如何使用/处理/编写(安装|执行)的概述,请单击https://github.com/xspec/xspec/wiki/What-is-XSpec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接