‹ 首页

test-hardening

@wellapp-ai · 收录于 5 天前 · 上游提交 1 个月前

Convert passed QA Contract criteria to automated tests

适合你,如果经常需要将合同验收标准转化为自动化测试

/ 通过 npx 安装 校验哈希
npx oh-my-skill add wellapp-ai/well/test-hardening
/ 通过 bash 安装
curl -fsSL https://oh-my-skill.com/install.sh | bash -s -- wellapp-ai/well/test-hardening
/ 已经装过?验证本机副本,不用重装
npx oh-my-skill verify wellapp-ai/well/test-hardening
安装目标可用 --agent / --scope 或 --to 明确指定;省略时只会在唯一已存在的 agent 目录上自动选择,零命中或多命中会停止并提示。content_hash 缺失或不一致均拒装。
340GitHub stars
~1.2K上下文体积 · 单文件
索引托管

怎么用

商店整理自技能原文 · 版本 782601c · 表述以原文为准
它做什么

装上后,Claude 能自动把已通过的 QA 标准(Gherkin 场景和验收条件)转成 Jest、Storybook 或 Playwright 测试,并输出测试报告。

什么时候触发

当 qa-commit 返回 GREEN、debug 技能修复问题后的 Harden 阶段、推送 PR 前,或手动说“use test-hardening skill”时触发。

装好后可以这样说
Claude 会生成对应测试文件并验证。
Claude 会添加防止问题复现的测试。
技能原文 SKILL.md作者撰写 · MIT · 782601c

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
  1. Extract endpoint, method, expected response from G#N
  2. Create test file if not exists
  3. Add test case with G#N reference in comment
  4. 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
  1. Check if stories file exists
  2. Add missing story variants for each AC#N
  3. 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
  1. Check if E2E test file exists
  2. Add test case for each interaction AC#N
  3. 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):

  1. Receive the reproduction steps from debug
  2. Create regression test to prevent recurrence
  3. 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 verdict
  • debug - Phase 7 Harden
  • Push-pr mode - Pre-push verification

Or manually with "use test-hardening skill".

按 MIT 许可原样转载,未经改动 · 在 GitHub 查看 →

评论

登录即可评论;带「已验证安装」的,是发布者名下有本店的安装或持有记录。