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

如何将CSV测试结果转换为JUnit格式并在Jenkins中展示

CSV转JUnit XML适配Jenkins展示测试结果方案

需求背景

有1000+条测试用例结果保存在CSV文件中,需要转换为JUnit格式的XML,供Jenkins展示测试结果。CSV示例数据如下:

TCName;OverallResult
TC_LIB_001; FAIL
TC_LIB_001; FAIL
FMECA_DIA_034; FAIL
FMECA_DIA_034; PASS

问题定位

经过验证,其他符合规范的XML示例文件可以正常在Jenkins展示,确认问题出在CSV转XML的环节。

初始转换代码

编写的Python转换代码如下:

import sys
import os
import csv
if len(sys.argv) != 2:
    os._exit(1)
path=sys.argv[1] # 从命令行参数获取文件目录
os.chdir(path)
csvFiles = [f for f in os.listdir('.') if f.endswith('.csv') or f.endswith('.CSV')]
for csvFile in csvFiles:
    xmlFile = csvFile[:-4] + '.xml'
    csvData = csv.reader(open(csvFile))
    xmlData = open(xmlFile, 'w')
    # 统计测试用例总数
    rn = -1
    for rl in csvFile:
        rn+=1
    xmlData.write('<testsuite tests="'+str(rn)+'">' + "\n")
    print(rn)

    rowNum = 0
    for row in csvData:
        if rowNum == 0:
            tags = row
            # 标签名中的空格替换为下划线
            for i in range(len(tags)):
                tags[i] = tags[i].replace(' ', '_')
        else:
            xmlData.write('<testcase')
            for i in range(len(tags)):
                xmlData.write('    classname="'+ row[i].partition(";")[0] +'" name="'+row[i].partition(";")[2] +'"  /')
                if row[i].partition(";")[2] == " FAIL":
                    xmlData.write('>        <failure type="did not passed"> details about failure </failure>'+ "\n")
                if row[i].partition(";")[2] != " PASS" and row[i].partition(";")[2] != " FAIL" :
                    xmlData.write('        <failure type="Fatal Error"> details about failure </failure>'+ "\n")
                if row[i].partition(";")[2] == " PASS":
                    xmlData.write('>'+ "\n")
        rowNum +=1
    xmlData.write('</testsuite>' + "\n")
    xmlData.close()

错误输出与现象

初始代码生成的XML内容如下,运行后Jenkins显示4条用例全部通过,和实际1条通过、3条失败的结果不符:

<testsuite tests="4">
<testcase    classname="TC_LIB_001" name=" FAIL"  />         <failure type="did not passed"> details about failure </failure>
<testcase    classname="TC_LIB_001" name=" FAIL"  />         <failure type="did not passed"> details about failure </failure>
<testcase    classname="FMECA_DIA_034" name=" FAIL"  />         <failure type="did not passed"> details about failure </failure>
<testcase    classname="FMECA_DIA_034" name=" PASS"  />
</testsuite>

根因与解决方案

问题根源是失败用例的<testcase>标签提前使用/>自闭合,导致后续的<failure>节点被XML解析器忽略,无法识别为失败用例。

修正逻辑:当用例存在失败节点时,不要给<testcase>标签加自闭合标记,将<failure>作为子节点放在<testcase>内部,最后用</testcase>闭合标签即可。
该方案为Jenkins展示测试结果的初步实现版本,可根据实际需求补充测试耗时、错误详情等扩展字段。

内容的提问来源于stack exchange,提问作者Hilal Abu-Saleh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:45:08