首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从 Allure 结果里提取失败/异常用例并生成 pytest 重跑命令

从 Allure 结果里提取失败/异常用例并生成 pytest 重跑命令

作者头像
用户12558604
发布2026-06-17 17:53:03
发布2026-06-17 17:53:03
10
举报

前言

  • Allure 在执行 pytest 时会生成 JSON 结果文件
  • • 希望实现一个工具:
    1. 1. 读取 allure 的结果目录;
    2. 2. 找到 最新一次执行失败或 broken 的用例
    3. 3. 把这些用例的 pytest nodeid 提取出来;
    4. 4. 自动生成一条 pytest 重跑命令

代码实现

代码语言:javascript
复制
bash
import os
import json
from pathlib import Path

ALLURE_RESULTS_DIR = "report"# allure结果目录
PYTEST_BASE_CMD = "pytest -v --alluredir=report "


defallure_fullname_to_nodeid(fullname: str) -> str:
    """
    将 allure fullName 转换为 pytest nodeid
    e.g.
    -> test_case/xxx.py::TestClass::test_func
    """
    if"#"notin fullname:
        return fullname

    module_part, func_name = fullname.split("#", 1)
    parts = module_part.split(".")

    # 最后一个是类名
    class_name = parts[-1]
    file_path = "/".join(parts[:-1]) + ".py"

    returnf"{file_path}::{class_name}::{func_name}"


defget_latest_failed_or_broken_cases(allure_results_dir):
    case_latest = {}  # {fullName: (timestamp, status, nodeid)}

    for file in Path(allure_results_dir).glob("*.json"):
        try:
            withopen(file, "r", encoding="utf-8") as f:
                data = json.load(f)
        except Exception:
            continue

        full_name = data.get("fullName")
        status = data.get("status")
        start = data.get("start", 0)

        ifnot full_name:
            continue

        nodeid = allure_fullname_to_nodeid(full_name)

        # 如果这个 case 没见过,或者发现更新的执行记录 → 覆盖
        if (full_name notin case_latest) or (start > case_latest[full_name][0]):
            case_latest[full_name] = (start, status, nodeid)

    # 只留下最新是 failed/broken 的
    return [v[2] for v in case_latest.values() if v[1] in {"failed", "broken"}]


defbuild_pytest_cmd(cases):
    ifnot cases:
        return"echo 'No failed/broken cases found'"
    return PYTEST_BASE_CMD + " ".join(cases)


if __name__ == "__main__":
    cases = get_latest_failed_or_broken_cases(ALLURE_RESULTS_DIR)
    for i insorted(cases):
        print(i)
    cmd = build_pytest_cmd(cases)
    print("重跑命令:")
    print(cmd)
    print(len(cases))

输出:

  • • 所有最新失败/异常的 nodeid
  • • 失败数量
  • • 可选:重跑命令

#Python

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程拾光 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档