别再手写测试报告了!我让AI看图写报告,效率暴涨15倍
把截了一天的图丢给AI,5分钟后,一份带截图、带步骤、带颜色标记的Word测试报告就出来了。本文完整记录技术方案 + 代码 + 8个真实踩坑。
你一定经历过这个场景
下午5点50分,项目经理在企业微信发了条消息:
*"那个认证模块的测试报告今天能出吗?发我一下。"*
你看着桌面上的16张截图,又看看时间——还有10分钟下班。
没时间了。你打开Word,开始手动操作:
建表格、写基本信息、一张张插截图、回忆每张图对应哪个步骤、写操作描述、写预期结果、写实际结果、调字体、调颜色、调对齐……
半小时后,报告交上去了。但看着那密密麻麻的截图,你心里清楚——下个版本测完,这活儿还得再来一遍。
截图写报告,是测试工程师最耗时的纯体力活,没有之一。
---
先看效果:截图进去,报告出来
拿一个6步的认证流程测试来演示。
输入:6张测试截图
把截图一股脑丢给AI:
| 截图 | 页面内容 | AI自动识别为 |
| ------ | ---------- | ------------ |
| 图1 | 身份管理页面,含"去认证"按钮 | ✅ 步骤1:进入身份管理,触发认证 |
| 图2 | 个人信息表单,含姓名/证件号字段 | ✅ 步骤2:填写认证信息 |
| 图3 | 人脸认证二维码 | ✅ 步骤3:扫码引导页 |
| 图4 | 手机端"认证通过"页面,绿色勾选 | ✅ 步骤4:人脸验证通过 |
| 图5 | PC端"认证成功"页面 | ✅ 步骤5:PC端同步完成 |
| 图6 | "提交成功"含4秒倒计时跳转 | ✅ 步骤6:最终提交确认 |
输出:一份完整Word测试报告(30秒)
直接拿到 `.docx` 文件,里面自动包含:
- 📋 基本信息表(项目/模块/环境/日期)
- 📝 测试概述
- 🔍 6个步骤的详细记录(每步含操作描述、预期结果、实际结果颜色标记、对应截图嵌入)
- 📊 结果汇总表(通过率、通过数、失败数)
- 🎯 测试结论与改进建议
效率对比
| 环节 | 纯手工 | AI辅助 | 提升 |
| ------ | -------- | -------- | ------ |
| 理解截图、梳理步骤 | ~5分钟 | ~30秒 | **10x** |
| 编写报告文字 | ~15分钟 | ~1分钟 | **15x** |
| 排版 + 嵌入截图 | ~10分钟 | 自动 <30秒 | **20x** |
| 🏁 **全流程合计** | **~30分钟** | **~2分钟** | **15倍** |
省下的时间,够你写完当天的工作日志,再下楼买杯奶茶。
核心思路:三刀流
整个流水线就三步:
📸 截图集合 → 🧠 AI 多模态理解 → 📄 结构化报告大部分人只想到第一层——让AI OCR识别截图里的文字。
但**测试报告需要的不只是文字**,还需要:
- 🧩 **流程推断**:这张图是"填写步骤",下一张是"提交结果",AI要知道它们的前后关系
- ✅ **状态判断**:截图中绿色勾选 = 通过,红色叉号 = 失败,AI要能理解UI语义
- 📊 **数据提取**:URL域名 → 环境信息、表单内容 → 测试数据、时间戳 → 执行耗时
这才是测试 AI 需要的深度理解,不是OCR能搞定的。
技术方案
整体架构
┌──────────────┐ ┌─────────────────────┐ ┌──────────────────┐ │ 截图集合 │ ──▶ │ 多模态 AI 分析层 │ ──▶ │ 报告生成引擎 │ │ .png / .jpg │ │ · 文字提取+UI理解 │ │ · python-docx │ │ 按时间排序 │ │ · 步骤推断+状态判定 │ │ · 截图嵌入 │ │ │ │ · 结构化数据输出 │ │ · 颜色标记 │ └──────────────┘ └─────────────────────┘ └──────────────────┘技术栈选型
| 层 | 选型 | 为什么选它 |
| 截图读取 | 多模态 AI(支持图片理解) | 直接读图,不用额外OCR预处理 |
| 流程推断 | Prompt Engineering | 定好"测试视角"约束,AI一步到位输出结构化结果 |
| 报告生成 | python-docx / docx.js | 原生支持表格、图片嵌入、颜色标记,输出标准docx |
Prompt 设计(核心)
Prompt 是这套方案的灵魂。要让 AI 从"普通看图"切换到"测试视角",需要三组约束:
① 信息提取指令
从每张截图中提取:页面标题、URL/域名、关键按钮名称、表单字段、状态提示文字(成功/失败/警告)
② 流程推断指令
按截图顺序推断完整测试流程。每张截图对应一个步骤,描述:用户做了什么操作→系统应该有什么响应→截图中实际显示的结果
③ 报告格式指令
输出结构:基本信息→测试概述→按步骤展开→结果汇总。每步必须包含"操作/预期/实际/截图"四项。"通过"用绿色、"失败"用红色
这三组指令缺一不可——少了信息提取,报告是空的;少了流程推断,步骤是乱的;少了格式约束,输出是散装的。
核心代码(Node.js + docx)
完整可复现的实现,Python 版本同理(换 python-docx 即可)。
1. 定义报告模板——步骤块生成器
// report-template.js const { Document, Packer, Paragraph, TextRun, ImageRun, HeadingLevel } = require("docx"); // 统一颜色体系 const COLOR = { PASS: "2E7D32", // 绿 → 通过 FAIL: "C62828", // 红 → 失败 INFO: "1565C0", // 蓝 → 信息/预期 MUTED: "666666", // 灰 → 辅助文字 }; /** 生成一个完整测试步骤块(含截图) */ function createStepBlock(stepNum, action, expected, actual, imgBuffer, passed) { const color = passed ? COLOR.PASS : COLOR.FAIL; return [ new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun({ text: Step ${stepNum} })], spacing: { before: 360, after: 200 } }), // 操作 new Paragraph({ children: [ new TextRun({ text: "【操作】", bold: true }), new TextRun({ text: action }), ], spacing: { after: 80 } }), // 预期结果 new Paragraph({ children: [ new TextRun({ text: "【预期结果】", bold: true }), new TextRun({ text: expected, color: COLOR.INFO }), ], spacing: { after: 80 } }), // 实际结果(颜色标记通过/失败) new Paragraph({ children: [ new TextRun({ text: "【实际结果】", bold: true }), new TextRun({ text: actual, color }), ], spacing: { after: 200 } }), // 截图嵌入 new Paragraph({ alignment: "center", children: [ new ImageRun({ type: "png", data: imgBuffer, transformation: { width: 550, height: 320 }, altText: { title: { name: fig${stepNum}, description: 步骤${stepNum}截图 }} }) ] }) ]; }2. 组装完整报告
// generate.js async function generateTestReport(testData, screenshots) { const doc = new Document({ sections: [{ children: [ // → 一、基本信息 sectionTitle("一、基本信息"), buildInfoTable(testData), // → 二、测试概述 sectionTitle("二、测试概述"), bodyText(testData.overview), // → 三、测试过程(动态生成每个步骤块) sectionTitle("三、测试过程"), ...testData.steps.flatMap((s, i) =&gt; createStepBlock(i + 1, s.action, s.expected, s.actual, screenshots[i], s.passed) ), // → 四、结果汇总 sectionTitle("四、测试结果汇总"), buildSummaryTable(testData.steps), // → 五、结论 sectionTitle("五、测试结论与建议"), ...buildConclusion(testData.steps), ] }] }); const buffer = await Packer.toBuffer(doc); fs.writeFileSync(testData.outputPath, buffer); }3. 汇总表(自动计算通过率)
function buildSummaryTable(steps) { const total = steps.length; const passed = steps.filter(s => s.passed).length; const failed = total - passed; const rate = ((passed / total) * 100).toFixed(0); return new Table({ rows: [ summaryRow("总步骤数", total, COLOR.INFO), summaryRow("✅ 通过", passed, COLOR.PASS), summaryRow("❌ 失败", failed, failed > 0 ? COLOR.FAIL : COLOR.MUTED), summaryRow("📊 通过率", ${rate}%, rate >= 100 ? COLOR.PASS : COLOR.FAIL), ] }); }⚠️ 常见坑汇总(8个真实踩坑)
以下都是我在实际使用中真正踩过的坑,每个都浪费了至少15分钟。
坑1:截图文件命名混乱,AI 读错顺序
**现象**:截图混用中文名、微信默认名、截图工具序号,三种命名规则在一起,AI 按字母序读图,和实际操作顺序完全不搭。
**解法**:**统一命名规则**。用 `01_步骤描述.png`、`02_步骤描述.png` 的格式。如果截图已经很多了,用 PowerShell 一行批量重命名:
Get-ChildItem *.png | ForEach-Object -Begin { $i=1 } { Rename-Item $_ -NewName ("{0:D2}_screenshot.png" -f $i++) }坑2:截图质量太差,AI 直接"瞎了"
**现象**:模糊的截图、只截了半张页面的、带巨大水印的——AI 要么识别出乱码,要么直接跳过。
**解法**:三条硬规则——
- 截图分辨率不低于 1920×1080
- 必须包含完整的浏览器窗口(含地址栏,方便AI识别域名)
- 避免水印盖在关键文字上
坑3:中英文混排导致信息串行
**现象**:中文 UI 界面 + 英文技术术语 + 数字 ID 混在一起,AI 有时把英文错误码识别到中文描述后面去,串成一锅粥。
**解法**:Prompt 里加一句约束——`每隔一个中英切换处独立成行,不要混排在一段里`。同时在报告模板中,英文内容默认用等宽字体(Consolas),和中文宋体区分开。
坑4:纯图标页面无法提取步骤信息
**现象**:有些页面只有图标和图形,没有任何文字(比如纯图形化的流程图、仪表盘)。AI 只能"看到"但无法生成有意义的步骤描述
**解法**:这类页面需要加人工标注。截图后用画图工具在角落加一行小字标注(如"步骤3-扫码页"),AI 就能准确识别了。别指望靠AI看图猜——没有文字锚点,多模态的准确率会从 90% 掉到 40%。
坑5:截图和截图之间缺少上下文衔接
**现象**:从"表单页"跳到"成功页"中间少了一张"提交确认"的截图,AI 会自己脑补一个步骤,脑补的内容有时候是错的。
**解法**:截图前确保每个用户操作步骤都有对应截图,尤其是中间状态(loading、确认弹窗、跳转过渡页)。如果确实缺了,在给AI的指令里标注"以下截图可能存在步骤缺失,请以实际截图为准,不要补充未出现的操作"。
坑6:docx 库对图片格式要求苛刻
**现象**:`ImageRun` 直接读 `.jpg` 报错,或者图片嵌入后变形。
**解法**:**全部统一转 png 格式再嵌入**。用 Node.js 的 `sharp` 库(或 Python 的 Pillow)预处理:
// ⚠️ .jpg 必须转 .png 才能被 ImageRun 稳定处理 const sharp = require("sharp"); const pngBuffer = await sharp(jpgB