# Qt Unittest Make

> Use when users request generating unit tests for Qt modules or classes, completing test cases, or creating test files. Supports module batch generation and incremental completion.

- Skill: `re2zero/qt-unittest-make` (Agent Skill, multi-file: 6 files)
- Install (CLI): `npx skillmds@latest add re2zero/qt-unittest-make`
- Raw SKILL.md: https://api.skillmd.com/api/skills/re2zero/qt-unittest-make/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: re2zero (https://skillmd.com/u/re2zero)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/re2zero/qt-unittest-make

---


# Qt Unit Test Generator

## Overview

**Core principle**: 使用 LSP 精确分析类结构，生成 100% 函数覆盖率的测试用例，并强制验证构建成功。

**架构模式**: Skill 路由 + 子 Agent 全栈执行。子 Agent 负责所有具体工作，Skill 仅负责调用和结果反馈。

**关键特性**: 智能 CMake 合并、增量更新支持、严格的构建验证、详细的错误处理。

## Iron Laws

1. **仅使用 Google Test**: 测试框架固定为 GTest，不支持 Qt Test
2. **100% 函数覆盖率**: 每个 public/protected 函数必须至少一个测试用例
3. **智能 CMake 合并**: 根据项目实际情况优化合并，确保通用性
4. **支持增量更新**: 对比现有测试，补全未覆盖函数
5. **必须验证构建**: 生成后必须编译成功才能报告完成
6. **编译失败必须修正**: 每个错误最多重试 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 |

