8. 一键出报告,结果填入HTML模板
配套动画视频在《8. 一键出报告结果填入HTML模板》源代码在《评论区置顶》。截图有了还差一份能打开看的测试报告。这一节把结果填进 HTML 模板先声明工具入参再把输出路径和截图路径规范到工程内有 test_results.json 就读并合并用例截图没有则从文本里解析总计/通过/失败。接着用 Jinja2 把结果填进 templates/report_template.html写出能本地打开的网页并返回通过率任一步异常则返回错误信息。模板要用到 Jinja2提前装好即可pip install Jinja2先定义工具入参test_output 是结果文本output_path 是报告保存路径screenshots 是截图路径列表。调用时要把截图路径传进来否则报告里看不到图。工具名是 generate_test_reportAgent 按这个名字调用class GenerateReportInput(BaseModel): test_output: str Field(description测试输出结果) screenshots: list Field(default_factorylist, description截图路径列表) output_path: str Field(description报告保存路径) class GenerateReportTool(BaseTool): name: str generate_test_report description: str 根据测试结果生成HTML测试报告 args_schema: Type[BaseModel] GenerateReportInput_run 里先做路径规范化。传入的路径可能是 /testcases/...也可能是相对路径。用 _resolve 统一成工程根目录下的绝对路径截图列表里每一项同样处理。screenshots 为 None 时按空列表处理。整个 _run 包在 try/except 里任一步异常都返回错误信息def _run(self, test_output: str, output_path: str, screenshots: list None) - str: base_dir os.path.dirname(os.path.abspath(__file__)) def _resolve(path): if path.startswith(/): return os.path.normpath(os.path.join(base_dir, path.lstrip(/))) return path if os.path.isabs(path) else os.path.normpath( os.path.join(base_dir, path)) output_path _resolve(output_path) if screenshots is None: screenshots [] screenshots [_resolve(s) for s in screenshots]取数时优先看 testcases/test_results.json。有就 json.load并把每个用例 screenshots 里的 path 合并进截图列表。没有 JSON就调用 _parse_output 从 test_output 文本里解析总计、通过和失败results_file os.path.join(base_dir, testcases, test_results.json) if os.path.exists(results_file): with open(results_file, r, encodingutf-8) as f: test_results json.load(f) for tc in test_results.get(test_cases, []): for s in tc.get(screenshots, []): p s.get(path) if isinstance(s, dict) else s if p and p not in screenshots: screenshots.append(p) else: test_results self._parse_output(test_output)渲染阶段根据 passed/total 算通过率 rate把外部传入的 screenshots 与各用例内截图去重合并成 all_shots用 FileSystemLoader 加载 templates/report_template.html把 results、rate、type_labels、all_shots、report_dir 和 to_relative_path 传给模板。to_relative_path 把截图绝对路径转成相对报告文件的路径并把反斜杠换成 /本地打开 HTML 时图片才能显示report_dir os.path.dirname(os.path.abspath(output_path)) rate (results[passed] / results[total] * 100) if results[total] 0 else 0 type_labels {before: 测试前, after: 测试后, failed: 失败时, error: 错误时, step: 步骤截图} all_shots [] seen set() for s in screenshots: if s not in seen: all_shots.append(s) seen.add(s) template_dir os.path.join(os.path.dirname(os.path.abspath(__file__)), templates) env Environment(loaderFileSystemLoader(template_dir)) template env.get_template(report_template.html) def to_relative_path(abs_path: str, base_dir: str) - str: try: rel os.path.relpath(abs_path, base_dir) return rel.replace(\\, /) except Exception: return abs_path.replace(\\, /) html template.render( resultsresults, raterate, type_labelstype_labels, all_shotsall_shots, report_dirreport_dir, to_relative_pathto_relative_path) return html最后调用 _build_html 得到完整 HTML 字符串确保输出目录存在再写入 output_path。返回值带上总计、通过、失败和通过率中间抛异常时返回「生成报告失败…」html self._build_html(test_results, screenshots, output_path) output_file Path(output_path) output_file.parent.mkdir(parentsTrue, exist_okTrue) with open(output_file, w, encodingutf-8) as f: f.write(html) total test_results.get(total, 0) passed test_results.get(passed, 0) failed test_results.get(failed, 0) rate (passed / total * 100) if total 0 else 0 return f报告生成成功{output_path}\n总计:{total} 通过:{passed} f失败:{failed} 通过率:{rate:.1f}%要把启停截图和出报告串起来可以用 open_app_screenshot_close_report先调用 open_app_screenshot_close 拿到 shot_path再拼一份单用例结构的 test_results 写入 test_results.json最后调用 GenerateReportTool._runscreenshots 参数带上 [shot_path]报告页面里才会有这张图shot_path open_app_screenshot_close(screenshot_path) passed 1 if shot_path else 0 failed 0 if shot_path else 1 case_shots [] if shot_path: case_shots.append({type: step, label: app_screenshot, path: shot_path}) test_results { total: 1, passed: passed, failed: failed, test_cases: [{ case_id: TC_OPEN_SHOT_CLOSE, case_name: 启动App截图关闭, status: passed if shot_path else failed, screenshots: case_shots, }], } with open(results_file, w, encodingutf-8) as f: json.dump(test_results, f, ensure_asciiFalse, indent2) shot_list [shot_path] if shot_path else [] report_msg GenerateReportTool()._run(, report_path, shot_list)这样从启停截图到 HTML 报告就接上了本地打开报告文件就能看到通过率和对应截图。配套动画视频在《8. 一键出报告结果填入HTML模板》源代码在《评论区置顶》。

相关新闻

AI安全实践:从RSI框架到可落地的模型风险评估与管控

AI安全实践:从RSI框架到可落地的模型风险评估与管控

这次我们来看一个很有意思的现象:AI 公司一边在公开场合自嘲“AI 失控”,一边却在内部或对特定受众大力鼓吹 RSI(Responsible Scaling Policies,负责任扩展策略)。这看似矛盾的行为背后,其实反映了当前 AI …

2026/8/9 3:45:37 阅读更多 →
Agent Runtime架构设计:从Prompt到可校验执行链路的工程实践

Agent Runtime架构设计:从Prompt到可校验执行链路的工程实践

1. 从 Prompt 到执行:为什么我们需要一个“运行时”?如果你最近在折腾 AI 应用开发,尤其是想搞点能自主完成复杂任务的智能体(Agent),那你肯定对这两个词不陌生:Prompt和Agent Runtime。前者是给…

2026/8/9 3:45:37 阅读更多 →
AI Agent架构设计:从直觉到工程的Plan-and-Execute模式解析

AI Agent架构设计:从直觉到工程的Plan-and-Execute模式解析

1. 从直觉到架构:为什么“边想边干”在AI Agent里行不通聊到AI Agent,很多人脑子里蹦出来的第一个画面,可能就是ChatGPT那种一问一答,或者让它写个邮件、改个代码,它“思考”一下(也就是生成一段文本&#…

2026/8/9 3:45:37 阅读更多 →

最新新闻

P2858 [USACO06FEB] Treats for the Cows G/S

P2858 [USACO06FEB] Treats for the Cows G/S

题目描述约翰经常给产奶量高的奶牛发特殊津贴,于是很快奶牛们拥有了大笔不知该怎么花的钱。为此,约翰购置了 N(1≤N≤2000)份美味的零食来卖给奶牛们。每天约翰售出一份零食。当然约翰希望这些零食全部售出后能得到最大的收益&…

2026/8/9 4:51:11 阅读更多 →
CPU 和 GPU 核心差别在哪?为什么 AI 训练离不开 GPU

CPU 和 GPU 核心差别在哪?为什么 AI 训练离不开 GPU

提到人工智能、大模型训练,大家听得最多的一个词就是 GPU。很多人会疑惑:电脑有强大的 CPU,为什么训练 AI 还非要上 GPU?CPU 不能代替 GPU 做人工智能吗?今天通俗讲清楚 CPU 与 GPU 的底层差异,看懂之后就能…

2026/8/9 4:51:11 阅读更多 →
Navicat重置试用期脚本:macOS开发者必备的数据库管理利器终极指南

Navicat重置试用期脚本:macOS开发者必备的数据库管理利器终极指南

Navicat重置试用期脚本:macOS开发者必备的数据库管理利器终极指南 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac …

2026/8/9 4:51:11 阅读更多 →
3大核心技术:D3KeyHelper如何用像素级精准控制解放暗黑3玩家操作

3大核心技术:D3KeyHelper如何用像素级精准控制解放暗黑3玩家操作

3大核心技术:D3KeyHelper如何用像素级精准控制解放暗黑3玩家操作 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 在暗黑破坏神3的高强度游…

2026/8/9 4:51:11 阅读更多 →
AI Agent面试实战:从架构设计到工程落地的核心能力解析

AI Agent面试实战:从架构设计到工程落地的核心能力解析

1. 项目概述:从“八股文”到“实战派”的AI Agent面试突围最近在牛客网、脉脉这些技术社区里,AI Agent相关的讨论热度一直居高不下。无论是校招的应届生,还是寻求转型的资深工程师,都绕不开这个话题。我翻看了大量面经&#xff0c…

2026/8/9 4:51:11 阅读更多 →
PPT制作软件推荐:如何选择适合办公场景的高效工具

PPT制作软件推荐:如何选择适合办公场景的高效工具

在日常办公中,PPT演示文稿是传递信息、汇报工作和展示成果的重要载体。传统PPT制作需要花费大量时间在版式设计、内容排版和素材搜索上,随着AI技术的发展,智能PPT制作工具正在改变这一现状。本文将从办公场景的实际需求出发,分析主…

2026/8/9 4:50:10 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →