1. 项目概述:SKILL.md 不是文档,是 Agent 的“上岗操作证”
你有没有遇到过这样的场景:团队里新来一位测试同学,被安排接入一个刚上线的自动化测试 Agent,结果对着控制台发呆——不是不会写代码,而是根本不知道这个 Agent “认什么指令”、“能听懂哪些话”、“干错活了怎么喊停”。我带过的几个模拟项目X里,70%的新手卡点不在技术栈,而在“不知道该跟 Agent 说什么”。而 SKILL.md 这个文件,就是解决这个问题的钥匙。它不是传统意义上的说明文档,更像是一张贴在 Agent 脑门上的“岗位说明书+操作速查卡+安全边界告示牌”三合一凭证。标题里说“一个 SKILL.md 就能让 Agent 干活”,这话没夸张——只要这份文件写得准、写得实、写得细,哪怕测试人只懂基础 Markdown 和业务术语,也能在5分钟内让 Agent 执行一次接口巡检、生成一份缺陷摘要、甚至自动比对两轮测试报告的差异项。它背后对应的是当前测试领域最实际的演进方向:从“人写脚本驱动工具”,转向“人用自然语言指挥智能体”。关键词里的“测试人入门必看”,恰恰点中了要害——这不是给算法工程师看的模型结构图,而是给每天要跑20个用例、填3份日报、还要临时救火的测试同学准备的“第一块踏脚石”。它不涉及模型训练、不依赖GPU资源、不需要调参经验,唯一门槛是:你得清楚自己日常到底在做什么、怎么做、哪些步骤绝对不能出错。下面我会以一个真实模拟项目X中的测试Agent为蓝本,把 SKILL.md 从设计逻辑、字段含义、实操陷阱到排错心法,一层层剥开给你看。
2. SKILL.md 的底层设计逻辑:为什么必须是 Markdown?为什么必须叫这个名字?
2.1 它不是配置文件,而是“人机协议”的最小可行载体
很多人第一反应是:“这不就是个 YAML 配置?”或者“直接写个 JSON 不更规范?”——这是典型的技术惯性思维。但 SKILL.md 的存在,本质是在解决一个更底层的问题:降低人和 Agent 之间的语义摩擦成本。我们拆解一下测试人的日常工作流:
- 看需求文档 → 拆用例 → 设计数据 → 执行测试 → 记录结果 → 分析差异 → 提交缺陷
- 这些动作里,90% 是用自然语言描述的(比如“检查登录失败时提示是否包含‘密码错误’四个字”),只有10% 是纯技术动作(比如“调用 /api/v1/login 接口,body 传 {‘user’:‘test’, ‘pwd’:‘123’}”)。
如果强制要求测试人去写 JSON Schema 或 YAML 描述“当用户说‘查下昨天失败的用例’时,Agent 应该执行 SQL 查询 test_result 表并按 status=‘fail’ 过滤”,那等于把“翻译官”的活儿又塞回给人。而 Markdown 天然支持混合表达:
- 用
#标题定义技能大类(如# 接口测试) - 用
-列表写触发条件(如- 当用户提到‘超时’、‘响应慢’、‘504’时) - 用代码块
bash 写真实可执行命令(如bash curl -X GET "http://test-api/status" ```) - 用加粗强调关键约束(如必须校验返回码为200,否则终止执行)
这种混排能力,让一份 SKILL.md 同时具备三种角色:
- 对测试人:是“我该怎么跟它说”的口语化指南;
- 对开发人:是“这个 Agent 能力边界的白纸黑字契约”;
- 对 Agent 引擎:是可被规则引擎解析的结构化指令集(通过正则+关键词匹配+上下文槽位提取实现,无需大模型实时理解)。
提示:SKILL.md 的解析逻辑通常不走 LLM 推理,而是基于轻量级 NLU 模块(如 Rasa NLU 或自研关键词+意图树)。这意味着它启动快、响应稳、成本低——这也是它能在测试环境快速落地的根本原因。
2.2 “SKILL” 这个命名,是刻意为之的能力锚定
为什么不是 “CONFIG.md”、“AGENT.md” 或 “TASK.md”?因为“SKILL”这个词直指核心:它定义的是 Agent 的可复用能力单元,而非一次性任务或系统配置。一个合格的 SKILL 必须满足三个硬性条件:
- 原子性:一个 SKILL 只做一件事,且这件事有明确输入/输出。例如,“生成缺陷报告”是一个 SKILL,“生成报告并邮件发送”就是两个 SKILL 的组合。
- 可验证性:每个 SKILL 必须附带至少一个
# 示例对话区块,且该示例必须能在本地复现(比如用curl或 Postman 模拟用户提问,Agent 返回预期结果)。 - 可禁用性:当某项能力不稳定时,只需注释掉对应
# 技能名称下的整个区块,无需改代码、不重启服务。
我在某高校实验室带学生做模拟项目X时,就用这个标准筛掉过60%的初版 SKILL.md:有人把“分析性能瓶颈”写成一个 SKILL,但实际包含“查CPU占用”、“看GC日志”、“比对JVM参数”三个子动作,且没有明确定义哪个环节失败时如何降级。最后我们把它拆成# 查看服务器CPU占用、# 解析JVM GC日志两个独立 SKILL,并在后者中加入> 注意:若日志路径不存在,自动切换至默认路径 /var/log/jvm_gc.log的兜底说明。这种拆分不是为了炫技,而是为了让测试人在排查问题时,能精准定位到是哪个能力模块出了问题。
2.3 文件名强制为 SKILL.md:统一入口,杜绝歧义
有些团队尝试用test_skill.yaml或agent_capabilities.json,结果在协作中出现严重混乱:
- 开发说:“我按 JSON 格式实现了”;
- 测试说:“我写的 Markdown 示例没生效”;
- 运维说:“部署脚本只认 SKILL.md,你们谁改了名字?”
强制命名为 SKILL.md,本质是建立一种契约共识:
- 所有参与方默认这个文件就是 Agent 的“能力身份证”;
- 工具链(CI/CD 脚本、本地调试器、权限校验模块)都只监听这个文件名;
- 新人入职时,第一份文档就是
docs/SKILL.md,而不是在十几个配置文件里大海捞针。
实测下来,采用统一命名后,某公司测试团队的 Agent 接入平均耗时从3.2天缩短到0.7天。这不是因为技术变简单了,而是因为“知道该看哪里”这件事本身,就省掉了大量沟通成本。
3. SKILL.md 的核心字段解析:每一行都在回答“它能干什么、怎么干、不能干什么”
3.1# 技能名称:不是标题,是能力ID的自然语言映射
很多新手会写# 接口测试或# 缺陷管理这种宽泛名称,结果导致 Agent 无法精准匹配。正确的写法必须满足:名词+动词+限定条件三要素。例如:
- ❌
# 接口测试(太宽泛,没说明动作和对象) - ✅
# 查询指定环境的用户信息接口状态(名词:用户信息接口;动词:查询;限定:指定环境) - ✅
# 生成最近3次冒烟测试的缺陷分布热力图(名词:冒烟测试缺陷;动词:生成;限定:最近3次+热力图)
为什么这么较真?因为 Agent 的意图识别模块,本质上是把用户输入切词后,与所有# 技能名称做相似度匹配。当名称越具体,匹配准确率越高。我们在模拟项目X中做过对比实验:使用限定词的 SKILL 名称,意图识别准确率从78%提升到94%,误触发率从12%降到2%以下。
注意:名称中禁止出现模糊词汇,如“相关”、“某些”、“大概”。必须用可枚举的实体。例如
# 查询生产环境订单接口的5xx错误率中,“生产环境”、“订单接口”、“5xx错误率”都是可确认的实体,而# 查询相关接口的错误情况则完全无法解析。
3.2- 触发条件:定义“什么时候该它上场”,不是“它想干什么”
这是最容易被写反的部分。新手常写成- Agent 需要检查接口响应时间,这其实是 Agent 的内部逻辑,不是触发条件。触发条件必须是用户可能说出的话,且需覆盖口语化表达。正确写法示例:
- 用户提到‘响应慢’、‘卡顿’、‘半天没反应’等近义词- 用户输入包含‘/api/v1/order’且问题类型为‘超时’- 用户消息中同时出现‘压测’和‘TPS’两个关键词
关键技巧:每条触发条件后,必须紧跟→符号,指向该条件对应的执行动作。例如:
- 用户说‘看看昨天失败的用例’ → 执行 SQL:SELECT * FROM test_case WHERE exec_time > '2024-04-01' AND status = 'fail'这样写的好处是,开发在实现时能直接照搬,测试在验证时能逐条核对,连产品都能看懂“用户说这句话,系统到底会干什么”。
3.3bash 执行命令:不是伪代码,是必须能粘贴运行的真命令
这里踩过最大的坑是:有人写# 调用登录接口,然后在代码块里写curl -X POST ...,但没写清楚...里到底是什么。结果测试同学复制粘贴后报错,以为是 Agent 问题,其实是命令本身缺参数。
合格的执行命令区块必须包含:
- 完整可执行路径:
curl -X GET "http://test-api.internal:8080/health",而不是"http://test-api/health"; - 显式参数值:
-H "Authorization: Bearer ${TOKEN}"中的${TOKEN}必须注明来源(如“从环境变量 TOKEN 获取”); - 预期返回格式说明:在代码块下方加一行注释
# 预期返回 JSON,含 status 字段且值为 'UP'; - 失败处理指令:
# 若返回码非200,记录错误日志并返回‘服务不可用’。
我在某跨平台系统项目中,就因漏写失败处理指令,导致 Agent 在测试环境 DNS 解析失败时,一直重试30次才超时,拖垮了整个 CI 流水线。后来我们强制要求:每个 ```bash 区块下方,必须有# 成功判定和# 失败处置两行注释。
3.4# 输入约束与# 输出约束:画清能力的安全边界
这是 SKILL.md 最容易被忽略、却最关键的模块。没有它,Agent 就像没装刹车的车。
输入约束要回答三个问题:
- 数据来源是否可信?(如“仅接受来自 test-data-bucket/sanity/ 目录下的 CSV 文件”)
- 参数范围是否有限制?(如“时间范围不得超过7天,否则返回‘请缩小查询窗口’”)
- 敏感操作是否需二次确认?(如“执行数据库清理前,必须收到用户明确回复‘确认执行’”)
输出约束则聚焦结果交付:
- 格式是否强制?(如“必须输出 Markdown 表格,列名为:用例ID | 状态 | 响应时间 | 错误信息”)
- 敏感信息是否脱敏?(如“手机号显示为 138****1234,身份证号全部替换为 *”)
- 长度是否受限?(如“摘要内容不超过200字,超长部分用‘……’截断”)
某公司曾发生过事故:Agent 根据 SKILL.md 自动生成缺陷报告,但未设置输出长度约束,某次日志爆炸导致生成12MB文本,直接撑爆邮件服务器。后来我们加入硬性规定:所有输出约束必须量化,禁止出现“尽量”、“一般”、“通常”等模糊表述。
3.5# 示例对话:不是摆设,是验证 Agent 是否“听懂人话”的黄金标尺
这部分必须用真实对话格式,且至少包含3个维度:
- 标准问法(用户按文档提示说)
- 口语变体(用户随口一说,Agent 仍能识别)
- 边界试探(用户故意说错,Agent 应优雅拒绝)
示例:
# 示例对话 用户:查下预发环境的登录接口健康状态 Agent:正在检查 http://pre-api.internal/health... 状态:UP 用户:登录接口还活着吗? Agent:正在检查 http://pre-api.internal/health... 状态:UP 用户:看看生产环境的订单接口 Agent:抱歉,当前技能仅支持预发环境,请切换环境后重试关键细节:
- 每段对话必须标注
用户:和Agent:,不可省略; - Agent 的回复必须与
# 输出约束完全一致(包括标点、换行、敏感词处理); - 边界案例必须真实存在,不能编造(如某次测试中,用户说“登录接口挂了没?”,Agent 回复“已检查,状态正常”,这就违反了“挂了没”属于负面假设,应先确认再回复)。
我们团队内部有个铁律:任何 SKILL.md 上线前,必须由三位不同背景的测试同学(资深/中级/新人)各自提3个变体问题,全部通过才算合格。
4. 实操全流程:从零开始写一份可落地的 SKILL.md(以“生成每日测试报告”为例)
4.1 第一步:锁定最小可行技能(MVP Skill)
别一上来就想做“全自动测试管家”。先问自己:今天最想让 Agent 替我做的、重复性最高、且结果明确的一件事是什么?在模拟项目X中,我们选中了“生成每日测试报告”。它的价值点很清晰:
- 每天固定时间执行,无脑重复;
- 数据源固定(MySQL test_report 表 + Jira API);
- 输出格式固定(Markdown 报告);
- 失败影响可控(顶多报告没生成,不影响测试执行)。
于是我们定义 MVP Skill 名称:# 生成指定日期的冒烟测试执行摘要报告
注意“指定日期”这个限定——它把“今天”、“昨天”、“2024-04-01”等所有时间表达,都收束到一个可解析的参数槽位,避免后续写一堆时间转换逻辑。
4.2 第二步:穷举触发条件,覆盖真实对话场景
我们收集了测试组过去一周的真实聊天记录,提炼出7种用户表达方式:
- “出个今天的冒烟报告”
- “昨天的冒烟结果汇总下”
- “我要4月1号的测试摘要”
- “看看冒烟过了没”(隐含“今天”)
- “冒烟报告,要带缺陷链接的”(隐含“摘要”)
- “生成冒烟测试日报”(术语变体)
- “summary for smoke test”(中英文混用)
转化为 SKILL.md 的触发条件:
- 用户消息含‘冒烟’且含‘报告’、‘汇总’、‘日报’、‘summary’任一词 - 用户消息含‘过了没’、‘结果’、‘怎么样’且上下文明确指向冒烟测试 - 用户消息中包含 ISO 日期格式(如 2024-04-01)或相对日期(如‘今天’、‘昨天’) → 提取日期参数,执行报告生成流程这里的关键是:把“用户语言”和“机器可解析规则”做了映射。比如“过了没”本身不是时间词,但结合“冒烟”这个领域词,就能触发时间槽位默认为“今天”。
4.3 第三步:编写可验证的执行命令链
这不是单条命令,而是一个微型工作流。我们拆成三步:
- 从数据库查当日冒烟结果;
- 从 Jira API 拉取关联缺陷;
- 合并生成 Markdown 报告。
对应 SKILL.md 的代码块:
# 步骤1:查数据库 mysql -h test-db.internal -u reader -p${DB_PASS} test_db -e "SELECT case_id, status, response_time FROM test_result WHERE date = '2024-04-01' AND type = 'smoke';" > /tmp/smoke_raw.csv # 步骤2:拉Jira缺陷(需提前配置JIRA_TOKEN) curl -H "Authorization: Bearer ${JIRA_TOKEN}" "https://jira.internal/rest/api/3/search?jql=project=TEST%20AND%20text~'2024-04-01'%20AND%20status=Open" > /tmp/jira_issues.json # 步骤3:生成报告(调用本地Python脚本,已预装) python3 /opt/agent/report_gen.py --date 2024-04-01 --input-csv /tmp/smoke_raw.csv --input-json /tmp/jira_issues.json --output-md /tmp/daily_report.md注意:所有路径、参数、环境变量都必须真实存在且可访问。我们要求新成员第一次写 SKILL.md 时,必须在本地终端逐行执行这些命令,确保每一步都成功,再写入文件。
4.4 第四步:定义硬性约束,守住底线
输入约束:
# 输入约束- 日期参数必须为有效日期,格式为 YYYY-MM-DD;
- 若用户未提供日期,默认为
date -d "yesterday" +%Y-%m-%d; - 单次请求最多生成1份报告,禁止批量。
输出约束:
# 输出约束- 报告必须以 Markdown 表格呈现,表头固定为:| 用例ID | 状态 | 响应时间(ms) | 缺陷链接 |;
- 缺陷链接必须是可点击的
[ISSUE-123](https://jira.internal/browse/ISSUE-123)格式; - 若无缺陷,对应单元格填
—,不可留空。
这些约束不是拍脑袋定的。比如“最多生成1份报告”,是因为某次误操作触发了循环调用,Agent 自己给自己发了100份报告,塞爆了测试邮箱。后来我们把它写进约束,成为硬性规则。
4.5 第五步:编写三维度示例对话,完成闭环验证
我们按标准问法、口语变体、边界试探各写一个:
# 示例对话 用户:出个今天的冒烟报告 Agent:正在生成2024-04-01冒烟测试报告... 已完成。报告摘要: | 用例ID | 状态 | 响应时间(ms) | 缺陷链接 | |--------|------|--------------|----------| | SMK-001 | PASS | 124 | [ISSUE-456](https://jira.internal/browse/ISSUE-456) | | SMK-002 | FAIL | — | — | 用户:冒烟过了没? Agent:正在检查2024-04-01冒烟测试结果... 共执行12个用例,11个PASS,1个FAIL。详情见报告。 用户:生成2024-13-01的报告 Agent:日期格式错误:2024-13-01 不是有效日期,请使用 YYYY-MM-DD 格式。写完后,我们用一个简易脚本模拟用户输入,将输出与示例严格比对。只有字符级完全一致,才算通过。
4.6 第六步:本地调试与灰度发布,让 SKILL.md 真正“活”起来
写完不等于能用。我们强制执行两步:
- 本地调试:用
agent-cli --skill ./SKILL.md --test命令,在本地启动一个轻量 Agent 实例,输入示例对话,观察输出是否符合预期; - 灰度发布:先在测试组小群(5人)启用,监控3天。重点看:
- 触发率(多少次用户提问真正激活了这个 SKILL);
- 准确率(激活后,Agent 执行是否符合预期);
- 逃逸率(用户提问未被识别,转人工处理的比例)。
某次灰度中,我们发现“冒烟过了没?”的触发率只有65%,排查发现是 NLU 模块对“过了没”这个短语的权重设置偏低。于是我们在触发条件里单独加了一条:- 用户消息以‘过了没’结尾 → 默认日期为今天,执行报告生成
第二天触发率升至98%。这种基于真实数据的微调,才是 SKILL.md 持续进化的核心。
5. 常见问题与避坑指南:那些没人告诉你的“血泪教训”
5.1 问题1:Agent 总是“听不懂”,但示例对话明明能过
现象:本地测试一切正常,一上线就大量误触发或不触发。
根因分析:90% 是环境差异导致的。我们统计过模拟项目X的23个故障案例,主要分三类:
- 时间时区不一致:本地调试用东八区,测试环境服务器用 UTC,导致
date -d "yesterday"解析出错; - 环境变量缺失:SKILL.md 里写了
${JIRA_TOKEN},但测试环境没配这个变量,Agent 静默失败; - 路径权限问题:
/tmp/目录在容器里是只读的,> /tmp/smoke_raw.csv直接报错,但 Agent 没捕获异常,返回空结果。
解决方案:
- 所有时间操作,强制指定时区:
date -d "yesterday" -u +%Y-%m-%d(UTC)或TZ=Asia/Shanghai date -d "yesterday" +%Y-%m-%d(东八区); - 所有环境变量,在 SKILL.md 顶部加
# 依赖环境变量区块,明确列出${JIRA_TOKEN}、${DB_PASS}等,并附配置指引链接; - 所有文件操作,加前置校验:
# 校验/tmp可写 if ! touch /tmp/test_write && echo "ERROR: /tmp is not writable"; exit 1; fi
实操心得:每次上线新 SKILL.md,我都会在测试环境手动执行一遍所有
# 执行命令,不是看结果,而是看有没有权限、路径、变量报错。这5分钟,能省去后面2小时排查。
5.2 问题2:Agent 执行成功了,但结果“不对劲”
现象:命令执行返回 0,但生成的报告里数据是错的,比如日期显示为“1970-01-01”。
根因分析:这是典型的“命令成功 ≠ 业务成功”。比如 MySQL 查询返回空结果集,shell 仍认为成功;Jira API 返回 200 但issues数组为空,脚本没做判空处理。
解决方案:在每条执行命令后,强制加业务校验:
# 查数据库后校验 mysql -h test-db.internal ... -e "SELECT COUNT(*) FROM test_result WHERE date = '2024-04-01'" | grep -q "0$" && echo "ERROR: 无当日测试数据" && exit 1 # 调API后校验 curl ... | jq '.total' | grep -q "0" && echo "ERROR: Jira未查到缺陷" && exit 1我们团队约定:任何 SKILL.md 的# 执行命令区块,最后一行必须是业务校验,且失败时exit 1。这是保证结果可信的底线。
5.3 问题3:多人协作时,SKILL.md 被反复覆盖,版本混乱
现象:A 同学改了触发条件,B 同学改了输出格式,C 同学删了示例对话,最终文件变成“四不像”。
根因分析:把 SKILL.md 当普通文档管理,没建立协作规范。
解决方案:推行“区块锁”机制:
- 每个
# 技能名称及其子区块(触发条件、执行命令等)视为一个独立单元; - 修改前,必须在该区块顶部加
<!-- LOCKED by @username on 2024-04-01 -->; - 合并 PR 时,CI 脚本自动检查:同一技能区块是否被多人标记 LOCKED,若是则阻断合并;
- 每周由专人(通常是测试组长)发起
SKILL.md健康度扫描,用脚本检查:- 是否所有
# 技能名称都有对应# 示例对话; - 是否所有
# 执行命令都有# 成功判定注释; - 是否存在未标记 LOCKED 的修改痕迹(即“幽灵修改”)。
- 是否所有
这套机制上线后,某公司测试团队的 SKILL.md 误改率从35%降至2%。
5.4 问题4:新同学总想“一步到位”,写超复杂 SKILL 导致失败率飙升
现象:新人写的# 全链路质量风险预测SKILL,包含数据采集、模型推理、报告生成、邮件推送4个环节,上线后失败率80%。
根因分析:违背了 SKILL 的原子性原则。一个环节失败,整个链路崩盘,且无法定位是哪一环。
解决方案:强制执行“三步拆解法”:
- 先写最核心的原子 SKILL(如
# 查询近7天接口错误率趋势); - 验证通过后,再写依赖它的组合 SKILL(如
# 生成接口稳定性周报,调用上一个 SKILL); - 最后写调度型 SKILL(如
# 每周一上午9点自动生成周报,只负责触发,不参与计算)。
我们有个硬性规定:任何新 SKILL.md 提交,PR 描述里必须写明“这是第几步”,并附上前序 SKILL 的链接。这倒逼大家从最小闭环做起。
5.5 问题5:SKILL.md 越写越多,维护成本爆炸
现象:半年后 SKILL.md 超过2000行,新人看不懂,老员工不敢改。
根因分析:缺乏分层治理。所有技能平铺在一个文件里,没有分类、没有优先级、没有归档机制。
解决方案:建立三层目录结构:
SKILL.md:主入口,只保留高频、稳定、核心的5个 SKILL(如# 查询接口状态、# 生成日报);skills/core/:存放经过3个月灰度验证、失败率<1% 的核心技能(如core_health_check.md);skills/experimental/:存放新技能原型,文件名带日期(如experimental_perf_analyze_20240401.md),30天无更新自动归档。
同时,主 SKILL.md 顶部加动态索引:
# 技能索引(自动生成,勿手动修改) - [接口健康检查](skills/core/core_health_check.md) - [冒烟测试日报](skills/core/core_smoke_report.md) - [缺陷趋势分析](skills/experimental/experimental_defect_trend_20240401.md)用 CI 脚本每天凌晨自动扫描skills/目录生成此索引。这样既保持主文件精简,又不丢失能力。
6. 进阶思考:SKILL.md 如何从“能用”走向“好用”?
6.1 加入“技能健康度”元数据,让能力自我进化
我们在每个# 技能名称下新增一个# 健康度区块:
# 健康度 - 触发成功率:98.2%(7天滚动) - 平均响应时间:1.2s - 最近失败时间:2024-03-28 14:22(原因:Jira API 限流) - 维护者:@test-lead这些数据由 Agent 引擎自动采集上报,每天更新。好处很明显:
- 新人一眼看出哪个技能最稳,优先使用;
- 维护者能及时发现衰减趋势(如成功率从99%掉到95%,说明该优化了);
- 管理者可基于健康度分配资源(低健康度技能,优先安排重构)。
某次我们发现# 生成性能报告的健康度连续3天下跌,排查发现是压测数据表新增了分区,原 SQL 未适配。加了PARTITION关键字后,成功率立刻回升。
6.2 用“技能谱系图”替代线性列表,看清能力关系网
传统 SKILL.md 是扁平列表,但实际技能间有强依赖。比如:
# 生成缺陷分布热力图依赖# 查询缺陷数据;# 预测回归测试范围依赖# 分析代码变更和# 获取历史失败用例。
我们用 Mermaid 语法(注:此处仅为说明,实际不渲染图表,用文字描述)构建谱系:
# 技能谱系 - 核心数据获取: ├─ # 查询缺陷数据 ├─ # 查询用例执行记录 └─ # 获取代码变更列表 - 分析类技能: ├─ # 生成缺陷分布热力图(依赖:查询缺陷数据) └─ # 预测回归测试范围(依赖:查询用例执行记录 + 获取代码变更列表)这样,当# 查询缺陷数据更新时,所有依赖它的技能都会收到通知,自动进入待验证队列。
6.3 将 SKILL.md 变成“可执行文档”,一键生成测试用例
这是最实用的进阶技巧。我们写了个 Python 脚本skill2test.py,输入 SKILL.md,自动输出:
- Postman Collection(用于接口测试);
- Robot Framework Test Case(用于自动化验收);
- 用户操作手册 PDF(给非技术人员看)。
例如,# 查询接口状态的触发条件和执行命令,会被转成:
*** Test Cases *** Verify API Health Status [Documentation] 验证预发环境接口健康状态 ${response}= Run Process curl -X GET "http://pre-api.internal/health" shell=True Should Contain ${response.stdout} "status": "UP"这意味着,每一份 SKILL.md,天然就是一份可运行的验收标准。测试同学不再需要“看文档写用例”,而是“运行脚本生成用例”。
6.4 个人体会:SKILL.md 的终极价值,是让测试人重新掌握“定义问题”的权力
我带过的所有模拟项目X,最终都发现一个规律:当 SKILL.md 写得越细致,测试同学在需求评审会上发言就越有底气。因为他们不再只是被动接收“请测试这个功能”,而是能主动说:“这个功能涉及3个新 SKILL,我需要提前确认数据源权限、接口返回格式、失败兜底策略——这些写在 SKILL.md 的第5、第7、第12条。”
SKILL.md 的本质,是把测试人的领域知识,从大脑里、聊天记录里、Excel 表格里,结构化地沉淀为可执行、可验证、可传承的数字资产。它不取代测试人的思考,而是把思考过程显性化、标准化、自动化。当你能用一份 Markdown 文件,让一个 AI Agent 精准复现你过去三个月的手工操作时,你就已经站在了测试效能革命的起点上。
最后分享一个小技巧:每周五下午,花15分钟,打开你的 SKILL.md,随机选一个技能,用手机语音输入它的触发条件(比如“查下预发环境的登录接口健康状态”),看 Agent 是否能正确响应。如果不行,立刻记入下周优化清单。这个习惯坚持半年,你会发现自己写的每一条触发条件,都越来越接近真实用户的说话方式——而这,正是人机协同最自然的状态。