You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用xsltproc将Python单元测试JUnit XML转为可发布的HTML报告

报错原因及解决方案

第一步:修复xsltproc命令参数顺序

xsltproc的语法规则是样式表文件在前,XML数据文件在后,你写反了两个文件的位置,导致工具把XML文件当成样式表尝试加载解析,自然触发报错。
正确的命令格式为:
xsltproc [样式表文件路径] [XML报告文件路径] > 输出的HTML文件路径
对应你的场景,调整后的正确命令:

xsltproc stylesheet.xslt test-result.xml > index.html

第二步:排查其他可能触发报错的原因

如果调整参数顺序后仍然报错,按以下顺序检查:

  • 确认执行命令的工作目录下确实存在test-result.xml和stylesheet.xslt两个文件,可执行ls命令查看当前目录文件列表验证
  • 确认运行xsltproc的用户对两个文件有读取权限
  • 确认XML文件没有损坏,可执行cat test-result.xml验证文件内容完整度

第三步:准备适配JUnit格式的XSLT样式表

如果你还没有编写可用的stylesheet.xslt,可以使用以下通用适配JUnit XML报告的样式表,直接保存为stylesheet.xslt即可:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
    <title>Python单元测试报告</title>
    <style>
        body { font-family: 微软雅黑, Arial; margin: 20px; }
        .summary { padding: 10px; background: #f5f5f5; border-radius: 5px; margin-bottom: 20px; }
        .pass { color: green; }
        .fail { color: red; }
        .skip { color: orange; }
        table { width: 100%; border-collapse: collapse; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h1>单元测试执行报告</h1>
    <xsl:for-each select="testsuites/testsuite">
    <div class="summary">
        <p>测试套件名称: <xsl:value-of select="@name"/></p>
        <p>执行总耗时: <xsl:value-of select="@time"/>s</p>
        <p>执行时间戳: <xsl:value-of select="@timestamp"/></p>
        <p>总用例数: <span class="pass"><xsl:value-of select="@tests"/></span></p>
        <p>成功用例数: <span class="pass"><xsl:value-of select="@tests - @failures - @errors - @skipped"/></span></p>
        <p>失败用例数: <span class="fail"><xsl:value-of select="@failures"/></span></p>
        <p>错误用例数: <span class="fail"><xsl:value-of select="@errors"/></span></p>
        <p>跳过用例数: <span class="skip"><xsl:value-of select="@skipped"/></span></p>
    </div>
    <table>
        <tr>
            <th>用例类名</th>
            <th>用例名称</th>
            <th>执行耗时</th>
            <th>执行状态</th>
            <th>备注</th>
        </tr>
        <xsl:for-each select="testcase">
        <tr>
            <td><xsl:value-of select="@classname"/></td>
            <td><xsl:value-of select="@name"/></td>
            <td><xsl:value-of select="@time"/>s</td>
            <xsl:choose>
                <xsl:when test="failure | error">
                    <td class="fail">失败/错误</td>
                    <td><xsl:value-of select="failure/@message | error/@message"/></td>
                </xsl:when>
                <xsl:when test="skipped">
                    <td class="skip">跳过</td>
                    <td><xsl:value-of select="skipped/@message"/></td>
                </xsl:when>
                <xsl:otherwise>
                    <td class="pass">成功</td>
                    <td></td>
                </xsl:otherwise>
            </xsl:choose>
        </tr>
        </xsl:for-each>
    </table>
    </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

后续使用说明

生成的index.html无外部资源依赖,可直接通过Jenkins的Publish HTML report插件发布,也可直接嵌入Confluence中展示。

内容的提问来源于stack exchange,提问作者Chang Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:06:05