test-hardening
Converts verified QA criteria into permanent automated regression tests.
Install
mkdir -p .claude/skills/test-hardening && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/5023" && unzip -o skill.zip -d .claude/skills/test-hardening && rm skill.zipInstalls to .claude/skills/test-hardening
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Convert passed QA Contract criteria to automated testsKey capabilities
- →Maps Gherkin scenarios to Jest test stubs
- →Generates Playwright specs from acceptance criteria
- →Creates Storybook stories for UI state verification
- →Injects G#N/AC#N references into test file comments
- →Executes grep commands to prevent duplicate test generation
How it works
Parses verified criteria from logs and scaffolds test boilerplate using project-specific templates and regex-based de-duplication.
Inputs & outputs
When to use test-hardening
- →Generating regression tests after passing qa-commit
- →Converting accepted requirements into automated tests
- →Adding coverage for verified bugs
- →Syncing test suites with finalized acceptance criteria
About this skill
Test Hardening Skill
Convert verified QA Contract criteria (G#N, AC#N) into permanent automated tests. Ensures passing scenarios become regression tests.
When to Use
- After qa-commit returns GREEN for a commit
- After debug skill fixes an issue (Phase 7: Harden)
- Before pushing PR (ensure all criteria have tests)
- Manually with "use test-hardening skill"
Input: Verification Report
From qa-commit's Verification Report:
- List of passed G#N (Gherkin scenarios)
- List of passed AC#N (acceptance criteria)
Phase 1: Analyze Criteria
1.1 Categorize by Test Type
| Criteria Type | Test Framework | Location |
|---|---|---|
| G#N (Backend) | Jest | apps/api/**/*.test.ts |
| AC#N (UI State) | Storybook | **/*.stories.tsx |
| AC#N (Interaction) | Playwright | tests/e2e/**/*.spec.ts |
1.2 Check Existing Tests
Grep: "G#[N]" or "[scenario name]" in test files
Skip if test already exists.
Phase 2: Generate Backend Tests (G#N)
For each passed G#N without existing test:
2.1 Template
// apps/api/src/[feature]/__tests__/[feature].test.ts
describe('[Feature Name]', () => {
// G#1: [Scenario name]
it('should [expected behavior]', async () => {
// Arrange
const input = { /* test data */ };
// Act
const response = await request(app)
.[method]('[endpoint]')
.send(input);
// Assert
expect(response.status).toBe([status]);
expect(response.body).toMatchObject({ /* expected */ });
});
// G#2: [Scenario name]
it('should return [error] when [condition]', async () => {
// Test implementation
});
});
2.2 Generate Test
- Extract endpoint, method, expected response from G#N
- Create test file if not exists
- Add test case with G#N reference in comment
- Run test to verify it passes
npm run test -- --grep "[scenario name]"
Phase 3: Generate Storybook Stories (AC#N - States)
For state-based AC#N:
3.1 Template
// apps/web/src/[component]/[Component].stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Component } from './Component';
const meta: Meta<typeof Component> = {
title: 'Features/[Feature]/[Component]',
component: Component,
};
export default meta;
type Story = StoryObj<typeof Component>;
// AC#1: Renders without error
export const Default: Story = {
args: { /* default props */ },
};
// AC#2: Shows loading state
export const Loading: Story = {
args: { isLoading: true },
};
// AC#3: Shows error state
export const Error: Story = {
args: { error: 'Something went wrong' },
};
// AC#4: Shows empty state
export const Empty: Story = {
args: { data: [] },
};
3.2 Generate Story
- Check if stories file exists
- Add missing story variants for each AC#N
- Run Storybook to verify renders
npm run storybook -- --smoke-test
Phase 4: Generate E2E Tests (AC#N - Interactions)
For interaction-based AC#N:
4.1 Template
// tests/e2e/[feature].spec.ts
import { test, expect } from '@playwright/test';
test.describe('[Feature Name]', () => {
// AC#5: User can submit form
test('should allow form submission', async ({ page }) => {
await page.goto('/[route]');
await page.fill('[name="field"]', 'value');
await page.click('[type="submit"]');
await expect(page.locator('.success')).toBeVisible();
});
// AC#6: Keyboard navigation works
test('should support keyboard navigation', async ({ page }) => {
await page.goto('/[route]');
await page.keyboard.press('Tab');
await expect(page.locator(':focus')).toHaveAttribute('name', 'first-field');
});
});
4.2 Generate Test
- Check if E2E test file exists
- Add test case for each interaction AC#N
- Run Playwright to verify
npx playwright test [feature].spec.ts
Phase 5: Verify Tests Pass
Run all generated tests:
# Backend
npm run test
# Storybook
npm run storybook -- --smoke-test
# E2E (if applicable)
npx playwright test
Phase 6: Update Test Summary
## Test Hardening Report
### Generated Tests
| Criteria | Type | File | Status |
|----------|------|------|--------|
| G#1 | Jest | `[path]` | CREATED/EXISTS |
| G#2 | Jest | `[path]` | CREATED/EXISTS |
| AC#1 | Storybook | `[path]` | CREATED/EXISTS |
| AC#3 | Playwright | `[path]` | CREATED/EXISTS |
### Test Results
| Suite | Total | Passed | Failed |
|-------|-------|--------|--------|
| Jest | [N] | [N] | 0 |
| Storybook | [N] | [N] | 0 |
| Playwright | [N] | [N] | 0 |
### Coverage Update
- Backend: [N]% → [N]%
- Frontend: [N]% → [N]%
Integration with Debug
When invoked from debug skill Phase 7 (Harden):
- Receive the reproduction steps from debug
- Create regression test to prevent recurrence
- Add test with reference to original issue
// Regression test for [issue description]
// Debug session: [date]
it('should not [bug behavior] when [condition]', async () => {
// Reproduction steps from debug
});
Invocation
Invoked by:
qa-commit- After GREEN verdictdebug- Phase 7 Harden- Push-pr mode - Pre-push verification
Or manually with "use test-hardening skill".
When not to use it
- →When the codebase lacks established test frameworks
- →For temporary UI prototypes without verified contracts
Prerequisites
Limitations
- →Requires existing boilerplate test structure to function
- →Manual adjustment often needed for complex mock data dependencies
How it compares
It automates the transformation of documented requirements into code rather than writing tests from scratch.
Compared to similar skills
test-hardening side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| test-hardening (this skill) | 1 | 7mo | Review | Intermediate |
| vitest | 41 | 6mo | No flags | Intermediate |
| zod-4 | 12 | 7mo | No flags | Intermediate |
| write-unit-tests | 5 | 3mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by WellApp-ai
View all by WellApp-ai →You might also like
vitest
antfu
Vitest fast unit testing framework powered by Vite with Jest-compatible API. Use when writing tests, mocking, configuring coverage, or working with test filtering and fixtures.
zod-4
prowler-cloud
Zod 4 schema validation patterns. Trigger: When creating or updating Zod v4 schemas for validation/parsing (forms, request payloads, adapters), including v3 -> v4 migration patterns.
write-unit-tests
tldraw
Writing unit and integration tests for the tldraw SDK. Use when creating new tests, adding test coverage, or fixing failing tests in packages/editor or packages/tldraw. Covers Vitest patterns, TestEditor usage, and test file organization.
develop-ai-functions-example
vercel
Develop examples for AI SDK functions. Use when creating, running, or modifying examples under examples/ai-functions/src to validate provider support, demonstrate features, or create test fixtures.
javascript-testing-patterns
wshobson
Implement comprehensive testing strategies using Jest, Vitest, and Testing Library for unit tests, integration tests, and end-to-end testing with mocking, fixtures, and test-driven development. Use when writing JavaScript/TypeScript tests, setting up test infrastructure, or implementing TDD/BDD workflows.
ts-library
onmax
Use when authoring TypeScript libraries - covers project setup, package exports, build tooling (tsdown/unbuild), API design patterns, type inference tricks, testing, and release workflows. Patterns extracted from 20+ high-quality ecosystem libraries.