AI 功能测试用例生成器(AI Test Case Generator)
概述
本技能将涉及 AI/NLP 能力的功能需求——自然语言查询、大模型交互、意图识别、槽位抽取、语义解析——转化为结构化的 AI 功能测试用例。AI 功能测试与传统功能测试思路不同:以输入话术驱动而非操作步骤驱动,关注模型对话术的理解、容忍与拒答,而非界面操作流程。
所有测试用例严格遵循 5 列标准字段,默认交付为 Excel 文件(.xlsx),可直接用于测试执行、提测交付与用例归档;Markdown 表格仅作为回复内预览。
与传统功能测试的核心差异:
| 维度 | 传统功能测试 | AI 功能测试 |
|---|---|---|
| 驱动方式 | 前置条件 + 执行步骤 | 输入话术(一句话或多轮对话) |
| 预期结果 | 确定性输出(数据、状态、提示) | 理解正确性、结果相关性、澄清/拒绝行为、鲁棒性 |
| 覆盖重点 | 功能逻辑、字段校验、接口校验 | 语义理解、槽位抽取、意图识别、上下文记忆、安全防注入 |
| 结果判定 | 精确断言 | 语义层面的预期行为描述 |
快速开始
- 接收用户输入(需求文本、API 文档、文档链接或 UI 截图)。
- 识别 AI 能力边界:支持的意图类型、槽位/参数、数据范围、多轮交互能力、拒答范围。
- 加载
references/ai-testing-scenarios.md,按 12 类 AI 必测场景逐类设计测试用例。 - 按 5 列标准格式编写测试用例,覆盖全部适用场景。
- 默认生成 Excel 文件(.xlsx):在回复中先以 Markdown 表格预览,再按「Excel 生成」章节编写
testcases.json并运行内置生成器产出.xlsx,使用present_files交付。 - 自查完整性:12 类场景无遗漏、用例不重复、话术真实自然。
输入类型与处理方式
需求描述 / 需求文档
- 提取 AI 功能支持的意图、槽位(必填/选填)、默认值规则、澄清策略、拒答范围。
- 识别业务领域实体(如机构、活动、客户)与指标维度,用于构造话术。
- 明确结果约束:TopN 上限、排序规则、日期范围语义。
API 文档(AI 接口 / Agent 接口)
- 解析接口背后的意图集合、参数槽位、取值范围与响应结构。
- 依据槽位定义构造覆盖完整、缺失、冲突、非法的话术。
文档链接
- 抓取并解析链接文档内容,按需求文档同一流程处理。
UI 页面截图
- 识别 AI 对话入口、示例话术、引导提示,据此构造贴近真实使用的话术。
XMind 测试分析文档(.xmind)
用户提供 .xmind 文档时(可为 test-analysis-xmind 产出的「功能模块 > 分析类型 > 测试点」导图、AI 功能测试点手绘图、或对话/问答场景设计图),按以下流程转换为 5 列话术驱动用例:
- 解析导图:运行本技能自带解析器(纯标准库,无需安装 XMind):
bash python scripts/parse_xmind.py 输入.xmind # 打印 Markdown 大纲 python scripts/parse_xmind.py 输入.xmind -o out.md # 大纲写入文件
自动兼容 XMind Zen/2020+(content.json)与 XMind 8(content.xml),多 Sheet 依次输出。 - 读取大纲:识别功能模块(第 1 层)与叶子节点。叶子可能为:用户话术/提问原句、功能交互点描述、或测试点结论。将功能模块对应到独立 Excel Sheet。
- 转换为输入话术:叶子若非直接可用的口语话术,需改写为贴近真实用户的自然问句——将功能点描述反向生成用户提问(如测试点「仅支持查询本行活动」→ 话术「帮我看看 B002 分行的活动情况」);避免在话术中直接堆字段参数名。
- 归类 12 类场景:按 AI 能力边界与测试点语义归类到 12 类必测场景(正常精准查询/模糊匹配/同义话术/边界值/槽位缺失/槽位冲突/无效输入/鲁棒性/排序聚合/安全注入/无关问句拒绝/多轮上下文);上游「分析类型」仅作线索。同一功能点覆盖不适用场景时在回复中说明原因。
- 补全预期结果:预期按语义可判定——模型正确抽取槽位/返回对应数据、触发澄清反问、或安全拒答;区分正常/澄清/拒绝/防护逻辑。
- 生成 Excel:按「Excel 生成」章节编写
testcases.json(5 列,编号跨 sheet 连续)并运行生成器,使用present_files交付。
测试用例输出格式(5 列标准字段)
所有生成的测试用例严格包含以下 5 列,字段顺序固定,便于直接落库:
| 序号 | 字段名称 | 规则说明 |
|---|---|---|
| 1 | 测试用例编号 | 统一规则递增编写(TC-XXX),如 TC-001、TC-002、TC-003…… |
| 2 | 测试用例名称 | 简洁清晰,精准描述本条用例测试场景。推荐格式:[功能模块]-[场景描述],例如「智能查询-同义话术语序变换」 |
| 3 | 测试用例类型 | 取值见下文「测试用例类型定义」,须与 12 类必测场景对齐 |
| 4 | 输入话术 | 用户实际输入的自然语言查询。单轮场景填一句话;多轮场景按轮次标注,格式:第1轮:... 第2轮:...。话术须真实、自然、贴近业务用户口吻,不得写成字段参数 |
| 5 | 预期结果 | 从语义层面描述 AI 应有的行为:理解正确性、结果正确性/相关性、澄清追问、礼貌拒绝、安全防护、多轮上下文保持等;正常与异常逻辑均须明确 |
输出表格模板
| 测试用例编号 | 测试用例名称 | 测试用例类型 | 输入话术 | 预期结果 |
|-------------|-------------|-------------|---------|---------|
| TC-001 | ... | 正常精准查询 | ... | ... |
Excel 列对应关系(落库映射)
5 列 Markdown 表格 → Excel 列对应如下,列顺序不可调换:
| Excel 列 | 来源字段 | 列宽建议 |
|---|---|---|
| A | 测试用例编号 | 12 |
| B | 测试用例名称 | 36 |
| C | 测试用例类型 | 18 |
| D | 输入话术 | 55(须加宽,承载完整自然语言) |
| E | 预期结果 | 50 |
测试用例类型定义(与 12 类必测场景对齐)
- 正常精准查询:实体/条件精确匹配、槽位全覆盖、结果确定性。
- 模糊匹配:部分关键词、简称缩写、不完整实体名称。
- 同义话术语序变换:同一意图的不同表述、条件语序调换、口语化表达。
- 边界值:TopN 上限边界、日期范围边界、空结果集。
- 槽位缺失:省略必填/选填槽位,系统以澄清追问或默认规则处理。
- 槽位冲突/多实体歧义:条件相互冲突、实体引用歧义、多种合理解释。
- 错误/无效输入:不存在的实体、非法参数值、畸形查询。
- 鲁棒性:错别字、冗余措辞、多余空格、混合语言、拼音输入。
- 排序聚合 TopN:结果排序正确、聚合准确、TopN 限制生效。
- 安全注入越权:提示词注入、经自然语言发起的 SQL 注入、跨租户数据访问。
- 非业务意图拒绝:无关话题、闲聊、非查询意图的合理拒绝。
- 多轮上下文:追问问句引用前序结果、指代消解、话题切换。
AI 必测场景清单
设计用例前,必须加载 references/ai-testing-scenarios.md,该文件提供每类场景的目标、设计指导与测试要点。12 类场景概览:
- 正常精准查询场景
- 模糊匹配场景
- 同义话术、语序变换场景
- 边界值场景(TopN、日期边界)
- 槽位缺失、部分条件省略场景
- 槽位冲突、多实体歧义场景
- 错误/无效输入场景
- 脏数据、错别字、冗余话术鲁棒性场景
- 排序、聚合、Top-N 结果正确性场景
- 安全、注入、越权查询场景
- 非业务意图、无关问句拒绝场景
- 多轮上下文记忆场景
每类场景至少设计 1 条用例;被测功能明确不适用的场景(如无多轮交互能力)可省略,但须在输出简述中说明省略原因。
AI 能力边界识别清单
设计用例前,按以下清单识别被测 AI 能力边界,以便精准覆盖:
| 维度 | 识别内容 |
|---|---|
| 意图集合 | 支持的查询意图类型(实体查询、指标查询、对比、排名、聚合、闲聊拒答等) |
| 槽位/参数 | 必填槽位、可选槽位、槽位枚举值与默认值 |
| 实体库 | 业务实体范围(机构、客户、活动、产品)及其编码规则 |
| 指标体系 | 支持查询的指标(PV/UV/金额/比率等)及其口径定义 |
| 时间语义 | 支持的日期表达(绝对日期、相对日期、自然语言时间词) |
| 多轮交互 | 是否支持上下文记忆、指代消解、话题切换 |
| 拒答范围 | 明确拒绝的话题类型(违规、敏感、非业务) |
| TopN/排序 | 结果数量上限、默认排序规则 |
| 权限模型 | 用户角色与数据可见范围(分行隔离、跨租户拦截) |
输入话术自然度自检清单
每条用例的输入话术须通过以下自检:
- [ ] 口语化:像真实业务用户会说的话,而非参数化模板。
- [ ] 贴近业务:包含业务领域实体或业务动作(如「B001 北京分行」「投放活动」)。
- [ ] 无字段参数:不得写成「分行=B001, 日期=2026/09/01」这种表单形式。
- [ ] 多轮标注清晰:多轮场景按「第1轮:... 第2轮:...」严格标注。
- [ ] 变体合并:同类场景下的多个变体(多种错别字、多种同义表述)合并为一条,在话术中列举代表项,避免用例膨胀。
- [ ] 中英混排合规:金融场景允许少量英文缩写(PV、UV、TopN、B001),但避免大段英文。
设计原则
- 话术贴合真实用户:输入话术须自然、口语化、贴近业务用户真实提问方式;不得用参数化/模板化语句替代自然语言。
- 不得将 AI 查询等同于关键词匹配:用例须考察语义理解能力(同义、语序、指代、省略),而非仅字符串匹配。
- 用例不重复、不遗漏:每条用例针对唯一场景;12 类场景全覆盖且无冗余。
- 场景颗粒度中等:每条用例聚焦单一明确目标;同类场景下的多个变体(如多种错别字)合并为一条,在输入话术中列举或择代表性输入。
- 预期结果语义化且可判定:从语义层面描述预期行为,但须足够具体使测试人员可判定通过/失败;避免「回答正确」这类空泛描述。
- 可追溯性:每条用例可追溯至 AI 能力点或业务规则;必要时在用例名称中标注来源。
输出形式
默认交付:Excel 文件(.xlsx)
最终交付物为 Excel 文件,回复中同时给出 Markdown 表格预览。
Excel 规范:
| 项目 | 规范 |
|---|---|
| Sheet 名 | 功能或模块名称(中文,≤20 字),如「智能查询助手」「大模型问答」 |
| 表头行 | 5 列标准字段名(粗体、白字、深蓝底) |
| 数据行 | 按测试用例类型分组排列;编号递增连续 |
| 列宽 | A=12 / B=36 / C=18 / D=55 / E=50(输入话术列加宽以承载自然语言) |
| 冻结 | 冻结首行(表头) |
| 筛选 | 首行开启筛选 |
| 单元格 | 自动换行、垂直居顶;输入话术列允许多轮长文本 |
| 多轮话术 | 在输入话术单元格内使用换行分隔多轮,例:第1轮:...\n第2轮:... |
| 文件名 | [功能模块]AI测试用例.xlsx(中文模块名)或遵循用户指定 |
| 路径 | 写入当前 workspace 输出目录,便于 present_files 展示 |
Excel 生成(JSON 数据 + 内置生成器)
采用「数据与样式分离」:每次只需编写一份 testcases.json 数据文件,样式由内置生成器统一处理,任何机器输出完全一致;不依赖网络与本机专属路径,整个技能文件夹可拷到任意环境直接使用(仅需 Python + openpyxl)。
第 1 步:编写用例数据文件 testcases.json(UTF-8 编码)
{
"file_name": "功能模块名AI测试用例",
"sheets": [
{
"name": "功能模块名",
"headers": ["测试用例编号", "测试用例名称", "测试用例类型", "输入话术", "预期结果"],
"col_widths": [12, 36, 18, 55, 50],
"rows": [
["TC-001", "智能查询-正常精准查询", "正常精准查询",
"帮我查一下 B001 北京分行 2026 年 9 月 1 号的理财新客专享活动曝光量",
"AI 正确抽取分行=B001、日期=2026-09-01、活动=理财新客专享、指标=曝光量,返回对应的曝光 PV/UV 数据"]
]
}
]
}
字段说明:
- file_name:默认输出文件名(不含扩展名);也可在命令行第 2 个参数指定输出文件。
- sheets:支持多 Sheet(多轮/多场景套用例归档到同一文件)。
- headers / col_widths:与上文「Excel 列对应关系」一致(5 列,列序不可调换;输入话术列加宽 55)。
- rows:每条为一个数组,元素按 headers 顺序;多轮话术在单元格内用 \n 换行,例:第1轮:...\n第2轮:...。
第 2 步:保存生成器并运行
将下方「生成器源码」保存为工作目录下的 build_testcase_xlsx.py
(本技能自带 scripts/build_testcase_xlsx.py,与内嵌源码完全一致,任选其一使用):
python build_testcase_xlsx.py testcases.json # 输出到 testcases.json 同目录、同名 .xlsx
python build_testcase_xlsx.py testcases.json 指定名称.xlsx # 指定输出文件
第 3 步:环境自检(任意机器仅首次执行)
python --version # 若无 python 命令,尝试 python3 或 py -3
python -c "import openpyxl" # 若报 ModuleNotFoundError:
pip install openpyxl # Windows 可加 --user;建议在 python -m venv 隔离环境安装
生成器在缺少 openpyxl 时会输出同样中文提示后退出。表头深蓝底(1F4E78)白字、冻结首行、开启筛选、自动换行与行高估算均由生成器统一处理,勿手工修改样式。
生成器源码(build_testcase_xlsx.py)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""测试用例 Excel 生成器(通用版):python build_testcase_xlsx.py <用例数据.json> [输出.xlsx]
仅依赖 openpyxl(缺失: pip install openpyxl)。"""
import json
import math
import os
import sys
def display_width(text):
"""估算显示宽度:中文字符按 2 计,ASCII 按 1 计(用于行高估算)。"""
return sum(2 if ord(ch) > 127 else 1 for ch in text)
def main():
if len(sys.argv) < 2:
print("用法: python build_testcase_xlsx.py <用例数据.json> [输出文件.xlsx]")
sys.exit(1)
input_path = sys.argv[1]
if not os.path.isfile(input_path):
print(f"[错误] 找不到输入文件: {input_path}")
sys.exit(1)
with open(input_path, encoding="utf-8") as f:
spec = json.load(f)
default_name = spec.get("file_name") or os.path.splitext(os.path.basename(input_path))[0]
out_path = sys.argv[2] if len(sys.argv) > 2 else os.path.join(
os.path.dirname(os.path.abspath(input_path)), default_name + ".xlsx"
)
try:
from openpyxl import Workbook
from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
from openpyxl.utils import get_column_letter
except ImportError:
print("[错误] 缺少 openpyxl 库,请先执行: pip install openpyxl")
sys.exit(1)
header_font = Font(name="微软雅黑", size=11, bold=True, color="FFFFFF")
header_fill = PatternFill("solid", fgColor="1F4E78")
header_align = Alignment(horizontal="center", vertical="center", wrap_text=True)
data_font = Font(name="微软雅黑", size=10)
data_align = Alignment(wrap_text=True, vertical="top", horizontal="left")
thin = Side(style="thin", color="999999")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
wb = Workbook()
wb.remove(wb.active) # 删除默认空 Sheet
total_rows = 0
for sheet in spec.get("sheets", []):
headers = sheet["headers"]
widths = sheet.get("col_widths") or [16] * len(headers)
rows = sheet.get("rows", [])
if len(headers) != len(widths):
raise ValueError(f"Sheet[{sheet.get('name')}] headers 与 col_widths 长度不一致")
ws = wb.create_sheet(sheet.get("name", "Sheet1")[:31])
for col, (name, width) in enumerate(zip(headers, widths), start=1):
cell = ws.cell(row=1, column=col, value=str(name))
cell.font = header_font
cell.fill = header_fill
cell.alignment = header_align
cell.border = border
ws.column_dimensions[get_column_letter(col)].width = width
ws.row_dimensions[1].height = 24
for r, row in enumerate(rows, start=2):
if len(row) != len(headers):
raise ValueError(
f"Sheet[{sheet.get('name')}] 第 {r - 1} 条数据列数({len(row)})"
f"与表头({len(headers)})不一致"
)
max_lines = 1
for col, value in enumerate(row, start=1):
text = "" if value is None else str(value)
cell = ws.cell(row=r, column=col, value=text)
cell.font = data_font
cell.alignment = data_align
cell.border = border
usable = max(widths[col - 1] - 2, 4)
lines = sum(max(1, math.ceil(display_width(seg) / usable)) for seg in text.split("\n"))
max_lines = max(max_lines, lines)
ws.row_dimensions[r].height = max(18, min(16 * max_lines + 8, 320))
total_rows += len(rows)
ws.freeze_panes = "A2"
ws.auto_filter.ref = ws.dimensions
os.makedirs(os.path.dirname(os.path.abspath(out_path)), exist_ok=True)
wb.save(out_path)
print(f"已生成: {out_path}")
print(f"汇总: {len(spec.get('sheets', []))} 个 Sheet,共 {total_rows} 条用例")
if __name__ == "__main__":
main()
回复内预览
生成 Excel 的同时,在回复中以 Markdown 表格附上用例预览(用例数较多时可展示按类型分组的汇总 + 代表性用例),便于用户快速审阅。
完成前检查清单
输出前逐项核验:
- [ ] 12 类必测场景全部覆盖(不适用的已说明原因)。
- [ ] 无重复测试用例。
- [ ] 每条用例 5 列字段全部填写完整。
- [ ] 测试用例编号递增且连续(TC-XXX)。
- [ ] 输入话术通过「自然度自检清单」全部 6 项。
- [ ] 多轮上下文用例按轮次清晰标注。
- [ ] 预期结果语义化且可判定,区分正常/澄清/拒绝/安全防护逻辑。
- [ ] 已生成 Excel 文件(默认交付),列宽、冻结、筛选、文件名规范。
- [ ] 已用 present_files 展示 Excel 给用户。
环境要求
- Python 3.8+(Windows / macOS / Linux 均可),仅需标准库 + openpyxl。
- openpyxl 缺失时:
pip install openpyxl(生成器会自动检测并给出中文提示)。 - 无网络、无密钥、无本机专属路径依赖。
目录结构与分发
技能目录结构:
test-case-generator-ai/
├── SKILL.md # 技能主文件(含 Excel 生成器完整源码)
├── scripts/
│ ├── build_testcase_xlsx.py # Excel 生成器(JSON → xlsx,通用可复用)
│ └── parse_xmind.py # XMind 解析器(.xmind → Markdown 大纲/JSON,兼容 Zen 与 XMind8)
├── references/
│ └── ai-testing-scenarios.md # 12 类 AI 必测场景详细设计指导(设计用例前必读)
├── package.json # 技能元信息
└── README.md # 安装与使用说明
分发/安装到其他环境:将整个文件夹(或解压 test-case-generator-ai.zip 得到的文件夹)放入
<用户主目录>/.workbuddy/skills/(个人级)或 <项目>/.workbuddy/skills/(项目级),
重启 / 刷新 WorkBuddy 即可在对话中 @test-case-generator-ai 触发。所有依赖(Python + openpyxl)在目标机器首次使用时自动检测并提示安装。
参考资料
references/ai-testing-scenarios.md— AI 功能必测场景详细设计指导(含每类场景的目标、设计指导、测试要点)。当被测功能涉及 AI/NLP 能力时加载本文件。