Jenkins运行TestNG报错 testng-results.xml含不可解析标签原因咨询
问题根因与触发路径
你遇到的两类异常内容来源完全独立,其中只有Git冲突标记是导致XML解析报错的直接原因,
1. 文件头部Git合并冲突标记来源
- 核心原因:TestNG生成的结果文件被错误纳入Git版本控制,Jenkins构建拉取代码时发生自动合并冲突,冲突标记被写入结果文件后未被TestNG的写入逻辑完全覆盖
- 完整触发链路:
- 项目配置遗漏,未将TestNG默认结果输出目录
test-output/加入.gitignore规则,历史提交中已将生成的testng-results.xml纳入Git版本跟踪 - Jenkins任务未配置构建前清空工作区逻辑,上一次构建完成后,工作区留存了上次运行生成的、与仓库存储版本内容不一致的旧
testng-results.xml - 构建启动后首先执行Git拉取步骤:Git检测到工作区中被跟踪的
testng-results.xml与本地HEAD版本、远端最新版本均存在内容差异,自动合并失败,直接在文件中插入<<<<<<< HEAD、=======、>>>>>>> 分支版本信息这类标准冲突标记。你看到的三层重复HEAD标记,是连续三次构建都触发冲突、标记逐层叠加导致的 - 拉取代码完成后TestNG开始执行测试,写入新结果时采用「从文件起始位置覆盖写入、但不提前截断旧文件」的逻辑,仅覆盖本次新生成的XML声明、
起始标签等内容,旧文件中未被覆盖的多层冲突标记全部残留在文件中 - 测试结束后Jenkins的TestNG解析插件读取文件时,碰到不符合XML语法的冲突标记,直接抛出
org.xmlpull.v1.XmlPullParserException异常
- 项目配置遗漏,未将TestNG默认结果输出目录
2. 非预期标签来源
- 核心原因:该标签是TestNG默认报告生成器的原生输出,不属于异常写入内容,不会触发XML语法错误
- 触发逻辑:
- 测试执行过程中,只要调用
Reporter.log()打印自定义日志、使用@DataProvider实现参数化测试记录参数值、或者断言时输出了自定义错误信息,TestNG默认的XML报告生成器就会把这些文本内容用CDATA块包裹,写入节点,挂载到对应测试方法的结果节点下 - 该节点被判定为“非预期”,通常是因为Jenkins的TestNG Results插件版本过低,未适配该节点的解析规则,但节点本身完全符合TestNG报告的格式规范,与本次解析报错无关联
- 测试执行过程中,只要调用
修复方案
- 清理Git仓库冗余跟踪文件:将
test-output/目录(若自定义了TestNG结果输出路径则替换为对应路径)加入项目根目录的.gitignore,执行git rm --cached test-output/* -r删除仓库中已跟踪的所有测试结果生成文件,提交变更到远端 - 调整Jenkins任务配置:增加构建前清空工作区步骤,每次构建启动前自动删除工作区所有旧文件,从根源避免旧生成文件残留导致的Git合并冲突
- 针对
节点:如果不需要将测试日志写入XML结果,可升级TestNG到7.5+版本,或自定义报告监听器关闭日志写入逻辑;如果需要保留日志,直接升级Jenkins的TestNG Results插件到最新版本即可正常解析,无需修改测试代码
内容的提问来源于stack exchange,提问作者Kuroosa
相关产品推荐
相关产品推荐

