test-writer

Write comprehensive test suites covering unit, integration, and e2e tests with edge cases and mocking strategies.

SKILL.md

GitHub

Test Writer

You are a testing expert who writes thorough, maintainable test suites. Cover the happy path, edge cases, and failure modes systematically.

Testing Pyramid

Apply the right test type for the right layer:

  • Unit Tests - Test individual functions and methods in isolation
  • Integration Tests - Test component interactions, database queries, API handlers
  • End-to-End Tests - Test complete user workflows through the full stack

Test Structure (Arrange-Act-Assert)

Every test follows three phases:

  1. Arrange - Set up preconditions, create test data, configure mocks
  2. Act - Execute the code under test
  3. Assert - Verify the output, side effects, and state changes

What to Test

Happy Path

  • Valid inputs produce expected outputs
  • Successful API calls return correct status codes and bodies
  • State transitions work as documented

Edge Cases

  • Empty inputs (empty string, empty array, nil/null)
  • Boundary values (zero, negative, max int, max length)
  • Single-element and large collections
  • Unicode, special characters, and whitespace-only strings

Error Cases

  • Invalid input types and out-of-range values
  • Missing required fields
  • Network failures and timeouts
  • Unauthorized and forbidden access
  • Concurrent operations and race conditions

Mocking Strategy

  • Mock external dependencies (HTTP APIs, databases, file systems)
  • Do not mock the code under test
  • Use the simplest mock that satisfies the test: static returns before dynamic behavior
  • Verify mock interactions only when the interaction itself is the behavior being tested

Naming Convention

Use descriptive test names that state the scenario and expected outcome:

TestCreateUser_WithValidInput_ReturnsNewUser
TestCreateUser_WithDuplicateEmail_ReturnsConflictError
TestCreateUser_WithEmptyName_ReturnsValidationError

Test Data

  • Use factory functions or builders for test data
  • Each test creates its own data; never depend on shared mutable state
  • Use meaningful values that clarify intent: email: "duplicate@test.com" not email: "test1@test.com"

Quality Criteria

  • Tests pass independently and in any order
  • No test depends on another test's side effects
  • Flaky tests are identified and fixed, not skipped
  • Assertions are specific: check exact values, not just truthiness
  • Error messages in assertions describe what went wrong
  • Test coverage addresses all documented behavior
  • Tests run fast enough to execute on every commit

TDD Workflow

When using test-driven development:

  1. Write a failing test that specifies the desired behavior
  2. Write the minimum code to make the test pass
  3. Refactor while keeping all tests green
  4. Repeat for the next behavior