用途
Test Specialist 是一个测试编写模式技能,面向 JS/TS、Python、Go 和 Rust,用于指导单元测试、集成测试、E2E 测试与视觉回归测试的编写,并在用户明确要求测试时提供缺陷分析习惯。
何时使用
文档强调:仅当用户明确要求测试时才使用该技能。没有这一请求时,应通过审查改动(diff)及其涉及的代码来验证。
适用场景(在用户要求测试时):
- 编写单元测试、集成测试或 E2E 测试
- 提升测试覆盖率
- 安全测试与性能测试
不适用场景:
- 未要求测试的调试 → 使用
debug-systematic - 代码审查 → 使用
generic-code-reviewer - 技术债 → 使用
tech-debt-analyzer - 功能开发 → 使用
generic-feature-developer
按项目选测试栈
| 项目类型 | 单元测试 | 组件测试 | E2E |
|---|---|---|---|
| React/Next.js | Vitest/Jest | Testing Library | Playwright |
| Node.js | Vitest/Jest | Supertest | Playwright |
| Static | Jest | - | Playwright |
浏览器自动化(Playwright、Percy、Chromatic、npx 浏览器安装)不会在所有者 Mac 上安装或运行。仅当用户要求时,通过其已批准的环境运行。
主要能力与代码模式
文档给出的测试模式包括:AAA 模式单元测试、面向用户行为的组件测试、Playwright E2E 测试、集成测试。
单元测试(AAA 模式)
describe("calculateTotal", () => {
test("sums amounts correctly", () => {
// Arrange
const items = [{ amount: 100 }, { amount: 50 }];
// Act
const total = calculateTotal(items);
// Assert
expect(total).toBe(150);
});
test("handles empty list", () => {
expect(calculateTotal([])).toBe(0);
});
});
组件测试(用户行为)
// ✅ Test user behavior, not implementation
it('creates item when user clicks Add', async () => {
const user = userEvent.setup();
render(<ItemList />);
await user.click(screen.getByRole('button', { name: /add/i }));
await user.type(screen.getByLabelText(/title/i), 'New item');
await user.click(screen.getByRole('button', { name: /save/i }));
expect(screen.getByText('New item')).toBeInTheDocument();
});
E2E 测试(Playwright)
import { test, expect } from "@playwright/test";
test("user can complete checkout", async ({ page }) => {
await page.goto("/products");
// Add to cart
await page.click('button:has-text("Add to Cart")');
await page.click('a:has-text("Cart")');
// Checkout
await page.click('button:has-text("Checkout")');
await page.fill('[name="email"]', "test@example.com");
await page.click('button:has-text("Place Order")');
// Verify
await expect(page.locator("h1")).toContainText("Order Confirmed");
});
集成测试
test("POST /items creates item", async () => {
const response = await request(app)
.post("/api/items")
.send({ name: "Test" })
.expect(201);
expect(response.body).toMatchObject({ id: expect.any(Number) });
});
缺陷分析流程
- 复现 - 记录确切步骤、预期与实际结果
- 隔离 - 二分查找、最小复现
- 根因 - 追踪执行、检查假设、git blame
- 修复 - 修复根因(仅在用户要求测试时先写失败测试)
- 验证 - 对照复现与边界情况审查改动及其涉及代码路径
调试检查清单
- [ ] 能否稳定复现
- [ ] 已创建最小复现
- [ ] 已检查控制台/网络日志
- [ ] 已检查失败点的状态
- [ ] 已用 git blame 检查近期改动
- [ ] 已对照复现审查修复(仅在要求测试时写失败测试)
常见缺陷模式
- 竞态条件:并发更新测试
- 空值安全:对 null、undefined、空串、0 等无效输入的处理
- 边界值:空集合、单元素、最后一页不完整等
文档给出对应示例代码。
安全与性能测试
- 安全测试:SQL 注入防护、XSS 清理、鉴权要求
- 性能测试:大数据集处理耗时断言
以上均给出代码示例。
覆盖率目标
| 代码类型 | 目标 |
|---|---|
| 关键路径 | 90%+ |
| 业务逻辑 | 85%+ |
| UI 组件 | 75%+ |
| 工具函数 | 70%+ |
测试质量原则
- 每个测试只验证一个行为
- 名称具描述性 - 测试名说明场景
- 测试相互独立 - 无共享状态
- 覆盖边界情况 - 空值、空集合、边界、错误
- Mock 外部依赖 - 测试应当快速
- 测试行为 - 而非实现细节
工作流决策表
| 情况 | 操作 |
|---|---|
| 添加功能(要求测试) | 先写测试(TDD) |
| 修复缺陷(要求测试) | 先写失败测试,再修复 |
| 提升覆盖率 | 找缺口,优先关键路径 |
| 代码审查 | 检查边界情况、错误处理 |
Python 测试(pytest)
内容包括 fixture 与 parametrize、Mocking、conftest.py 模式,并给出代码示例:
- fixture:提供带测试数据库的 UserService、创建示例用户
- 测试类:创建用户、用户不存在时抛出异常、parametrize 校验邮箱
- Mocking:patch 邮件客户端、AsyncMock 异步 mock
- conftest.py:session 作用域 engine、function 作用域 db_session
Go 测试
- 表驱动测试:CalculateDiscount 的多用例结构
- testify:断言与 mock,含 MockUserRepo、require.NoError、assert.Equal、repo.AssertExpectations
- HTTP handler 测试:httptest.NewRequest / NewRecorder、解码响应体并断言
Rust 测试
- 单元测试(同文件
#[cfg(test)] mod tests)与集成测试(tests/integration_test.rs) - 示例:calculate_discount 的有效折扣、零折扣、非法百分比、负百分比
- 属性测试(proptest):折扣不超过原值、序列化往返一致
视觉回归测试
- Playwright 截图:
toHaveScreenshot、maxDiffPixelRatio、组件状态与移动端视口;更新快照命令为npx playwright test --update-snapshots - Percy:
@percy/playwright的percySnapshot,跨浏览器与视口尺寸比较 - Chromatic:
npx chromatic --project-token=<token>,捕获 Storybook 每个 story 的视觉快照并检测像素级变化
| 工具 | 方式 | 最适合 |
|---|---|---|
| Playwright | 本地截图对比 | E2E 视觉测试,免费 |
| Percy | 云端跨浏览器对比 | 多浏览器、团队评审 |
| Chromatic | Storybook story 快照 | 组件库视觉 QA |
限制与注意
- 仅在用户明确要求测试时使用;未要求测试的调试应改用
debug-systematic - 浏览器自动化不在所有者 Mac 上安装或运行,仅在用户要求时通过其已批准的环境运行
- 收费、价格、平台等未在资料中提供
另见
- 代码审查标准(../_shared/CODE_REVIEW_STANDARDS.md)
- 项目
CLAUDE.md- 测试规则