如何为 XSLT 编写单元测试

问题描述 投票:0回答:7

有谁知道为 XSLT 转换编写单元测试的方法吗?

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

unit-testing xslt methodology
7个回答
13
投票

我目前也在寻找一些好的选择来做到这一点。结果,我遇到了这个问题,以及其他一些潜在的候选解决方案。诚然,我还没有尝试过其中任何一个,所以我不能评价它们的质量,但至少它们是一些其他可能值得研究的途径。

  1. Jenni Tennison 的单元测试包
  2. UTF-X 单元测试框架
  3. 朱西
  4. XTC

此外,我发现以下文章在单元测试 XSLT 的一般方法方面提供了丰富的信息。

单元测试 XSL 转换


9
投票

尝试 XSpec,一个 XSLT 测试框架。 它允许您以声明方式编写测试,并测试模板和函数。


3
投票

看起来 Oxygen 编辑器也提供了单元测试。它“提供基于 XSpec 的 XSLT 单元测试支持”。

我自己还没有尝试过,但很快就会尝试。


2
投票

以下是一些简单的解决方案:

  • 将 xsltproc 与模拟 XML 文件一起使用:

    xsltproc test.xsl mock.xml
    
  • XSLT 食谱 - 第 13 章

  • 创建一个

    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 脚本在构建中以编程方式内联数据,以完全自动化测试。

参考文献


1
投票

我们一直在使用基于Java的单元测试用例,其中我们提供转换后预期的xml字符串,并输入需要使用一些XSL转换的xml字符串。 如果您想探索更多,请参阅以下包。

org.custommonkey.xmlunit.Transform
org.custommonkey.xmlunit.Diff
org.custommonkey.xmlunit.DetailedDiff

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
投票

尝试 Jenni Tennison 的单元测试包 (XSpec),它是用于 XSLT、XQuery 和 Schematron 的单元测试和行为驱动开发 (BDD) 框架。它基于 RSpec 的 Spec 框架,RSpec 是 Ruby 的 BDD 框架。

使用 XSpec,您可以根据需要测试 XLT 模板或 XPath。 有关如何使用/处理/写入(安装|执行)的概述,请单击 https://github.com/xspec/xspec/wiki/What-is-XSpec

© www.soinside.com 2019 - 2024. All rights reserved.