生成Allure测试报告时出现Sax Parser Exception的问题求助
这种问题我之前帮好几个开发者排查过,核心原因就是Allure被误导去处理非XML格式的内容了,咱们一步步来解决:
1. 定位问题来源:检查Attachment注解的使用
大概率是你在测试代码里用Allure的@Attachment注解保存API响应时,没指定正确的内容类型,导致Allure默认把它当成XML来处理。比如直接把JSON/HTML字符串返回给Attachment,却没声明类型,Allure就会尝试将其封装成XML节点,而非法的XML字符(比如JSON里的大括号、HTML里的标签)就会触发Sax解析异常。
解决方法:给@Attachment指定正确的type参数:
- 保存JSON响应:
@Attachment(value = "REST API Response", type = "application/json") public String saveJsonResponse(String jsonResponse) { return jsonResponse; }
- 保存HTML响应:
@Attachment(value = "HTML Response", type = "text/html") public String saveHtmlResponse(String htmlResponse) { return htmlResponse; }
这样Allure会直接将内容保存为对应格式的附件,不会再强行转成XML,自然就不会触发解析错误。
2. 排查自定义的Allure结果生成逻辑
如果你的测试框架里有自定义的代码来生成Allure的测试结果(比如手动写入results目录的XML文件),要检查是不是不小心把API响应的内容写入了XML节点中。比如有些开发者会把API响应作为测试步骤的描述写入XML,这时候如果内容包含XML特殊字符(如<、>、&),也会导致解析异常。
解决方法:如果必须把响应内容写入XML,要先对特殊字符进行转义,比如把<换成<,>换成>。不过更推荐的还是用Attachment来保存这类内容,而不是写入XML结构里。
3. 检查Allure与Jenkins插件的版本兼容性
有时候Jenkins上的Allure插件版本和你本地测试用的Allure版本不匹配,也可能导致解析逻辑出现问题。比如本地用Allure 2.21.0,而Jenkins插件还是2.18.1,就可能出现对新格式的处理异常。
解决方法:
- 确保本地
allure-maven-plugin的版本和Jenkins上Allure插件的版本一致。 - 在pom.xml里明确指定Allure Maven插件的版本:
<plugin> <groupId>io.qameta.allure</groupId> <artifactId>allure-maven</artifactId> <version>2.21.0</version> <!-- 和Jenkins插件版本保持一致 --> </plugin>
4. 过滤Allure结果目录中的非有效XML文件
如果上面的方法都没解决,可能是某些第三方工具或测试框架自动生成了非标准的XML文件到Allure的results目录里。这时候可以在生成报告前,先过滤掉这些无效文件。
比如在Maven的测试阶段后添加一个步骤,删除results目录里不是Allure标准XML的文件(Allure的结果XML文件名通常是uuid-result.xml格式)。可以用Maven的exec-maven-plugin执行脚本删除:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>post-integration-test</phase> <goals> <goal>exec</goal> </goals> <configuration> <!-- Linux/macOS 下删除非result.xml结尾的文件 --> <executable>bash</executable> <arguments> <argument>-c</argument> <argument>rm -f target/allure-results/*.xml !(*-result.xml)</argument> </arguments> <!-- Windows 下可以用del命令,自行调整 --> </configuration> </execution> </executions> </plugin>
按这个顺序排查下来,基本就能解决Sax Parser Exception的问题了。
内容的提问来源于stack exchange,提问作者NewTechie

