---
name: hello-test
description: 编写测试、创建测试文件、实现测试覆盖、使用 Jest/Vitest/Mocha/pytest 等测试框架，或实践 TDD、修复失败测试时使用。
---

测试相关代码必须遵循以下规范。

## 编码前
先列出被测模块的公共接口、关键行为和边界条件，设计测试用例，再写测试代码。

## TDD 流程（强制）
新功能和 Bug 修复必须遵循红-绿-重构循环：
1. 红 — 写描述期望行为的测试，运行确认失败
2. 绿 — 写最少的代码让测试通过
3. 重构 — 清理代码，保持测试通过

如果测试写完就直接通过了，说明测试没有验证新行为——重新审视测试。
必须按垂直切片推进：一个行为 → 一个失败测试 → 最小实现 → 通过后再进入下一个行为。禁止先批量写完所有测试，再批量写实现。

豁免场景（标记 [-] 说明原因即可）：
- 纯 UI 样式调整（无逻辑变更）
- 配置文件修改
- 文档/注释变更
- 快速原型探索（用户明确要求）

除豁免场景外，没有先写测试 = 不能写实现代码。

## 覆盖策略
- 核心业务逻辑：单元测试必覆盖
- API 端点：集成测试覆盖主要路径（成功 + 主要失败场景）
- 关键用户流程：E2E 测试覆盖
- Bug 修复：先写失败测试，再修复（红-绿验证）

## 测试编写
- 测试通过公共接口验证外部可观察行为，不测试私有函数、内部调用顺序或实现形状
- 测试名描述行为：`should reject expired tokens`，不是 `test token`
- AAA 模式：Arrange（准备）→ Act（执行）→ Assert（断言）
- 每个测试独立，不依赖执行顺序
- Mock 外部依赖（数据库/API/文件系统），不 mock 被测代码本身；如果必须 mock 内部协作者，先评估接口是否过浅或测试切入点是否错误

## 边界用例（必须覆盖）
- 空值：null / undefined / 空字符串 / 空数组
- 边界值：0、-1、MAX_INT、超长字符串
- 错误路径：无效输入、网络超时、权限不足
- 并发：竞态条件（如果适用）

## 测试质量
- 避免脆弱测试：不依赖时间、随机数、外部服务
- 测试数据用 factory/fixture，不硬编码
- 断言具体值，不只断言"不为空"
- 一个测试验证一个行为
- 好测试应能承受内部重构；如果重命名内部函数就导致测试失败，说明测试耦合了实现

## 交付检查
- [ ] 测试覆盖公共接口和外部行为，不锁定实现细节
- [ ] 核心逻辑有单元测试
- [ ] 测试名描述行为
- [ ] 覆盖了主要边界用例
- [ ] 测试可独立运行
