摘要
别再瞎用 AI 测试工具了。真正能落地的,不是让大模型“随便帮我看个 Bug”,而是把提 Bug、验 Bug、出报告这三件最耗时的重复劳动,封装成 AI 能稳定执行的 Skill。
本文先把 AI Agent 拆成两件事:
- MCP Server = AI 的手脚:负责调接口、操作工具、对接缺陷平台、OCR、浏览器自动化。
- Skill = AI 的脑子 + SOP 手册:负责定规则、排流程、控输出、约束边界。
然后重点拆解 3 个测试三件套 Skill:
- bug-report-writer:自动提 Bug 单,支持两步提交、附件上传、PII 脱敏;
- bug-fix-verifier:批量验证缺陷修复状态,支持四分类判定;
- test-report-generator:自动生成测试报告,上线结论由门禁规则算出来,不是 AI 拍脑袋。
文末会给出 Skill 目录结构、开发流程、最佳实践和上线自查清单。MCP 封装、Stdio/HTTP 方案、5 大核心工具对接自研缺陷平台,会放到系列第二篇单独讲。
一、先搞清楚:Skill 和 MCP 到底是什么关系?
很多测试同学做 AI Agent 时,最容易犯的错误是:把所有逻辑都塞给大模型。
结果就是:
- 模型有时候会脑补;
- 有时候会把本地路径写进 Bug 描述;
- 有时候会跳过复现步骤;
- 有时候还会把手机号、Token 直接提交到缺陷平台。
所以一定要先拆清楚:
组件 | 角色 | 负责什么 |
MCP Server | AI 的手脚 | 调接口、上传附件、查缺陷、跑用例、调 OCR |
Skill | AI 的脑子 + SOP | 规定怎么判断、怎么输出、什么能做、什么不能做 |
一句总结:
手脚负责执行,脑子负责指挥。
Skill 的价值不是“让 AI 更聪明”,而是把测试经验变成可复用的规则。比如:提 Bug 前必须先解析证据、根因只能是推测、敏感信息必须脱敏、提交前必须 dry-run。这些都不是模型天然会的,必须写进 Skill。
二、测试三件套 Skill 1:bug-report-writer
核心指令解析
这个 Skill 的目标很简单:把日志、截图、复现步骤、接口响应等证据,整理成一条合格的 Bug 单。
但它必须遵守三条铁律:
- 先解析证据,再下结论。
不能看到报错就说是后端问题,也不能看到空指针就直接定“代码缺陷”。 - 根因只能是推测,不能写成定论。
除非有明确日志、堆栈、接口返回证据,否则根因字段必须写“疑似”。 - 提交前必须 dry-run。
真正调用缺陷平台接口前,先输出一次预览,让测试或 AI 确认字段、优先级、附件、描述是否合理。
最值钱的设计:两步提交
很多 AI 提单工具最容易翻车的地方就是附件。
常见错误写法是:
附件路径:/Users/xxx/Desktop/bug.png
但缺陷平台拿不到你本地文件。正确做法是两步提交:
- 第一步:先建单,拿到 issue key。
- 第二步:再用 multipart 上传截图附件,并绑定到该 issue key。
这样既避免了“附件上传失败导致整单失败”,也避免了把本地路径写进 Bug 描述。
PII 自动脱敏
提 Bug 时经常会出现手机号、身份证、Token、Cookie、内部域名、账号 ID 等敏感信息。
Skill 必须规定:
- 手机号脱敏为
138****8888; - Token/Cookie 替换为
<TOKEN>; - 身份证、邮箱、内部账号按需脱敏;
- 待脱敏附件禁止直接上传,必须先提示人工确认。
这一步非常关键。测试平台一旦把真实 Token 或用户数据写进缺陷系统,就不是提效问题,而是安全问题。
效果对比
没有 Skill 时:
Bug:登录失败
描述:用户说登不上,帮我看下
优先级:高
附件:无
有 Skill 后:
Bug:登录页输入正确账号密码后提示“系统异常”,未返回具体错误码
环境:测试环境 / iOS 17.2 / App 3.8.1
复现步骤:
目录结构
skills/bug-report-writer/ ├── SKILL.md ├── references/ │ ├── bug_template.md │ ├── priority_rules.md │ └── pii_rules.md ├── templates/ │ ├── bug_report.md │ └── bug_report_json.json └── scripts/ ├── dry_run.py ├── upload_attachment.py └── submit_bug.py- SKILL.md:定义角色、输入、输出、边界、工作流。
- references/:知识库,包括 Bug 模板、优先级规则、脱敏规则。
- templates/:输出模板,保证每次生成格式一致。
- scripts/:执行脚本,负责 dry-run、上传附件、提交缺陷。
三、测试三件套 Skill 2:bug-fix-verifier
核心指令解析
这个 Skill 用来做缺陷修复后的批量验证。
输入通常包括:
- 待验证缺陷列表;
- 缺陷原描述;
- 原复现步骤;
- 最新构建版本;
- 自动化用例执行结果;
- 日志或截图证据。
输出不是简单一句“已修复”,而是结构化结果。
反直觉设计:四分类判定
很多人做缺陷验证时,只分“已修复 / 未修复”。但这在真实测试场景里远远不够。
这个 Skill 采用四分类:
分类 | 含义 | 处理建议 |
fixed | 已修复 | 关闭缺陷或转回归 |
not_fixed | 未修复 | 打回开发,附最新证据 |
intermittent | 偶现 | 强制多跑 5 次,记录复现率 |
env_issue | 环境问题 | 优先判定,避免误伤研发 |
其中env_issue 必须优先判定。
因为很多“看起来没修复”的问题,其实是测试环境数据脏、服务未重启、配置未生效、依赖服务异常、Mock 未更新导致的。如果不先判断环境,很容易把环境问题当成开发未修复,造成无效返工。
两个关键机制
1. 环境问题优先判定
只要出现以下信号,就优先标记为env_issue:
- 依赖服务不可用;
- 配置中心未生效;
- 数据库/缓存数据异常;
- 账号权限缺失;
- 构建版本未更新;
- 自动化用例在本地可过、环境必挂。
2. 偶现问题强制多跑 5 次
如果某缺陷在验证过程中出现“有时成功、有时失败”,不能直接判 fixed,也不能直接判 not_fixed。
必须:
- 标记为
intermittent; - 强制重复执行至少 5 次;
- 记录成功次数、失败次数、失败特征;
- 输出复现率。
例如:
重复执行 5 次,成功 3 次,失败 2 次,复现率 40%。失败时接口返回 timeout,疑似并发场景下锁竞争导致。
输出契约
这个 Skill 的输出会被下游报告消费,所以必须定义稳定 JSON 契约。
示例:
{ "bug_id": "BUG-20261012-003", "status": "not_fixed", "confidence": 0.92, "evidence": [ "api_response_500.json", "verify_step3_fail.png" ], "repeat_count": 1, "intermittent_rate": null, "env_issue_reason": null, "suggestion": "打回开发,补充服务端异常堆栈" }这样后续生成测试报告时,就可以直接统计:
- 已修复多少;
- 未修复多少;
- 偶现多少;
- 环境问题多少;
- 哪些缺陷必须拦截上线。
四、测试三件套 Skill 3:test-report-generator
核心指令解析
这个 Skill 负责把缺陷数据、用例执行数据、环境信息、版本信息汇总成一份测试报告。
但它最狠的设计不是“会写报告”,而是:
“建议上线”不是 AI 拍脑袋,而是门禁规则算出来的。
AI 只负责汇总、解释、表达;是否上线,必须由规则决定。
上线门禁规则
示例规则可以这样设计:
- 用例通过率 ≥ 95%:建议上线;
- 用例通过率 ≥ 90% 且无 P0/P1 遗留缺陷:可评审后上线;
- 存在 P0 缺陷未关闭:禁止上线;
- 存在 P1 缺陷且无临时规避方案:禁止上线;
- blocked 用例不计入分母,skipped 用例也不计入分母;
- 偶现缺陷必须标注复现率,不能直接忽略。
这里有一个很关键但容易被忽略的口径:
通过率分母应剔除 skipped,但不剔除 blocked。
因为 skipped 通常是主动跳过,blocked 则是被阻塞,后者更能反映真实风险。如果 blocked 也被剔除,报告会显得比实际情况更乐观。
输出格式
支持三种输出:
- Markdown:适合 Wiki、飞书文档、CSDN 同步;
- HTML:适合邮件发送;
- PDF:适合正式归档。
如果环境缺少 PDF 生成依赖,就优雅降级为 Markdown/HTML,而不是直接报错。
示例报告结构
# 测试报告:订单服务 v3.8.2 ## 结论 建议上线 ## 门禁结果 - 用例通过率:97.2% - P0 缺陷:0 - P1 缺陷:1(已确认规避方案) - 偶现缺陷:2 - 环境问题:1 ## 风险说明 1. 订单超时补偿存在偶现延迟,复现率 20%,建议上线后观察; 2. 支付回调 Mock 环境不稳定,已标记为环境问题; 3. 用户地址解析接口仍有 1 条 P1 缺陷,已通过降级方案规避。 ## 建议 1. 上线后重点观察订单超时补偿任务; 2. 支付回调异常告警阈值下调; 3. 下一版本优先修复地址解析兼容性问题。五、配套辅助 Skill
除了三大主 Skill,还可以配套几个辅助能力:
Skill | 用途 |
visual-ocr-analyzer | 解析截图、弹窗、报错页面、日志图片 |
test-case-runner | 批量执行用例,返回通过/失败/阻塞结果 |
rootcause-analyzer | 基于日志、堆栈、接口响应增强根因分析 |
这些辅助 Skill 不一定要一次性做完。建议先从bug-report-writer开始,因为它收益最直观:提 Bug 是测试最高频、最容易被感知的动作。
六、Skill 开发标准流程
做 Skill 不能凭感觉写,建议按这 7 步走:
- 明确需求边界
这个 Skill 只解决什么问题?不解决什么问题? - 定义角色和 SOP
AI 扮演什么角色?输入是什么?输出是什么?必须先做什么、后做什么? - 编写 SKILL.md
把规则、模板、边界、异常处理写清楚。 - 单场景测试
用一条典型日志、一张截图、一个缺陷先跑通。 - Skill + MCP 联调
验证它能否正确调用缺陷平台、OCR、用例执行工具。 - 版本管理
SKILL.md、模板、脚本都要纳入版本控制,不能口头改。 - 灰度上线
先给小范围测试同学用,确认不会乱提单、不会泄露敏感信息,再推广。
七、高能最佳实践
这几条建议直接避开 90% 的翻车点。
1. 职责隔离
Skill 只负责决策和输出格式,MCP 只负责调用工具和接口。不要把接口鉴权、重试、上传逻辑全部塞进 SKILL.md。
2. 固定输出模板
Bug 单、验证结果、测试报告都必须有固定模板。否则 AI 今天输出 Markdown,明天输出纯文本,后天输出 JSON,下游根本没法消费。
3. 高危操作必须人工确认
提交 Bug、关闭缺陷、变更状态、发送报告,这些动作都必须有 dry-run 或人工确认环节。
4. 信息不足就提问,严禁脑补
如果缺少环境、版本、日志、截图、账号权限,Skill 应该主动追问,而不是自己编一个“疑似后端异常”。
5. 拆分细粒度 Skill
不要做一个“万能测试 Agent”。提单、验证、报告、OCR、用例执行,最好拆成多个 Skill。这样更容易调试,也更容易复用。
6. 完善异常容错
接口超时、附件过大、缺陷平台限流、OCR 识别失败、用例执行中断,都要有兜底策略。
八、上线前终极自查清单
发布前建议逐条过一遍:
- 这个 Skill 的职责是否清晰?有没有越权?
- 它是否有权限提交、修改、关闭缺陷?
- 输出是否固定模板?下游能否稳定解析?
- 是否会输出手机号、Token、Cookie、内部账号?
- 高危操作是否有 dry-run 或人工确认?
- 信息不足时是否会主动追问,而不是脑补?
- 是否已经用真实缺陷、真实日志、真实截图验证过?
- SKILL.md、模板、脚本是否都有版本管理?
九、完整落地链路
第一篇先把 Skill 讲清楚,第二篇再展开 MCP 封装。完整链路是这样的:
封装自研缺陷平台 MCP → 开发三大 Skill → 单 Skill 调试 → Skill + MCP 联调 → 灰度给小范围测试同学 → 收集反馈持续迭代下一篇会重点讲:
- Stdio MCP 和 HTTP MCP 怎么选;
- 自研缺陷平台如何封装 5 大核心工具;
create_bug、get_bug、list_bugs、update_bug_status、get_bug_statistics怎么设计;- 鉴权、CORS、HTTPS、参数校验、异常处理怎么落地。
最后聊两句
你平时提 Bug、验 Bug、写报告,最烦的是哪一步?是反复截图、补复现步骤,还是跟开发来回确认环境?评论区吐槽一下,说不定下一个 Skill 就帮你解决它。
如果觉得这类“测试 + AI Agent”的实战对你有帮助,点个赞让我知道有人看,我会继续把系列更下去。下一篇打算写《用 MCP 封装自研缺陷平台:5 个核心工具实战》,想看的评论区扣 1。