Claude Skills Guide

How to Make Claude Code Test Before Implementing Feature

Getting Claude Code to write tests before implementing features transforms your development workflow. Test-driven development reduces bugs, improves code quality, and creates a safety net for future changes. This guide shows you practical techniques to ensure Claude Code prioritizes tests when building new functionality.

Why Test-First Matters with AI Assistants

When Claude Code implements a feature without tests, you receive working code that may hide edge cases and unexpected behavior. You then spend time manually verifying functionality or worse—deploying code that fails in production. Test-first development flips this pattern. Claude writes the test first, watches it fail, then implements code to make it pass. This approach catches issues at the generation stage rather than after deployment.

The challenge is that Claude Code responds to your prompts. If you do not explicitly request tests or set expectations, it may skip them entirely. Understanding how to guide Claude toward test-first behavior requires specific prompting strategies and skill configuration.

Technique 1: Use the tdd Skill Directly

The tdd skill is specifically designed for test-driven development workflows. When you load this skill, Claude gains structured patterns for writing tests before implementation code. Invoke the skill at the start of any feature work:

/tdd create tests for a user authentication module with login, logout, and password reset functionality

The skill responds by generating test cases covering the expected behavior. These tests fail initially because the implementation does not exist. You then ask Claude to implement the feature, and the tests guide the implementation.

The tdd skill works particularly well with unit testing frameworks like Jest, PyTest, and RSpec. When specifying your request, mention your testing framework explicitly:

/tdd write pytest tests for an API rate limiter with concurrent request handling

This specificity ensures the generated tests match your project’s testing conventions.

Technique 2: Configure System Prompts for Test Requirements

Modify your Claude Code configuration to always prioritize tests. Create a custom instruction file that Claude loads on startup. Add language that establishes test expectations globally:

When implementing any feature or function, first write comprehensive tests that cover:
- Happy path scenarios
- Edge cases and error conditions
- Boundary value inputs
- Expected exceptions

Only after tests exist, implement the feature to make tests pass.

Store this configuration in your project’s .claude directory or your global Claude settings. The exact location depends on your Claude Code version, but the effect remains consistent—Claude consistently generates tests before implementation code.

Technique 3: Prompt Structure for Test-First Responses

Your prompts significantly influence Claude’s behavior. Use explicit language that establishes test expectations at the start of every request:

Effective prompt structure:

“Write tests first for a function that processes CSV uploads and returns parsed data. Include tests for valid CSV, empty files, malformed data, and large files. Then implement the function to pass those tests.”

Less effective prompt:

“Write a function to parse CSV files”

The first prompt establishes a clear sequence—tests first, implementation second. Claude understands the expectation and generates test code before functional code.

Include specific test scenarios in your prompts. Rather than leaving test coverage to Claude’s discretion, enumerate the cases you want covered. This technique produces more thorough tests and reduces the need for iteration.

Technique 4: Use Skill Combinations

Combining skills produces better test coverage than using a single skill alone. The tdd skill handles test generation, while the code-review skill analyzes both tests and implementation for gaps.

A powerful workflow sequence:

  1. Start with the tdd skill to generate initial tests
  2. Use the code-review skill to identify missing test scenarios
  3. Have Claude add the identified tests
  4. Implement the feature
  5. Run the code-review skill again to verify test coverage

This combination ensures comprehensive test coverage that a single skill might miss. The code-review skill acts as a safety net, catching scenarios the tdd skill did not initially generate.

For projects involving specific domains, other skills complement testing workflows. The pdf skill helps if you need to generate test documentation. The supermemory skill recalls previous testing patterns from your project, maintaining consistency across features.

Technique 5: Establish Project Testing Conventions

Claude Code performs better when you provide clear testing conventions. Create a testing guide in your project repository that documents:

Reference this guide in your prompts:

Following our project testing conventions in TESTING.md, write tests first for a payment processing module

Claude reads the referenced file and generates tests that match your existing patterns. This consistency makes tests easier to maintain and understand.

Practical Example: Feature Implementation Workflow

Here is a complete workflow for getting Claude Code to test before implementing:

Step 1: Define the feature requirement

Feature: User notification preferences
Users can configure email, SMS, and push notification preferences.
Each preference is independently toggleable.

Step 2: Request tests first

/tdd write tests for user notification preferences:
- Enable/disable email notifications
- Enable/disable SMS notifications  
- Enable/disable push notifications
- Validate preference combinations
- Test persistence across sessions

Use our Jest testing framework with the conventions in TESTING.md

Step 3: Review generated tests Claude generates test files like notification-preferences.test.js. Review these tests for coverage and accuracy. Add any missing scenarios using follow-up prompts.

Step 4: Implement the feature Now that tests exist, request implementation:

Implement the notification preferences feature to make the tests pass.
Follow our existing service patterns in src/services/

Step 5: Verify and iterate Run the test suite. If tests fail, have Claude fix the implementation rather than the tests (unless the tests themselves are incorrect).

Prompting for Integration Tests

Integration tests require different prompting because they test how components work together rather than individual units:

Write integration tests for the user authentication flow:

1. Test successful login with valid credentials
2. Test failed login with wrong password (should return error message)
3. Test session persistence across page refreshes
4. Test logout clears session properly

Use the existing test infrastructure in tests/integration/.
Write these tests BEFORE implementing any new authentication code.
Focus on testing the public API endpoints, not internal implementation details.

Test Quality Patterns

Follow the AAA pattern (Arrange, Act, Assert) consistently:

def test_calculate_total_with_multiple_items():
    """Verify that calculate_total correctly sums multiple items."""
    # Arrange
    items = [
        {"price": 10.00, "quantity": 2},
        {"price": 5.50, "quantity": 3},
    ]

    # Act
    result = calculate_total(items)

    # Assert
    assert result == 36.50

For a tight feedback loop, keep npm test -- --watch (Jest) or pytest -v --tb=short (pytest) running in a separate terminal as Claude implements functionality.

Use supermemory to maintain consistent testing patterns across files. Store your testing philosophy for cross-session consistency:

Use supermemory to store our testing approach: we prioritize
business-critical paths with 100% coverage, utility functions
at 80% coverage, and UI components with snapshot testing.

After generating tests, ask Claude to review them with a meta-review prompt: “Review these tests for missing assertions, overly broad assertions, tests that could pass for wrong reasons, or missing coverage.”

CI/CD Coverage Gates

Automate test quality gates in your pipeline to prevent regressions:

- name: Run tests with coverage
  run: npm test -- --ci --coverage
- name: Check coverage thresholds
  run: npx jest-coverage-threshold

Common Prompt Failures and Fixes

Common Issues and Solutions

Issue: Claude writes implementation code before tests Solution: Add explicit language to your prompt: “Write all tests first. Do not write any implementation code until tests exist.”

Issue: Tests do not match project conventions Solution: Provide a reference test file in your prompt: “Match the style and patterns in tests/api/auth.test.js”

Issue: Missing edge case coverage Solution: Use the code-review skill after initial test generation to identify gaps, then prompt Claude to add those specific cases.

Summary

Getting Claude Code to test before implementing requires explicit prompting, appropriate skill selection, and consistent expectation-setting. The tdd skill provides the core test-first workflow, while the code-review skill adds a safety net for coverage verification. Configure your prompts to always specify test requirements, and your AI assistant becomes a reliable partner in test-driven development.

Built by theluckystrike — More at zovo.one