上一章 目录 下一章

第39章:Skills开发实战

学习目标

  • 掌握Skill开发的完整流程:从需求到发布
  • 学会编写SKILL.md定义文件
  • 理解如何设计Tool、Prompt、Knowledge三要素
  • 了解Skill的测试验证方法

前置要求

  • 已完成第37-38章MCP和Skills体系的学习
  • 有基本的Python开发能力
  • 理解Prompt Engineering基础
Skill开发流程示意图
图39-1 Skill开发流程:以SKILL.md为核心,整合工具调用、提示词模板与领域知识,形成可复用的能力单元

实战案例:构建"测试报告生成器"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']}

详细结果

{"".join(f"" for d in results['details'])}
ID名称状态耗时
{d['id']}{d['name']}{d['status']}{d['duration']}
""" 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发布前必须通过完整测试验证

扩展阅读

上一章 目录 下一章