用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/kayac/nepp-chan --skill test-writing-rules命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | test-writing-rules |
| description | テストを書く前に発動。仕様から観点とテストケースを導出するための 3 軸チェックリストと技法カタログ。実装の翻訳ではなく仕様の検証になるテストを設計する。 |
テストを書く前に発動し、対象機能に対して仕様ベースで最適なケース集合を設計するための指針。
vitest.config.ts の閾値ギリギリを稼ぐためのテストを書かないテストを書く前に毎回辿る:
createRoute の入出力 Zod スキーマ、Mastra ツールなら inputSchema / description、Repository なら呼び出し元のユースケース、フックなら Props 型と画面側の使われ方を把握references/perspectives.md)references/techniques.md)it の文章で表現する(// 技法: 〇〇 のラベルコメントは書かない)書き始める前に各軸で漏れを潰す。詳細は references/perspectives.md。
null / undefined / NaN)HTTPException の status・コード・message までアサート(error-handler で { error: { code, message } } に整形される)expect(...).toThrow(SpecificError) で型まで確認機能が触る基盤・ドメインに応じて当てる。実装の癖(特定 middleware の優先順位、特定 helper の init 忘れ等)はテスト観点ではなく実装詳細なので含めない。詳細は references/perspectives.md。
書いたケースが本当に効くか、頭の中で実装に小さな変更を入れて落ちるか確認:
> を >= に変えても落ちないテストは弱い&& を || に変えても落ちないなら不足return x を return undefined にしても落ちないなら戻り値検証が甘いPOST /admin/broadcast: scheduled_at が過去日時のとき 400 を返すdescribe のネストは 2 階層まで。深くなるならファイルを分けるvi.useFakeTimers() または DI された clock。new Date() 直接呼び出しはラップ提案を一緒に出すvi.fn() の典型用途)createTestDb() の in-memory SQLite / msw のリクエストハンドラ / vi.useFakeTimers() の仮想時計が該当)「どこに何があるか」ではなく「どう使うか」の指針。詳細パスは CLAUDE.md / server/CLAUDE.md / web/CLAUDE.md を参照。
beforeEach で毎回作り直して状態を隔離。テスト間で row を引き継がないRuntimeContext の中身を 必ず明示(特に env)。default を信用しないserver.use(...) を必ず書く。setup.ts が onUnhandledRequest: "error" のため未モック呼び出しは即落ちる。afterEach の resetHandlers でテスト間の漏れを防ぐTZ=Asia/Tokyo 固定で実行。時刻依存ロジックは vi.useFakeTimers() か DI された clock を使う。new Date() 直接呼び出しは避けるfoo.ts の隣に foo.test.ts)vitest.config.ts で除外されているファイル(Sentry init / Astro shell / 外部 SDK 連携の深い tsx 等)にカバレッジ目当てのテストを足さないテストを書く前に、必ず下記の形でケース集合を一度言語化する。これでテスト過多と漏れを同時に防ぐ。
対象仕様: <関数 / ルート / フックのシグネチャと責務>
採用技法: <同値分割 + 境界値 / 状態遷移 / デシジョンテーブル など>
書くケース:
- <観点>: <入力 → 期待挙動>
- ...
書かないケース(理由付き):
- <観点>: <なぜ書かないか。例: Zod が境界で弾く / Hono router が同じ branch を踏む / 純粋関数で例外系が無い>
expect(true).toBe(true) 系の placeholderskip / only のコミットonUnhandledRequest: "error" で msw が落とすが、念のため)references/perspectives.mdreferences/techniques.mdreferences/examples.md