Loading...
Loading...
Agent-based declarative testing with YAML test specs. Tests run in sub-agents to preserve main context while executing many tests. Supports MCP servers, APIs, and browser automation. Use when: testing MCP servers, running integration tests, validating tool behavior after changes, or creating regression test suites. Keywords: yaml tests, agent testing, mcp test, integration tests.
npx skill4agent add jezweb/claude-skills testing-patterns| Command | Purpose |
|---|---|
| Discover project, generate test specs + testing agent |
| Execute tests via agent(s), report results |
| Generate coverage report and identify uncovered code paths |
/create-tests → Generates tests/specs/*.yaml + .claude/agents/test-runner.md
/run-tests → Spawns agent, runs all tests, saves results
/run-tests api → Run only specs matching "api"
/run-tests --failed → Re-run only failed tests
/coverage → Run tests with coverage, analyse gaps
/coverage --threshold 80 → Fail if below 80%tests/.claude/agents/tests/results/You: "Create tests for this MCP server"
Claude: [Discovers this is a Google Calendar MCP]
[Sees tools: calendar_events, calendar_create, calendar_delete]
[Designs test cases:]
tests/calendar-events.yaml:
- list_upcoming_events (expect: array, count_gte 0)
- search_by_keyword (expect: contains search term)
- invalid_date_range (expect: error status)
tests/calendar-mutations.yaml:
- create_event (expect: success, returns event_id)
- delete_nonexistent (expect: error, contains "not found")name: Feature Tests
description: What these tests validate
# Optional: defaults applied to all tests
defaults:
tool: my_tool_name
timeout: 5000
tests:
- name: test_case_name
description: Human-readable purpose
tool: tool_name # Override default if needed
params:
action: search
query: "test input"
expect:
contains: "expected substring"
not_contains: "should not appear"
status: success| Rule | Description | Example |
|---|---|---|
| Response contains string | |
| Response doesn't contain | |
| Regex pattern match | |
| Check value at JSON path | |
| Exact value match | |
| Check success/error | |
| Array length >= N | |
| Array length == N | |
| Value type check | |
references/validation-rules.mdtools"*"tools---
name: my-tester
description: |
Tests [domain] functionality. Reads YAML test specs and validates responses.
Use when: testing after changes, running regression tests.
# tools field OMITTED - inherits ALL tools from parent (including MCP)
model: sonnet
---
# [Domain] Tester
## How It Works
1. Find test specs: `tests/*.yaml`
2. Parse and execute each test
3. Validate responses
4. Report pass/fail summary
## Test Spec Location
tests/
├── feature-a.yaml
├── feature-b.yaml
└── results/
└── YYYY-MM-DD-HHMMSS.md
## Execution
For each test:
1. Call tool with params
2. Capture response
3. Apply validation rules
4. Record PASS/FAIL
## Reporting
Save results to `tests/results/YYYY-MM-DD-HHMMSS.md`templates/test-agent.md# Test Results: feature-name
**Date**: 2026-02-02 14:30
**Commit**: abc1234
**Summary**: 8/9 passed (89%)
## Results
- test_basic_search - PASSED (0.3s)
- test_with_filter - PASSED (0.4s)
- test_edge_case - FAILED
## Failed Test Details
### test_edge_case
- **Expected**: Contains "expected value"
- **Actual**: Response was empty
- **Params**: `{ action: search, query: "" }`tests/results/YYYY-MM-DD-HHMMSS.md# tests/search.yaml
name: Search Tests
defaults:
tool: my_search_tool
tests:
- name: basic_search
params: { query: "hello" }
expect: { status: success, count_gte: 0 }
- name: filtered_search
params: { query: "hello", filter: "recent" }
expect: { contains: "results" }templates/test-agent.md"Run the search tests"
"Test the API after my changes"
"Run regression tests for gmail-mcp"tests/results/git add tests/results/
git commit -m "Test results: 8/9 passed""Run these test suites in parallel:
- Agent 1: tests/auth/*.yaml
- Agent 2: tests/search/*.yaml
- Agent 3: tests/api/*.yaml"# Configure MCP first
claude mcp add --transport http gmail https://gmail.mcp.example.com/mcp
# Then test
"Run tests for gmail MCP"name: Gmail Search Tests
defaults:
tool: gmail_messages
tests:
- name: search_from_person
params: { action: search, searchQuery: "from John" }
expect: { contains: "from:john" }
- name: search_with_date
params: { action: search, searchQuery: "emails from January 2026" }
expect: { matches: "after:2026" }name: API Tests
defaults:
timeout: 5000
tests:
- name: health_check
command: curl -s https://api.example.com/health
expect: { contains: "ok" }
- name: get_user
command: curl -s https://api.example.com/users/1
expect:
json_path: "$.name"
type: stringname: UI Tests
tests:
- name: login_page_loads
steps:
- navigate: https://app.example.com/login
- snapshot: true
expect: { contains: "Sign In" }
- name: form_submission
steps:
- navigate: https://app.example.com/form
- type: { ref: "#email", text: "test@example.com" }
- click: { ref: "button[type=submit]" }
expect: { contains: "Success" }search_with_date_filtertest1| Scenario | Use This | Use Traditional Testing |
|---|---|---|
| MCP server validation | Yes | No |
| API integration | Yes | Complement with unit tests |
| Browser workflows | Yes | Complement with component tests |
| Unit testing | No | Yes (Jest/Vitest) |
| Component testing | No | Yes (Testing Library) |
| Type checking | No | Yes (TypeScript) |
templates/test-spec.yamltemplates/test-agent.mdreferences/validation-rules.md