Test Generator
Version: 1.0.0 Purpose: Generate comprehensive tests with high coverage
Triggers
Trigger Examples
Test creation "write tests", "テスト作成", "add unit tests"
Coverage "improve coverage", "カバレッジ向上"
TDD "test first", "TDDで"
Testing Stack
Framework Purpose
Vitest Unit/Integration tests
Playwright E2E tests
Testing Library Component tests
Test Structure (AAA Pattern)
describe('functionName', () => { it('should [expected behavior] when [condition]', () => { // Arrange const input = createTestInput();
// Act
const result = functionName(input);
// Assert
expect(result).toBe(expectedValue);
}); });
Test Categories
- Happy Path
it('should return sum when given valid numbers', () => { expect(add(2, 3)).toBe(5); });
- Edge Cases
it('should handle empty array', () => { expect(sum([])).toBe(0); });
it('should handle single element', () => { expect(sum([5])).toBe(5); });
it('should handle negative numbers', () => { expect(sum([-1, 1])).toBe(0); });
- Error Cases
it('should throw on invalid input', () => { expect(() => divide(10, 0)).toThrow('Division by zero'); });
it('should throw on null input', () => { expect(() => process(null)).toThrow(TypeError); });
- Async Tests
it('should fetch user data', async () => { const user = await fetchUser(1); expect(user.name).toBe('John'); });
it('should handle API errors', async () => { await expect(fetchUser(-1)).rejects.toThrow('Not found'); });
Mocking
Mock Functions
import { vi } from 'vitest';
const mockFn = vi.fn(); mockFn.mockReturnValue(42); mockFn.mockResolvedValue({ data: 'test' });
Mock Modules
vi.mock('./database', () => ({ query: vi.fn().mockResolvedValue([{ id: 1 }]), }));
Spies
const spy = vi.spyOn(console, 'log'); doSomething(); expect(spy).toHaveBeenCalledWith('expected message');
Coverage Requirements
Metric Target
Statements 80%
Branches 80%
Functions 80%
Lines 80%
Run with coverage
npm test -- --coverage
Test File Naming
src/ ├── utils/ │ ├── helper.ts │ └── helper.test.ts # Co-located └── tests/ └── integration.test.ts # Integration tests
Template
import { describe, it, expect, beforeEach, vi } from 'vitest'; import { functionName } from './module';
describe('functionName', () => { beforeEach(() => { vi.clearAllMocks(); });
describe('when input is valid', () => { it('should return expected result', () => { // Arrange const input = { /* ... */ };
// Act
const result = functionName(input);
// Assert
expect(result).toEqual(expected);
});
});
describe('when input is invalid', () => { it('should throw error', () => { expect(() => functionName(null)).toThrow(); }); });
describe('edge cases', () => { it.each([ [[], 0], [[1], 1], [[1, 2], 3], ])('sum(%j) = %i', (input, expected) => { expect(sum(input)).toBe(expected); }); }); });
Checklist
-
All public functions have tests
-
Happy path covered
-
Edge cases covered
-
Error cases covered
-
Async behavior tested
-
Mocks properly cleaned up
-
Coverage meets threshold