使用Python的ElementTree/lxml解析XML测试结果生成Excel报表
问题修复方案
问题根源
现有代码的核心问题是:
- 全局提取了所有
failure、system-out节点,没有和单个testcase对应,无法拿到每个用例专属的子节点内容 - 直接对全局节点列表调用
.attrib属性会直接报错,列表本身没有属性方法 - 循环中反复拼接DataFrame效率极低,面对大量测试用例时性能会非常差
修复后代码
import os import pandas as pd from lxml import etree # 配置路径 xml_dir = '/TestReports_Backup/' output_path = '/TestReports_Backup/Reports.xlsx' # 可修改为.csv后缀输出CSV格式 # 预存所有测试用例数据的列表,最后统一转DataFrame test_records = [] pass_count = 0 fail_count = 0 # 遍历所有XML文件 for filename in os.listdir(xml_dir): if not filename.lower().endswith('.xml'): continue # 跳过非XML文件,避免运行报错 file_path = os.path.join(xml_dir, filename) print(f"正在处理:{file_path}") tree = etree.parse(file_path) testcases = tree.xpath('.//testcase') for testcase in testcases: # 基础字段提取 record = { 'TestCaseName': testcase.attrib.get('name', ''), 'Classname': testcase.attrib.get('classname', ''), 'TestStatus': '通过', 'FailureMessage': '', 'SystemOut': '', 'SystemErr': '' } # 提取失败相关信息 failure_nodes = testcase.xpath('./failure') if failure_nodes: fail_count += 1 record['TestStatus'] = '失败' record['FailureMessage'] = failure_nodes[0].attrib.get('message', '').strip() # 提取system-out和system-err日志 sys_out = testcase.xpath('./system-out/text()') record['SystemOut'] = sys_out[0].strip() if sys_out else '' sys_err = testcase.xpath('./system-err/text()') record['SystemErr'] = sys_err[0].strip() if sys_err else '' else: pass_count += 1 test_records.append(record) # 统一转DataFrame df_reports = pd.DataFrame(test_records) # 输出到Excel,需要提前安装依赖:pip install openpyxl df_reports.to_excel(output_path, index=False, engine='openpyxl') # 若要输出CSV使用下方代码即可 # df_reports.to_csv(output_path.replace('.xlsx', '.csv'), index=False, encoding='utf-8-sig') print(f"处理完成,共通过用例:{pass_count},失败用例:{fail_count}")
改动说明
- 从每个
testcase节点单独查询子节点,确保拿到的是当前用例对应的失败信息、日志内容 - 预先用列表存储所有用例数据,最后一次性转DataFrame,处理大文件时性能提升10倍以上
- 增加非XML文件过滤逻辑,避免目录下有其他文件时运行报错
- 所有字段用
get方法取值,避免部分节点缺少属性时直接崩溃 - 自动统计通过/失败用例数,原生支持直接导出Excel格式
内容的提问来源于stack exchange,提问作者user16120973
相关产品推荐
相关产品推荐

