qt-unittest-make
Qt Unit Test Generator
Overview
Core principle: 使用 LSP 精确分析类结构,生成 100% 函数覆盖率的测试用例,并强制验证构建成功。
架构模式: Skill 路由 + 子 Agent 全栈执行。子 Agent 负责所有具体工作,Skill 仅负责调用和结果反馈。
关键特性: 智能 CMake 合并、增量更新支持、严格的构建验证、详细的错误处理。
Iron Laws
- 仅使用 Google Test: 测试框架固定为 GTest,不支持 Qt Test
- 100% 函数覆盖率: 每个 public/protected 函数必须至少一个测试用例
- 智能 CMake 合并: 根据项目实际情况优化合并,确保通用性
- 支持增量更新: 对比现有测试,补全未覆盖函数
- 必须验证构建: 生成后必须编译成功才能报告完成
- 编译失败必须修正: 每个错误最多重试 3 次,最大循环 10 次
When to Use
触发条件:
- 用户请求为模块生成单元测试:
为 src/lib/ui 模块创建单元测试 - 用户请求为类生成测试:
为 MyClass 生成测试 - 用户请求补全测试:
为 MyClass 补全测试
不使用此技能时:
- 用户请求生成测试框架(使用
qt-unittest-build) - 用户请求修复测试失败(使用
systematic-debugging) - 用户请求分析测试覆盖率(使用其他工具)
执行流程
步骤 1: 检查测试框架
验证 autotests/CMakeLists.txt 和 autotests/3rdparty/stub/ 存在。如不存在,提示用户先运行 qt-unittest-build。
步骤 2: 分析类结构
模块批量生成: glob 扫描目录所有 .h/.hpp,提取类名。
单个类: 直接分析指定类。
使用 LSP 工具:
lsp_document_symbols- 提取类结构lsp_goto_definition- 读取函数实现lsp_find_references- 查找依赖
步骤 3: 调用子 Agent(MUST DO)
重要: 必须调用子 Agent,不能跳过!
子 Agent 位置: agent/unittest-generator.md
调用方式:
使用 task 工具调用子 Agent:
task(
description="生成单元测试代码",
prompt="完整的任务说明,包括:
- 目标模块或类
- 测试框架要求(Google Test)
- 函数覆盖率要求(100%)
- 验证构建要求",
subagent_type="general"
)
为什么需要子 Agent:
- 独立上下文: 为单个类或小模块生成测试时,独立上下文避免污染
- 并行执行: 为多个类批量生成测试时,可以 fork 多个子 Agent 并行执行,提高效率
- 任务隔离: 子 Agent 失败不影响主 Agent,便于错误处理
调用时机:
- 模块批量生成: 为每个类调用一个子 Agent(并行)
- 单个类生成: 调用一个子 Agent
- 增量更新: 调用子 Agent 分析差异
步骤 4: 等待子 Agent 完成
监听子 Agent 的执行结果:
- 收集生成的测试文件
- 检查验证构建结果
- 记录遇到的错误(如果有)
步骤 5: 反馈用户
根据子 Agent 的结果反馈用户:
- 如果成功:报告生成的测试文件和覆盖率
- 如果失败:报告详细的错误信息和修正建议
Red Flags
- ❌ 使用 Qt Test 框架
- ❌ 覆盖率不足 100%
- ❌ 硬编码 CMake 模板
- ❌ 不验证构建
- ❌ 不支持增量更新
- ❌ 编译失败仍报告完成
- ❌ 跳过子 Agent 调用(直接手动工作)
Quick Reference
测试文件命名: test_myclass.cpp
测试类命名: MyClassTest
测试用例命名: {Feature}_{Scenario}_{ExpectedResult}
LSP 工具: lsp_document_symbols, lsp_goto_definition, lsp_find_references
Stub 模式: &Class::method, VADDR(Class, method), static_cast<...>
编译重试逻辑: 每个错误最多重试 3 次,最大循环 10 次
子 Agent 调用
必须使用 task 工具调用子 Agent:
task(
description="生成单元测试代码",
prompt="完整任务描述,包括目标、要求、验证流程",
subagent_type="general"
)
子 Agent 执行内容:
- 分析项目结构(LSP)
- 生成测试文件(100% 覆盖率)
- 智能合并 CMake
- 验证构建(每个错误重试 3 次,最大循环 10 次)
为什么需要子 Agent:
- 独立上下文,防止污染
- 并行执行,提高效率
- 任务隔离,便于错误处理
常见错误
| 错误 | 原因 | 修复 |
|---|---|---|
| 测试框架不存在 | 未运行 qt-unittest-build | 提示用户先运行框架构建技能 |
| 覆盖率不足 | 未分析所有函数 | 确保 lsp_document_symbols 提取完整 |
| CMake 合并失败 | 硬编码模板 | 使用 AI 智能合并,根据项目实际情况优化 |
| 编译失败 | Stub 签名错误 | 使用 LSP 获取精确签名 |
| 编译失败仍报告完成 | 跳过验证或验证不严谨 | 必须编译成功才能报告用户 |
| 多个错误未修正 | 全局重试 3 次不足 | 每个错误重试 3 次,最大循环 10 次 |
Rationalization Table
| Excuse | Reality |
|---|---|
| "直接手动工作更快" | 手动工作无法保证 100% 覆盖率和构建验证,子 Agent 是强制要求 |
| "跳过子 Agent 调用" | 违反技能的铁律,必须调用子 Agent |
| "编译失败也可以报告完成" | 违反强制构建验证要求,必须编译成功才能报告 |
| "全局重试 3 次就够了" | 每个错误重试 3 次,不是全局 3 次 |
| "覆盖率 80% 就可以了" | 铁律要求 100% 函数覆盖率,无例外 |
| "Qt Test 也一样" | 技能固定使用 Google Test,不支持 Qt Test |