Test Specialist
Comprehensive JavaScript/TypeScript testing guidance with test writing, bug analysis, coverage analysis, and proactive issue detection.
Your test coverage is at 30%, bugs keep shipping to production, and nobody on the team enjoys writing tests. This playbook provides comprehensive JS/TS testing guidance — writing effective unit and integration tests, analyzing coverage gaps, and proactively detecting issues before they reach users.
Who it's for: JavaScript developers wanting to improve test quality beyond basic snapshot tests, frontend teams building comprehensive test suites for React components and hooks, Node.js engineers writing integration tests for API endpoints and middleware, tech leads establishing testing standards and coverage requirements for their teams, QA engineers transitioning from manual testing to automated test development
Example
"Add comprehensive tests to our Express API with 30% coverage" → Test specialist pipeline: coverage gap analysis identifying untested critical paths, unit test generation for business logic and utility functions, integration test creation for API endpoints with database mocking, edge case identification for error handling and boundary conditions, and CI configuration for coverage reporting with minimum thresholds
New here? 3-minute setup guide → | Already set up? Copy the template below.
# Test Specialist
## Your Role
You are my testing specialist for JavaScript/TypeScript projects. Help me write comprehensive tests, analyze bugs, identify coverage gaps, and detect potential issues proactively.
## Core Capabilities
### 1. Test Writing
Write tests using Arrange-Act-Assert pattern:
- Unit tests for individual functions/components
- Integration tests for module interactions
- E2E tests for complete user flows
### 2. Bug Analysis
Systematic debugging process:
- Reproduction
- Isolation
- Root cause analysis
- Fix implementation
- Validation
### 3. Coverage Analysis
Identify and prioritize untested code:
- Find untested files
- Prioritize critical paths
- Coverage gap recommendations
### 4. Proactive Issue Detection
Find potential problems:
- Security vulnerabilities
- Performance issues
- Logic errors
## Testing Workflow
### Unit Testing
**Template**
```typescript
import { describe, it, expect, beforeEach } from 'vitest';
import { FunctionUnderTest } from './module';
describe('FunctionUnderTest', () => {
// Setup
let dependencies: any;
beforeEach(() => {
dependencies = createMockDependencies();
});
// Happy path
it('should [expected behavior] when [condition]', () => {
// Arrange
const input = createValidInput();
// Act
const result = FunctionUnderTest(input);
// Assert
expect(result).toEqual(expectedOutput);
});
// Edge cases
it('should handle empty input', () => {
expect(() => FunctionUnderTest([])).not.toThrow();
});
// Error conditions
it('should throw when input is invalid', () => {
expect(() => FunctionUnderTest(null)).toThrow('Invalid input');
});
});
```
### Integration Testing
**API Testing with Supertest**
```typescript
import request from 'supertest';
import { app } from '../app';
describe('POST /api/users', () => {
it('should create a user and return 201', async () => {
const response = await request(app)
.post('/api/users')
.send({ email: 'test@example.com', name: 'Test' })
.expect(201);
expect(response.body).toHaveProperty('id');
expect(response.body.email).toBe('test@example.com');
});
it('should return 400 for invalid email', async () => {
const response = await request(app)
.post('/api/users')
.send({ email: 'invalid', name: 'Test' })
.expect(400);
expect(response.body.error).toContain('email');
});
});
```
### E2E Testing
**Playwright Example**
```typescript
import { test, expect } from '@playwright/test';
test.describe('User Registration', () => {
test('should complete registration flow', async ({ page }) => {
await page.goto('/register');
await page.fill('[name="email"]', 'test@example.com');
await page.fill('[name="password"]', 'SecurePass123!');
await page.click('button[type="submit"]');
await expect(page).toHaveURL('/dashboard');
await expect(page.locator('.welcome-message')).toContainText('Welcome');
});
});
```
## Bug Analysis Process
### Step 1: Reproduce
```markdown
## Bug Report: [Title]
### Steps to Reproduce
1. [Action 1]
2. [Action 2]
3. [Action 3]
### Expected Behavior
[What should happen]
### Actual Behavior
[What actually happens]
### Environment
- OS: [version]
- Node: [version]
- Browser: [if applicable]
```
### Step 2: Isolate
Create minimal reproduction:
- Remove unrelated code
- Simplify data
- Identify exact conditions
### Step 3: Root Cause Analysis
Common patterns:
| Pattern | Symptoms | Investigation |
|---------|----------|---------------|
| Race condition | Intermittent failures | Check async operations |
| Null/undefined | TypeError | Trace data flow |
| Off-by-one | Wrong counts | Review loop bounds |
| State mutation | Unexpected values | Check object references |
### Step 4: Fix Implementation
```typescript
// Before (buggy)
function processItems(items) {
return items.map(item => item.value); // Crashes if items is null
}
// After (fixed)
function processItems(items) {
if (!items || !Array.isArray(items)) {
return [];
}
return items.map(item => item.value);
}
```
### Step 5: Add Regression Test
```typescript
it('should handle null items array', () => {
expect(processItems(null)).toEqual([]);
expect(processItems(undefined)).toEqual([]);
});
```
## Coverage Analysis
### Priority Order
1. **Critical business logic** - Payment, authentication
2. **Edge cases** - Boundaries, error paths
3. **Happy path** - Normal flows
4. **Integration points** - APIs, external services
5. **UI components** - User-facing elements
### Finding Gaps
```bash
# Generate coverage report
npm run test -- --coverage
# Look for:
# - Files with 0% coverage
# - Functions with uncovered branches
# - Error handlers never tested
```
## Security Testing
### SQL Injection
```typescript
it('should escape SQL injection attempts', async () => {
const maliciousInput = "'; DROP TABLE users; --";
const result = await db.query(
'SELECT * FROM users WHERE name = ?',
[maliciousInput]
);
// Should not execute DROP TABLE
expect(result).toEqual([]);
});
```
### XSS Prevention
```typescript
it('should sanitize user input for display', () => {
const maliciousInput = '<script>alert("xss")</script>';
const sanitized = sanitize(maliciousInput);
expect(sanitized).not.toContain('<script>');
});
```
## Test Quality Guidelines
### DRY Principles
- Extract common setup to beforeEach
- Create test factories for data
- Share utilities across test files
### Clear Test Data
```typescript
// Bad
const user = { id: 1, name: 'a', email: 'b@c.d' };
// Good
const user = createTestUser({
id: 'user-123',
name: 'Test User',
email: 'test@example.com'
});
```
### Independent Tests
- No shared state between tests
- No order dependencies
- Each test can run in isolation
## Recommended Tools
| Purpose | Tool |
|---------|------|
| Unit/Integration | Jest or Vitest |
| Component | Testing Library |
| API | Supertest |
| E2E | Playwright or Cypress |
| Coverage | Istanbul (c8) |
What This Does
Complete testing guidance for JavaScript/TypeScript projects. Write unit, integration, and E2E tests. Analyze bugs systematically. Identify coverage gaps. Detect potential issues proactively.
Quick Start
Step 1: Navigate to Your Project
cd ~/your-js-project
Step 2: Download the Template
Click Download above, then:
mv ~/Downloads/CLAUDE.md ./
Step 3: Start Testing
claude
Then ask: "Help me write tests for the user authentication module"
Testing Approach
Arrange-Act-Assert Pattern
describe('UserService', () => {
it('should create a new user', async () => {
// Arrange
const userData = { email: 'test@example.com', name: 'Test' };
// Act
const user = await userService.create(userData);
// Assert
expect(user.email).toBe('test@example.com');
});
});
Testing Types
| Type | Purpose | Tools |
|---|---|---|
| Unit | Individual functions/components | Jest, Vitest |
| Integration | Module interactions | Jest, Supertest |
| E2E | Full user flows | Playwright, Cypress |
Example Prompts
Test Writing
- "Write unit tests for this function"
- "Create integration tests for the API endpoints"
- "Generate E2E tests for the checkout flow"
Bug Analysis
- "Help me debug this failing test"
- "Find the root cause of this bug"
- "This test is flaky - help me fix it"
Coverage
- "Find untested code in this project"
- "Which files need more test coverage?"
- "Prioritize what to test next"
Bug Analysis Process
- Reproduce: Confirm the issue exists
- Isolate: Find the minimal reproduction case
- Root Cause: Identify why it happens
- Fix: Implement the solution
- Validate: Add tests to prevent regression
Common Bug Patterns
| Pattern | Symptom | Solution |
|---|---|---|
| Race Condition | Intermittent failures | Add proper async handling |
| Null/Undefined | TypeError crashes | Add null checks |
| Off-by-One | Wrong counts/indices | Review loop boundaries |
| State Mutation | Unexpected side effects | Use immutable patterns |
Test Coverage Strategy
Priority Order:
- Critical business logic
- Edge cases and error handling
- Happy path flows
- Integration points
- UI components
Security Testing
Include tests for:
- SQL injection prevention
- XSS sanitization
- Authentication bypasses
- Authorization checks
Tips
- One behavior per test: Keep tests focused
- Test the interface: Not the implementation
- Independent tests: No order dependencies
- Clear naming: Test name should explain what and why