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

