plugins/test-generator/skills/test-generation/SKILL.md
分析源代码并生成对应的单元测试用例。 当用户说"生成测试"、"写单元测试"、"添加测试用例"、"测试覆盖"、"单元测试"、"vitest测试"、"jest测试"、"pytest测试"、"测试代码"时使用此技能。 支持多种语言和框架:JavaScript/TypeScript (Jest, Vitest, Mocha)、Python (pytest, unittest)、Java (JUnit 5, TestNG)。 自动生成:正常流程测试、边界条件测试、异常情况测试、Mock 配置。输出遵循 AAA 模式的高质量测试代码。
npx skillsauth add protagonistss/ithinku-plugins test-generationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
这个技能负责分析源代码并生成对应的单元测试用例。支持多种编程语言和测试框架。
# 生成单个函数的测试
/test src/utils/calculator.js --function add --framework vitest
# 生成整个文件的测试
/test src/services/userService.js --framework jest --mocks
# 包含覆盖率分析
/test src/api/userController.js --framework jest --coverage
# 生成边界值测试
/test src/utils/validator.js --edge-cases
# 只生成异常测试
/test src/services/payment.js --error-only
import { describe, it, expect, beforeEach, vi } from 'vitest';
import { UserService } from '../src/services/UserService';
describe('UserService', () => {
let userService: UserService;
let mockDb: any;
beforeEach(() => {
mockDb = {
find: vi.fn(),
create: vi.fn(),
update: vi.fn(),
delete: vi.fn()
};
userService = new UserService(mockDb);
});
describe('getUserById', () => {
it('should return user when found', async () => {
// Arrange
const userId = '123';
const expectedUser = { id: userId, name: 'John' };
mockDb.find.mockResolvedValue(expectedUser);
// Act
const result = await userService.getUserById(userId);
// Assert
expect(result).toEqual(expectedUser);
expect(mockDb.find).toHaveBeenCalledWith({ id: userId });
});
it('should return null when user not found', async () => {
// Arrange
const userId = '999';
mockDb.find.mockResolvedValue(null);
// Act
const result = await userService.getUserById(userId);
// Assert
expect(result).toBeNull();
});
});
});
import pytest
from unittest.mock import Mock, patch
from services.user_service import UserService
class TestUserService:
@pytest.fixture
def user_service(self):
with patch('services.user_service.Database') as mock_db:
yield UserService(mock_db)
def test_get_user_by_id_success(self, user_service):
"""Test getting user with valid ID"""
# Arrange
user_id = 123
expected_user = {"id": user_id, "name": "John"}
user_service.db.find.return_value = expected_user
# Act
result = user_service.get_user_by_id(user_id)
# Assert
assert result == expected_user
user_service.db.find.assert_called_once_with({"id": user_id})
def test_get_user_by_id_not_found(self, user_service):
"""Test getting non-existent user"""
# Arrange
user_id = 999
user_service.db.find.return_value = None
# Act
result = user_service.get_user_by_id(user_id)
# Assert
assert result is None
// 根据类型生成测试数据
const testData = {
string: ["hello", "", "a".repeat(255), "特殊字符"],
number: [0, 1, -1, 100, Number.MAX_SAFE_INTEGER],
boolean: [true, false],
array: [[], [1], [1, 2, 3], Array(1000).fill(0)],
object: [{}, { key: "value" }, null, undefined]
};
// 边界值生成
const boundaries = {
string: ["", "a", "a".repeat(255), "a".repeat(256)],
number: [Number.MIN_VALUE, -1, 0, 1, Number.MAX_VALUE],
array: [[] , [1], [1000]],
};
// 自动生成的Mock
jest.mock('../src/utils/logger', () => ({
logger: {
info: jest.fn(),
error: jest.fn(),
warn: jest.fn()
}
}));
// 测试中验证Mock调用
expect(logger.info).toHaveBeenCalledWith('User created successfully');
// ✅ 好的命名
it('should create user with valid data');
it('should throw error when email already exists');
// ❌ 避免的命名
it('test1');
it('user creation test');
it('should calculate discount correctly', () => {
// Arrange - 准备测试数据
const price = 100;
const discountRate = 0.1;
// Act - 执行被测代码
const result = calculateDiscount(price, discountRate);
// Assert - 验证结果
expect(result).toBe(90);
});
// ✅ 具体的断言
expect(user.email).toMatch(/^[^\s@]+@[^\s@]+\.[^\s@]+$/);
// ❌ 模糊的断言
expect(user).toBeDefined();
// Promise
it('should resolve with data', async () => {
const result = await fetchData();
expect(result).toEqual(expectedData);
});
// Callback
it('should call callback', (done) => {
fetchData((data) => {
expect(data).toBeDefined();
done();
});
});
it('should throw error for invalid input', () => {
expect(() => validateEmail('invalid')).toThrow();
});
it('should reject promise on error', async () => {
await expect(asyncOperation()).rejects.toThrow('Error message');
});
// 使用假时间
beforeEach(() => {
vi.useFakeTimers();
});
afterEach(() => {
vi.useRealTimers();
});
it('should debounce function calls', async () => {
const debouncedFn = debounce(originalFn, 100);
debouncedFn();
vi.advanceTimersByTime(50);
expect(originalFn).not.toHaveBeenCalled();
vi.advanceTimersByTime(50);
expect(originalFn).toHaveBeenCalledTimes(1);
});
这个技能与其他命令集成:
/test - 生成测试用例/mock - 生成Mock数据/coverage - 分析测试覆盖率通过智能分析和模板化生成,帮助开发者快速编写高质量的单元测试。
development
Vue 3 开发最佳实践指南 - Composition API、Script Setup、Pinia、TypeScript 集成及性能优化。 当用户说"Vue 3组件"、"Composition API"、"script setup"、"Pinia"、"Vue 3项目"、"ref reactive"、"defineProps defineEmits"、"Composable"、"Vue 3优化"时使用此技能。 涵盖:Script Setup 与 Composition API、响应式数据选择(ref vs reactive)、组件通信(Props/Emits/v-model/Slots)、Composables 设计模式、Pinia Setup Store、性能优化(v-memo、shallowRef、KeepAlive)。 提供 TypeScript 代码示例、反模式对照表、迁移指南和示例文件引用。
development
Vue 2 维护与开发最佳实践指南 - Options API、Vuex 及向 Vue 3 迁移准备。 当用户说"Vue 2组件"、"Options API"、"Vuex"、"Vue 2项目"、"Vue 2迁移"、"Vue mixin"、"Vue 2最佳实践"时使用此技能。 涵盖:Options API 规范(选项顺序、props 验证)、Vuex 模块化(namespaced modules)、逻辑复用(避免 mixin,使用工具函数)、迁移准备(停止使用 Filters、引入 Composition API 插件)。 提供 Vue 2 代码示例、反模式警告和迁移建议。
development
核心设计能力 - 提供配色、布局、组件样式生成及反模式检查。 当用户说"设计UI"、"生成样式"、"页面布局"、"CSS样式"、"组件设计"、"配色方案"、"设计系统"、"前端样式"、"响应式设计"、"动画效果"时使用此技能。 支持多种设计风格:Neo-Brutalism、Glassmorphism、Editorial、Cyberpunk。 提供配色方案、布局生成、组件样式、微交互动效、响应式网格。拒绝"AI廉价感",追求大胆、独特、细节丰富的设计。 重要特性:提供反模式检查,避免泛滥的渐变、无聊的阴影、默认圆角等平庸设计。
content-media
无障碍设计审查与修复能力。 当用户说"无障碍"、"a11y"、"WCAG"、"键盘导航"、"屏幕阅读器"、"颜色对比度"、"ARIA"、"可访问性"、"辅助功能"、"盲人友好"时使用此技能。 基于 WCAG 2.1 标准,检测图片 Alt 文本缺失、表单 Label 关联、键盘可访问性、颜色对比度不足、ARIA 属性误用等问题。 提供修复代码示例:语义化标签、焦点管理、焦点陷阱、屏幕阅读器支持。输出合规性检查报告和修复建议。