如何使用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
相关产品推荐
相关产品推荐

