testing-guide
効果的なテストを書くための制約条件を提供し、ユニットテスト、結合テスト、E2Eテストを網羅率だけでなく品質指標も用いてガイドすることで、テスト作成やレビュー、戦略策定を支援するSkill。
📜 元の英語説明(参考)
Opinionated constraints for writing effective tests. Guide unit tests, integration tests, and E2E tests with quality metrics beyond coverage. Use when users write tests, review test code, or need testing strategy. Triggers on keywords like "test", "testing", "单元测试", "集成测试", "E2E", "测试质量", "coverage", "断言".
🇯🇵 日本人クリエイター向け解説
効果的なテストを書くための制約条件を提供し、ユニットテスト、結合テスト、E2Eテストを網羅率だけでなく品質指標も用いてガイドすることで、テスト作成やレビュー、戦略策定を支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o testing-guide.zip https://jpskill.com/download/8781.zip && unzip -o testing-guide.zip && rm testing-guide.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/8781.zip -OutFile "$d\testing-guide.zip"; Expand-Archive "$d\testing-guide.zip" -DestinationPath $d -Force; ri "$d\testing-guide.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
testing-guide.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
testing-guideフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
テストガイド
高品質なテストを作成するための制約と規範です。テストが単にコードを網羅するだけでなく、実際に動作を検証することを保証します。
言語
- 中国語と英語の両方の質問を受け付けます
- 常に中国語で回答します
トリガー条件
- ユーザーがテストコードを作成している
- ユーザーがテスト戦略のガイダンスを必要としている
- ユーザーがテストカバレッジ、アサーション、変異テストについて言及している
- コードレビューでテストコードが扱われている
核心理念
テストの目的は「コードを網羅すること」ではなく、「動作を検証すること」です。
テストの根拠はコードからではなく、要件から得られます。
テスト品質ピラミッド
Level 3: テスト有効性 ─ 変異スコア≥80%, 要件追跡率100%
Level 2: アサーション品質 ─ 弱いアサーションの禁止, 実装ではなく動作を検証
Level 1: コードカバレッジ ─ 行/分岐カバレッジ≥80% (必要条件だが十分条件ではない)
詳細な説明は templates/core-concepts.md を参照してください
制約
ユニットテストの制約
- [ ] 各テストは、≥1 個の具体的なアサーションを持つ必要があります
- [ ] 弱いアサーションを唯一のアサーションとして使用することを禁止します (
toBeDefined,toBeTruthy,not.toBeNull) - [ ] テスト名は、予想される動作を記述する必要があります
- [ ] テストの根拠はコードからではなく、要件から得られます
- [ ] 外部依存関係のみを Mock し、内部実装は Mock しません
- [ ] 各テストは、1 つの動作のみを検証します
詳細なガイドは templates/unit-testing.md を参照してください
カバレッジの制約
- [ ] 行カバレッジ ≥ 80%
- [ ] 分岐カバレッジ ≥ 80%
- [ ] カバレッジは必要条件ですが、十分条件ではありません
変異テストの制約(推奨)
- [ ] 変異スコア ≥ 60%(推奨 ≥ 80%)
- [ ] コアビジネスロジックの変異スコア ≥ 80%
設定は templates/mutation-testing.md を参照してください
統合テストの制約
- [ ] モジュール間のデータフローを検証する必要があります
- [ ] インターフェースの契約を検証する必要があります
- [ ] テストデータは独立している必要があります
詳細なガイドは templates/integration-testing.md を参照してください
E2E テストの制約
- [ ] P0 シナリオは 100% カバーする必要があります
- [ ] 明示的な待機を使用し、ハードコードされた遅延を禁止します
- [ ] テストは独立して実行可能である必要があります
詳細なガイドは templates/e2e-testing.md を参照してください
要件追跡の制約
- [ ] 各要件には、対応するテストが必要です
- [ ] テストコードには、要件IDを注釈する必要があります
テンプレートは templates/traceability-matrix.md を参照してください
テスト骨格の生成
AI 駆動のトップダウン開発:最初にテスト骨格を生成し、後で実装を埋めます。
标注规范
テストコードには、/devdocs-sync --trace スキャンに使用される追跡アノテーションを含める必要があります。
/**
* @verifies AC-XXX - 验收标准描述
* @testcase UT/IT/E2E-XXX
*/
test('テスト名称', () => {
// テストコード
});
| 标注 | 用途 | 必须性 |
|---|---|---|
@verifies AC-XXX |
验收标准との関連付け | 必須 |
@testcase UT/IT/E2E-XXX |
テストケース番号 | 必須 |
骨格生成流程
03-test-cases.md (テスト用例設計)
│
▼
生成测试骨架
├── describe 構造(機能点ごとにグループ化)
├── test.skip() プレースホルダー(各テストケース)
├── @verifies/@testcase 标注
└── // TODO: 实现测试 注释
│
▼
逐个实现测试
├── skip の削除
├── AAA 構造の記述
└── 具体的なアサーションの追加
骨格示例
// tests/user.service.test.ts
describe('UserService', () => {
describe('createUser', () => {
/**
* @verifies AC-001 - 邮箱格式校验
* @testcase UT-001
*/
test.skip('無効なメールアドレス形式を拒否するはず', () => {
// TODO: 实现测试
// Arrange: 無効なメールアドレスを準備
// Act: createUser を呼び出す
// Assert: ValidationError がスローされることを検証
});
/**
* @verifies AC-002 - 密码强度校验
* @testcase UT-002
*/
test.skip('弱いパスワードを拒否するはず', () => {
// TODO: 实现测试
});
/**
* @verifies AC-003 - 用户名唯一性
* @testcase UT-003
*/
test.skip('重複するユーザー名を拒否するはず', () => {
// TODO: 实现测试
});
});
});
骨格生成约束
- [ ] 未実装のテストは
test.skip()またはtest.todo()でマークする必要があります - [ ]
@verifiesと@testcaseアノテーションを追加する必要があります - [ ] 機能点 (F-XXX) ごとに describe 構造を編成する必要があります
- [ ] コメントで AAA 構造を指示する必要があります
- [ ] テスト名は、予想される動作を記述する必要があります
- [ ] 1 つのテストで 1 つの AC のみを検証します
与 DevDocs 协作
| 阶段 | Skill | 输入 | 输出 |
|---|---|---|---|
| 测试设计 | /devdocs-test-cases |
需求文档 | 测试用例矩阵 |
| 骨架生成 | /devdocs-dev-tasks |
测试用例 | 测试骨架代码 |
| 测试实现 | /testing-guide |
骨架代码 | 完整测试 |
| 追溯同步 | /devdocs-sync --trace |
代码标注 | 更新矩阵 |
クイックリファレンス
テスト命名
[テスト対象メソッド] は [予想される動作] するはず [条件] の場合
テスト構造 (AAA)
Arrange → Act → Assert (具体的なアサーション)
禁止されている弱いアサーション
// ❌ 禁止
expect(result).toBeDefined();
expect(result).toBeTruthy();
expect(result).not.toBeNull();
// ✅ 要求
expect(result.status).toBe('success');
expect(result.items).toHaveLength(3);
常用命令
# 覆盖率
npm test -- --coverage # Jest
pytest --cov=src # pytest
go test -cover ./... # Go
# 变异测试
npx stryker run # JS/TS
mutmut run # Python
mvn pitest:mutationCoverage # Java
テンプレートインデックス
コアガイド
| 模板 | 说明 |
|---|---|
| core-concepts.md | テストのコアコンセプトと品質ピラミッドの詳細 |
| unit-testing.md | ユニットテストの完全なガイド |
| integration-testing.md | 統合テストの戦略と例 |
| e2e-testing.md | E2E テストのベストプラクティス |
ツール設定
| 模板 | 说明 |
|---|---|
| mutation-testing.md | 8つの言語の変異テスト設定 |
| ci-integration.md | CI/CD 統合設定 |
| traceability-matrix.md | 要件追跡マトリックス |
| test-examples.md | テストコードの例のコレクション |
言語のベストプラクティス
| 语言 | 框架 | 模板 |
|---|---|---|
| JavaScript/TypeScript | Jest, Vitest | best-practices/jest-vitest.md |
| Python | pytest | best-practices/pytest.md |
| Java | JUnit 5 | best-practices/junit5.md |
| C# / .NET | xUnit, NUnit | best-practices/xunit.md |
| Go | testing, testify | best-practices/go.md |
| Rust | cargo test | best-practices/rust.md |
| Swift | XCTest | best-practices/swift.md |
| C/C++ | Google Test | best-practices/googletest.md |
他の Skills との連携
| 场景 | Skill |
|---|---|
| 测试用例设计 | /devdocs-test-cases |
| 代码可测试性 | /code-quality |
| 重构前测试 | /refactor |
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Testing Guide
编写高质量测试的约束规范,确保测试真正验证行为而非仅仅覆盖代码。
Language
- Accept questions in both Chinese and English
- Always respond in Chinese
Trigger Conditions
- 用户正在编写测试代码
- 用户需要测试策略指导
- 用户提到测试覆盖率、断言、变异测试
- Code Review 中涉及测试代码
核心理念
测试的目的不是"覆盖代码",而是"验证行为"。
测试依据来自需求,不是来自代码。
测试质量金字塔
Level 3: 测试有效性 ─ 变异得分≥80%, 需求追溯100%
Level 2: 断言质量 ─ 禁止弱断言, 验证行为非实现
Level 1: 代码覆盖 ─ 行/分支覆盖≥80% (必要非充分)
Constraints
单元测试约束
- [ ] 每个测试必须有 ≥1 个具体断言
- [ ] 禁止弱断言作为唯一断言 (
toBeDefined,toBeTruthy,not.toBeNull) - [ ] 测试名称必须描述预期行为
- [ ] 测试依据来自需求,不是代码
- [ ] 只 Mock 外部依赖,不 Mock 内部实现
- [ ] 每个测试只验证一个行为
覆盖率约束
- [ ] 行覆盖率 ≥ 80%
- [ ] 分支覆盖率 ≥ 80%
- [ ] 覆盖率是必要条件,不是充分条件
变异测试约束(推荐)
- [ ] 变异得分 ≥ 60%(建议 ≥ 80%)
- [ ] 核心业务逻辑变异得分 ≥ 80%
集成测试约束
- [ ] 必须验证模块间数据流
- [ ] 必须验证接口契约
- [ ] 测试数据必须独立
E2E 测试约束
- [ ] P0 场景必须 100% 覆盖
- [ ] 使用显式等待,禁止硬编码延时
- [ ] 测试必须可独立运行
详细指南见 templates/e2e-testing.md
需求追溯约束
- [ ] 每个需求必须有对应测试
- [ ] 测试代码应标注需求ID
测试骨架生成
AI 驱动的自顶向下开发:先生成测试骨架,后填充实现。
标注规范
测试代码必须包含追溯标注,用于 /devdocs-sync --trace 扫描:
/**
* @verifies AC-XXX - 验收标准描述
* @testcase UT/IT/E2E-XXX
*/
test('测试名称', () => {
// 测试代码
});
| 标注 | 用途 | 必须性 |
|---|---|---|
@verifies AC-XXX |
关联验收标准 | 必须 |
@testcase UT/IT/E2E-XXX |
测试用例编号 | 必须 |
骨架生成流程
03-test-cases.md (测试用例设计)
│
▼
生成测试骨架
├── describe 结构(按功能点分组)
├── test.skip() 占位(每个测试用例)
├── @verifies/@testcase 标注
└── // TODO: 实现测试 注释
│
▼
逐个实现测试
├── 移除 skip
├── 编写 AAA 结构
└── 添加具体断言
骨架示例
// tests/user.service.test.ts
describe('UserService', () => {
describe('createUser', () => {
/**
* @verifies AC-001 - 邮箱格式校验
* @testcase UT-001
*/
test.skip('应该拒绝无效邮箱格式', () => {
// TODO: 实现测试
// Arrange: 准备无效邮箱
// Act: 调用 createUser
// Assert: 验证抛出 ValidationError
});
/**
* @verifies AC-002 - 密码强度校验
* @testcase UT-002
*/
test.skip('应该拒绝弱密码', () => {
// TODO: 实现测试
});
/**
* @verifies AC-003 - 用户名唯一性
* @testcase UT-003
*/
test.skip('应该拒绝重复用户名', () => {
// TODO: 实现测试
});
});
});
骨架生成约束
- [ ] 必须使用
test.skip()或test.todo()标记未实现测试 - [ ] 必须添加
@verifies和@testcase标注 - [ ] 必须按功能点 (F-XXX) 组织 describe 结构
- [ ] 必须在注释中提示 AAA 结构
- [ ] 测试名称必须描述预期行为
- [ ] 一个测试只验证一个 AC
与 DevDocs 协作
| 阶段 | Skill | 输入 | 输出 |
|---|---|---|---|
| 测试设计 | /devdocs-test-cases |
需求文档 | 测试用例矩阵 |
| 骨架生成 | /devdocs-dev-tasks |
测试用例 | 测试骨架代码 |
| 测试实现 | /testing-guide |
骨架代码 | 完整测试 |
| 追溯同步 | /devdocs-sync --trace |
代码标注 | 更新矩阵 |
Quick Reference
测试命名
[被测方法] 应该 [预期行为] 当 [条件]
测试结构 (AAA)
Arrange → Act → Assert (具体断言)
禁止的弱断言
// ❌ 禁止
expect(result).toBeDefined();
expect(result).toBeTruthy();
expect(result).not.toBeNull();
// ✅ 要求
expect(result.status).toBe('success');
expect(result.items).toHaveLength(3);
常用命令
# 覆盖率
npm test -- --coverage # Jest
pytest --cov=src # pytest
go test -cover ./... # Go
# 变异测试
npx stryker run # JS/TS
mutmut run # Python
mvn pitest:mutationCoverage # Java
模板索引
核心指南
| 模板 | 说明 |
|---|---|
| core-concepts.md | 测试核心理念与质量金字塔详解 |
| unit-testing.md | 单元测试完整指南 |
| integration-testing.md | 集成测试策略与示例 |
| e2e-testing.md | E2E 测试最佳实践 |
工具配置
| 模板 | 说明 |
|---|---|
| mutation-testing.md | 8种语言变异测试配置 |
| ci-integration.md | CI/CD 集成配置 |
| traceability-matrix.md | 需求追溯矩阵 |
| test-examples.md | 测试代码示例集 |
语言最佳实践
| 语言 | 框架 | 模板 |
|---|---|---|
| JavaScript/TypeScript | Jest, Vitest | best-practices/jest-vitest.md |
| Python | pytest | best-practices/pytest.md |
| Java | JUnit 5 | best-practices/junit5.md |
| C# / .NET | xUnit, NUnit | best-practices/xunit.md |
| Go | testing, testify | best-practices/go.md |
| Rust | cargo test | best-practices/rust.md |
| Swift | XCTest | best-practices/swift.md |
| C/C++ | Google Test | best-practices/googletest.md |
与其他 Skills 协作
| 场景 | Skill |
|---|---|
| 测试用例设计 | /devdocs-test-cases |
| 代码可测试性 | /code-quality |
| 重构前测试 | /refactor |