返回顶部
t

test-specialist测试专家

This skill should be used when writing test cases, fixing bugs, analyzing code for potential issues, or improving test coverage for JavaScript/TypeScript applications. Use this for unit tests, integration tests, end-to-end tests, debugging runtime errors, logic bugs, performance issues, security vulnerabilities, and systematic code analysis.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 0.1.0
安全检测
已通过
2,427
下载量
免费
免费
3
收藏
概述
安装方式
版本历史

test-specialist

测试专家

概述

将系统化测试方法和调试技术应用于 JavaScript/TypeScript 应用程序。该技能提供全面的测试策略、错误分析框架以及用于识别覆盖缺口和未测试代码的自动化工具。

核心能力

1. 编写测试用例

编写涵盖单元测试、集成测试和端到端场景的全面测试。

单元测试方法

使用 AAA 模式(Arrange-Act-Assert,即 准备-执行-断言)组织测试:

typescript
describe(ExpenseCalculator, () => {
describe(calculateTotal, () => {
test(正确计算费用总和, () => {
// 准备
const expenses = [
{ amount: 100, category: food },
{ amount: 50, category: transport },
{ amount: 25, category: entertainment }
];

// 执行
const total = calculateTotal(expenses);

// 断言
expect(total).toBe(175);
});

test(处理空费用列表, () => {
expect(calculateTotal([])).toBe(0);
});

test(处理负数金额, () => {
const expenses = [
{ amount: 100, category: food },
{ amount: -50, category: refund }
];
expect(calculateTotal(expenses)).toBe(50);
});
});
});

关键原则:

  • - 每个测试只测试一个行为
  • 覆盖快乐路径、边界情况和错误条件
  • 使用描述性测试名称解释场景
  • 保持测试独立且隔离

集成测试方法

测试组件如何协同工作,包括数据库、API 和服务交互:

typescript
describe(ExpenseAPI 集成测试, () => {
beforeAll(async () => {
await database.connect(TESTDBURL);
});

afterAll(async () => {
await database.disconnect();
});

beforeEach(async () => {
await database.clear();
await seedTestData();
});

test(POST /expenses 创建费用并更新总额, async () => {
const response = await request(app)
.post(/api/expenses)
.send({
amount: 50,
category: food,
description: 午餐
})
.expect(201);

expect(response.body).toMatchObject({
id: expect.any(Number),
amount: 50,
category: food
});

// 验证数据库状态
const total = await getTotalExpenses();
expect(total).toBe(50);
});
});

端到端测试方法

使用 Playwright 或 Cypress 等工具测试完整的用户工作流:

typescript
test(用户可以从头到尾跟踪费用, async ({ page }) => {
// 导航到应用
await page.goto(/);

// 添加新费用
await page.click([data-testid=add-expense-btn]);
await page.fill([data-testid=amount], 50.00);
await page.selectOption([data-testid=category], food);
await page.fill([data-testid=description], 午餐);
await page.click([data-testid=submit]);

// 验证费用出现在列表中
await expect(page.locator([data-testid=expense-item])).toContainText(午餐);
await expect(page.locator([data-testid=total])).toContainText($50.00);
});

2. 系统化错误分析

应用结构化的调试方法来识别和修复问题。

五步分析流程

  1. 1. 复现:可靠地复现错误
- 记录触发错误的确切步骤 - 识别所需的环境/状态 - 记录预期行为与实际行为
  1. 2. 隔离:缩小问题范围
- 通过代码路径进行二分查找 - 创建最小复现案例 - 移除不相关的依赖
  1. 3. 根因分析:确定根本原因
- 追踪执行流程 - 检查假设和前置条件 - 审查最近的更改(git blame)
  1. 4. 修复实施:实现解决方案
- 先编写失败的测试(TDD) - 实施修复 - 验证测试通过
  1. 5. 验证:确保完整性
- 运行完整测试套件 - 测试边界情况 - 验证无回归

常见错误模式

竞态条件:
typescript
// 测试并发操作
test(正确处理并发更新, async () => {
const promises = Array.from({ length: 100 }, () =>
incrementExpenseCount()
);

await Promise.all(promises);
expect(getExpenseCount()).toBe(100);
});

空值/未定义错误:
typescript
// 测试空值安全性
test.each([null, undefined, , 0, false])
(处理无效输入: %p, (input) => {
expect(() => processExpense(input)).toThrow(无效的费用);
});

差一错误:
typescript
// 显式测试边界
describe(分页, () => {
test(处理空列表, () => {
expect(paginate([], 1, 10)).toEqual([]);
});

test(处理单个项目, () => {
expect(paginate([item], 1, 10)).toEqual([item]);
});

test(处理包含部分项目的最后一页, () => {
const items = Array.from({ length: 25 }, (_, i) => i);
expect(paginate(items, 3, 10)).toHaveLength(5);
});
});

3. 识别潜在问题

在问题变成错误之前主动识别。

安全漏洞

测试常见安全问题:

typescript
describe(安全性, () => {
test(防止 SQL 注入, async () => {
const malicious = ; DROP TABLE expenses; --;
await expect(
searchExpenses(malicious)
).resolves.not.toThrow();
});

test(清理描述中的 XSS, () => {
const xss = ;
const expense = createExpense({ description: xss });
expect(expense.description).not.toContain(

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large