Help us improve
Share bugs, ideas, or general feedback.
From claude-code-expert
Guides testing patterns, TDD workflows, multi-language test commands (JS/TS/Python/Go/Rust), and test-writer agent in Claude Code.
npx claudepluginhub markus41/claude --plugin claude-code-expertHow this skill is triggered — by the user, by Claude, or both
Slash command
/claude-code-expert:testing-workflowsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Complete guide to testing patterns, TDD, and test execution within Claude Code.
Writes TDD tests supporting Jest, Cypress, Detox, PHPUnit, PyTest, and Go testing. Adds unit, integration, E2E tests to improve coverage on existing code.
Share bugs, ideas, or general feedback.
Complete guide to testing patterns, TDD, and test execution within Claude Code.
# Common test commands
npm test
pnpm test
yarn test
bun test
pytest
go test ./...
cargo test
# Single test file
npm test -- path/to/test.ts
pytest path/to/test.py
# Pattern matching
npm test -- --grep "authentication"
pytest -k "test_auth"
# Watch mode
npm test -- --watch
pytest --watch
// auth.test.ts
describe('authenticateUser', () => {
it('should return user for valid credentials', async () => {
const result = await authenticateUser('valid@email.com', 'password123');
expect(result).toMatchObject({
id: expect.any(String),
email: 'valid@email.com',
});
});
it('should throw for invalid credentials', async () => {
await expect(
authenticateUser('bad@email.com', 'wrong')
).rejects.toThrow('Invalid credentials');
});
});
npm test -- auth.test.ts
# FAIL: authenticateUser is not defined
// auth.ts
export async function authenticateUser(email: string, password: string) {
const user = await db.user.findUnique({ where: { email } });
if (!user || !await bcrypt.compare(password, user.passwordHash)) {
throw new Error('Invalid credentials');
}
return { id: user.id, email: user.email };
}
npm test -- auth.test.ts
# PASS
Claude Code has a specialized test-writing agent:
Agent(
subagent_type="test-writer",
prompt="Write comprehensive tests for the authentication module in src/auth/",
description="Write auth tests"
)
The test-writer agent:
// Test individual functions in isolation
describe('calculateTotal', () => {
it('sums items correctly', () => {
expect(calculateTotal([10, 20, 30])).toBe(60);
});
it('handles empty array', () => {
expect(calculateTotal([])).toBe(0);
});
it('handles negative values', () => {
expect(calculateTotal([10, -5])).toBe(5);
});
});
// Test multiple components together
describe('POST /api/auth/login', () => {
it('returns JWT for valid login', async () => {
const res = await request(app)
.post('/api/auth/login')
.send({ email: 'test@test.com', password: 'pass123' });
expect(res.status).toBe(200);
expect(res.body.token).toBeDefined();
});
});
// Test full user flows
describe('User Registration Flow', () => {
it('allows user to register and login', async () => {
// Register
await page.goto('/register');
await page.fill('#email', 'new@user.com');
await page.fill('#password', 'secure123');
await page.click('button[type="submit"]');
// Verify redirect to dashboard
await expect(page).toHaveURL('/dashboard');
});
});
| Framework | Command | Config |
|---|---|---|
| Jest | npx jest | jest.config.js |
| Vitest | npx vitest | vitest.config.ts |
| Mocha | npx mocha | .mocharc.yml |
| Playwright | npx playwright test | playwright.config.ts |
| Cypress | npx cypress run | cypress.config.js |
| Framework | Command | Config |
|---|---|---|
| pytest | pytest | pytest.ini / pyproject.toml |
| unittest | python -m unittest | N/A |
| Language | Framework | Command |
|---|---|---|
| Go | testing | go test ./... |
| Rust | built-in | cargo test |
| Java | JUnit | mvn test / gradle test |
it('should return 404 for non-existent user') not it('test 1')# JavaScript/TypeScript
npx jest --coverage
npx vitest --coverage
npx c8 npm test
# Python
pytest --cov=src --cov-report=html
# Go
go test -coverprofile=coverage.out ./...
Claude's approach to test failures: