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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 21:15:08