第39章:Skills开发实战
学习目标
- 掌握Skill开发的完整流程:从需求到发布
- 学会编写SKILL.md定义文件
- 理解如何设计Tool、Prompt、Knowledge三要素
- 了解Skill的测试验证方法
前置要求
- 已完成第37-38章MCP和Skills体系的学习
- 有基本的Python开发能力
- 理解Prompt Engineering基础
实战案例:构建"测试报告生成器"Skill
案例背景
测试团队每天需要生成测试汇总报告,流程包括:拉取测试结果、分析数据、生成HTML报告、发送邮件通知。我们要把这些能力封装成一个Skill。
Step 1:创建Skill目录结构
Bash - 创建目录
# 创建Skill目录
mkdir -p test-report-skill/{tools,prompts,knowledge,workflows}
# 目录结构
test-report-skill/
├── SKILL.md # Skill定义文件
├── tools/
│ ├── query_results.py # 查询工具
│ ├── generate_html.py # 报告生成工具
│ └── send_email.py # 邮件发送工具
├── prompts/
│ ├── report_summary.md # 摘要生成Prompt
│ └ bug_analysis.md # 缺陷分析Prompt
├── knowledge/
│ ├── report_standards.md # 报告规范
│ ├── metrics_guide.md # 指标说明
└── workflows/
└── daily_report.yaml # 每日报告流程
Step 2:编写SKILL.md定义文件
Markdown - SKILL.md
---
name: test-report-generator
version: 1.0.0
description: 自动生成测试执行报告的技能包
author: 测试团队
category: testing
tools:
- query_results
- generate_html
- send_email
prompts:
- report_summary
- bug_analysis
knowledge:
- report_standards
- metrics_guide
triggers:
- "生成报告"
- "测试报告"
- "每日报告"
- "汇总报告"
---
# 测试报告生成器 Skill
## 功能说明
自动从测试平台拉取执行结果,生成格式化测试报告,并发送给指定人员。
## 适用场景
- 每日测试汇总报告
- 版本发布测试报告
- 专项测试分析报告
- 缺陷根因分析报告
## 使用方式
### 基础调用
```
生成今天的测试报告
```
### 指定参数
```
生成昨天web项目的测试报告,发送给team@company.com
```
### 参数说明
| 参数 | 说明 | 默认值 |
|------|------|--------|
| date | 报告日期 | 今天 |
| project | 项目过滤 | 全部项目 |
| format | 报告格式 | html |
| recipients | 收件人 | 配置默认收件人 |
## 输出内容
1. 测试执行概况(总数、通过率、耗时)
2. 缺陷分布分析(按模块、严重程度)
3. 高风险测试项标记
4. 改进建议
5. HTML格式完整报告文件
## 示例输出
```html
测试日报 - 2025-01-15
- 执行总数: 128
- 通过: 120 (93.75%)
- 失败: 5 (3.9%)
- 跳过: 3 (2.3%)
缺陷分析
...
```
Step 3:开发Tool工具
Python - tools/query_results.py
"""查询测试结果工具"""
from fastmcp import FastMCP
import json
from datetime import datetime, timedelta
mcp = FastMCP("测试报告工具集")
@mcp.tool()
def query_test_results(
date: str = None,
project: str = None,
status: str = "all"
) -> dict:
"""查询测试执行结果
Args:
date: 查询日期(YYYY-MM-DD格式,默认今天)
project: 项目名称过滤(可选)
status: 状态过滤(all/pass/fail/skip)
Returns:
测试结果汇总数据
"""
if date is None:
date = datetime.now().strftime("%Y-%m-%d")
# 模拟查询API(实际项目中替换为真实API调用)
results = {
"date": date,
"project": project or "全部项目",
"total": 128,
"passed": 120,
"failed": 5,
"skipped": 3,
"duration": "45.2 minutes",
"details": [
{"id": "TC-001", "name": "登录测试", "status": "pass", "duration": "2.5s"},
{"id": "TC-002", "name": "支付测试", "status": "fail", "duration": "5.1s"},
{"id": "TC-003", "name": "搜索测试", "status": "pass", "duration": "3.2s"},
]
}
# 状态过滤
if status != "all":
results["details"] = [
d for d in results["details"]
if d["status"] == status
]
return results
@mcp.tool()
def generate_html_report(results: dict) -> str:
"""生成HTML格式测试报告
Args:
results: 测试结果数据(来自query_test_results)
Returns:
HTML报告内容
"""
pass_rate = (results["passed"] / results["total"]) * 100
html = f"""
测试报告 - {results['date']}
测试执行报告
概况
日期 {results['date']}
项目 {results['project']}
执行总数 {results['total']}
通过率 {pass_rate:.1f}%
耗时 {results['duration']}
详细结果
ID 名称 状态 耗时
{"".join(f"{d['id']} {d['name']} {d['status']} {d['duration']} " for d in results['details'])}
"""
return html
@mcp.tool()
def send_report_email(
subject: str,
html_content: str,
recipients: str
) -> dict:
"""发送报告邮件
Args:
subject: 邮件主题
html_content: HTML邮件正文
recipients: 收件人(逗号分隔)
Returns:
发送结果
"""
# 模拟发送(实际项目中替换为真实邮件发送)
return {
"status": "sent",
"recipients": recipients,
"subject": subject,
"timestamp": datetime.now().isoformat()
}
if __name__ == "__main__":
mcp.run()
Step 4:编写Prompt模板
Markdown - prompts/report_summary.md
# 测试报告摘要生成Prompt
你是一位测试报告分析师。请根据以下测试结果数据,生成一份简洁的报告摘要。
## 输入数据
{test_results}
## 输出要求
请按照以下格式生成摘要:
### 1. 执行概况
- 用一句话总结今日测试执行情况
- 突出通过率和主要异常
### 2. 缺陷分析
- 分析失败测试的分布特征
- 标注高风险模块
### 3. 改进建议
- 给出2-3条具体改进建议
- 建议要可执行、有针对性
### 4. 明日关注点
- 列出需要重点关注的测试项
- 说明关注原因
## 示例输出
```
今日测试执行128项,通过率93.75%,支付模块出现3个失败用例需要重点关注。
缺陷分析:
- 支付模块失败率最高(60%)
- 主要原因:接口超时、数据同步失败
改进建议:
1. 增加支付接口的超时重试机制
2. 优化数据同步流程,添加断点续传
明日关注点:
- TC-002支付测试:需要验证修复效果
- TC-045订单测试:新增功能需加强验证
```
Step 5:编写Knowledge知识库
Markdown - knowledge/report_standards.md
# 测试报告规范文档
## 报告格式要求
### 1. 基本信息
- 报告标题:包含日期和项目名称
- 报告类型:日报/周报/专项报告
- 报告人:自动生成时可标注"AI生成"
### 2. 数据展示标准
- 通过率计算:(通过数/执行总数) × 100%
- 耗时格式:统一使用"X分钟"或"X小时Y分钟"
- 状态颜色:通过-绿色、失败-红色、跳过-灰色
### 3. 缺陷分类标准
| 严重程度 | 定义 | 处理优先级 |
|----------|------|------------|
| Critical | 核心功能完全失效 | P0 立即处理 |
| High | 主要功能受影响 | P1 当日处理 |
| Medium | 次要功能问题 | P2 3日内处理 |
| Low | 优化建议类 | P3 下版本处理 |
### 4. 报告发送规范
- 发送时间:日报每日18:00前,周报周五17:00前
- 收件人:项目组全员 + 测试经理
- 附件格式:HTML报告 + PDF存档
### 5. 存档要求
- 报告存档路径:/reports/{year}/{month}/{date}/
- 文件命名:report_{project}_{date}.html
- 保留期限:至少保留12个月
Step 6:定义Workflow工作流
YAML - workflows/daily_report.yaml
# 每日测试报告生成工作流
name: daily_test_report
description: 每日自动生成测试报告并发送
steps:
- name: query_results
tool: query_test_results
params:
date: "{{ today }}"
project: "{{ project | default('all') }}"
- name: analyze_data
prompt: report_summary
input:
test_results: "{{ query_results.output }}"
- name: generate_report
tool: generate_html_report
params:
results: "{{ query_results.output }}"
- name: send_email
tool: send_report_email
params:
subject: "测试日报 - {{ today }}"
html_content: "{{ generate_report.output }}"
recipients: "{{ recipients | default('team@test.com') }}"
on_failure:
- notify: "报告生成失败,请检查工具连接"
- fallback: "发送简化版文本报告"
Skill测试验证清单
| 测试项 | 验证方法 | 预期结果 |
|---|---|---|
| SKILL.md格式 | 检查YAML前置数据完整性 | name、version、description、tools字段齐全 |
| 工具调用 | 逐个调用Tools验证返回 | 返回格式正确,数据有效 |
| Prompt生成 | 使用Prompt生成内容 | 输出格式符合模板要求 |
| 知识库准确性 | 抽查关键知识点 | 内容正确、无过时信息 |
| Workflow执行 | 模拟完整工作流 | 各步骤顺序执行,失败有fallback |
| 端到端测试 | 实际生成一份报告 | 报告内容正确、邮件发送成功 |
Skill开发最佳实践
- 从真实需求出发:不要"为了写Skill写Skill",先确认有实际使用场景
- 单一职责:每个Skill专注一个任务,不要堆砌太多功能
- 清晰的触发词:triggers要覆盖常见表达,让AI容易匹配
- 完善的文档:SKILL.md说明清楚使用方式和参数
- 充分的测试:发布前必须完整测试所有工具和流程
- 版本管理:Skill变更时更新version,保持向后兼容
本章小结
- Skill开发流程:创建目录 → 编写SKILL.md → 开发Tools → 编写Prompts → 添加Knowledge → 定义Workflow
- SKILL.md是Skill的"身份证",定义名称、功能、触发词、包含能力
- Tools是Skill的"手",执行具体功能(查询数据、生成文件、发送通知)
- Prompts是Skill的"脑",指导AI如何分析和生成内容
- Knowledge是Skill的"知识储备",提供领域专业知识
- Workflow是Skill的"执行脚本",定义任务的自动化流程
- Skill发布前必须通过完整测试验证
扩展阅读
- 第40章:Agent智能体架构 - 多Skill协作的Agent设计
- 第42章:Harness框架 - Agent执行框架详解