ai-check-template 0.2.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README-ja.md +151 -0
- package/README.md +149 -0
- package/bin/ai-check-template.mjs +7 -0
- package/docs/cli.md +348 -0
- package/package-templates/.claude/README.md +83 -0
- package/package-templates/.claude/rules/test-rules.md +46 -0
- package/package-templates/.claude/settings.hook-fragment.json +25 -0
- package/package-templates/README.md +56 -0
- package/package-templates/ci-examples/README.md +134 -0
- package/package-templates/ci-examples/github-actions/ai-check-fast.yml +49 -0
- package/package-templates/ci-examples/github-actions/ai-check.yml +58 -0
- package/package-templates/ci-examples/github-actions/ai-quality-call.yml +26 -0
- package/package-templates/ci-examples/github-actions/ai-quality-reusable.yml +113 -0
- package/package-templates/docs/philosophy/formal-name-match.md +182 -0
- package/package-templates/docs/philosophy/given-when-then.md +206 -0
- package/package-templates/docs/philosophy/qa-techniques.md +235 -0
- package/package-templates/docs/philosophy/test-pyramid.md +171 -0
- package/package-templates/docs/test-design-template.md +173 -0
- package/package-templates/package.scripts.fragment.json +6 -0
- package/package-templates/profiles/README.md +89 -0
- package/package-templates/profiles/expo-rn/README.md +80 -0
- package/package-templates/profiles/node-cli/README.md +93 -0
- package/package-templates/profiles/react-nextjs/README.md +82 -0
- package/package-templates/profiles/react-vanilla/README.md +73 -0
- package/package-templates/profiles/supabase-rls/README.md +89 -0
- package/package-templates/prompts/README.md +94 -0
- package/package-templates/prompts/boundary-value.md +94 -0
- package/package-templates/prompts/decision-table.md +82 -0
- package/package-templates/prompts/diagnostic-repair.md +149 -0
- package/package-templates/prompts/plan-first.md +122 -0
- package/package-templates/prompts/rls-permission.md +94 -0
- package/package-templates/prompts/state-transition.md +81 -0
- package/package-templates/scripts/README.md +78 -0
- package/package-templates/scripts/ai-check-fast.sh +20 -0
- package/package-templates/scripts/ai-check.sh +22 -0
- package/package.json +47 -0
- package/src/cli/ci-workflows.mjs +104 -0
- package/src/cli/claude-hooks.mjs +94 -0
- package/src/cli/dependency-installer.mjs +164 -0
- package/src/cli/doctor.mjs +392 -0
- package/src/cli/index.mjs +80 -0
- package/src/cli/init.mjs +433 -0
- package/src/cli/install-state.mjs +242 -0
- package/src/cli/package-manager.mjs +78 -0
- package/src/cli/profile-diagnostics.mjs +160 -0
- package/src/cli/profile-docs.mjs +31 -0
- package/src/cli/profile-scripts.mjs +96 -0
- package/src/cli/profile.mjs +59 -0
- package/src/cli/update.mjs +537 -0
- package/src/cli/utils.mjs +75 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# Given-When-Then
|
|
2
|
+
|
|
3
|
+
> **ステータス**: Draft v0.1(Phase 1 dogfooding 後に改訂予定)
|
|
4
|
+
|
|
5
|
+
## このファイルの守備範囲
|
|
6
|
+
|
|
7
|
+
Given-When-Then(GWT)構文の定義と、AI 駆動開発における受け入れ条件先行運用を扱う。
|
|
8
|
+
|
|
9
|
+
GWT の「Then」を機械検証可能な「名」に変換する方法は [`formal-name-match.md`](./formal-name-match.md)、各層(Static / Unit / Integration / E2E / DB-RLS)での GWT 例は [`test-pyramid.md`](./test-pyramid.md)、GWT で書くべき観点を導く技法は [`qa-techniques.md`](./qa-techniques.md) を参照。
|
|
10
|
+
|
|
11
|
+
## 概念定義
|
|
12
|
+
|
|
13
|
+
Given-When-Then(GWT)は、**テストケース・受け入れ条件・要件を「前提 / 操作 / 期待結果」の 3 要素で表現する記法**。
|
|
14
|
+
|
|
15
|
+
- **Given**: 前提条件(テスト開始時の状態)
|
|
16
|
+
- **When**: 実行する操作(外部入力 / API 呼び出し / ユーザー操作)
|
|
17
|
+
- **Then**: 期待結果(出力 / 状態変化 / 副作用)
|
|
18
|
+
|
|
19
|
+
AI 駆動開発では、いきなり「実装してください」と AI に依頼すると、「正しさ」の基準が AI と人間で食い違う。**実装前に GWT で受け入れ条件を AI に書かせる**ことで、何をもって正しいかを先に固定する。
|
|
20
|
+
|
|
21
|
+
GWT は形名参同の「名」を具体化するための記法。
|
|
22
|
+
|
|
23
|
+
## GWT 構文
|
|
24
|
+
|
|
25
|
+
### 基本形
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Given: <前提条件>
|
|
29
|
+
When: <操作>
|
|
30
|
+
Then: <期待結果>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
例:
|
|
34
|
+
```
|
|
35
|
+
Given: 未ログインのユーザーが商品一覧ページを開いている
|
|
36
|
+
When: 商品詳細リンクをクリックする
|
|
37
|
+
Then: 商品詳細ページが表示され、保存ボタンが「ログインが必要です」と表示される
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 複数 When(And)
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Given: ユーザーがログインしている
|
|
44
|
+
When: アイテム X を保存する
|
|
45
|
+
And: 保存ボタンを再度クリックする
|
|
46
|
+
Then: 保存が解除され、保存一覧から X が消える
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
ただし複数 When は責務が混在する兆候。可能ならテストケースを分ける。
|
|
50
|
+
|
|
51
|
+
### 複数 Then(And)
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
Given: ユーザーがログイン済み
|
|
55
|
+
When: プロフィール更新フォームを送信する
|
|
56
|
+
Then: ステータス 200 が返る
|
|
57
|
+
And: DB の users.updated_at が更新される
|
|
58
|
+
And: 「保存しました」トーストが表示される
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
複数 Then は OK(1 操作で複数の副作用がある)。各 Then が独立に検証可能であることが重要。
|
|
62
|
+
|
|
63
|
+
### Background(共通前提)
|
|
64
|
+
|
|
65
|
+
複数のシナリオで前提が共通の場合、Background でまとめる:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
Background:
|
|
69
|
+
Given: 一般ユーザー A がログイン済み
|
|
70
|
+
And: アイテム X, Y, Z が DB に存在する
|
|
71
|
+
|
|
72
|
+
Scenario 1: 一覧表示
|
|
73
|
+
When: アイテム一覧ページを開く
|
|
74
|
+
Then: X, Y, Z がすべて表示される
|
|
75
|
+
|
|
76
|
+
Scenario 2: 保存
|
|
77
|
+
When: アイテム X を保存する
|
|
78
|
+
Then: 保存一覧に X だけが表示される
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## AI への指示パターン
|
|
82
|
+
|
|
83
|
+
### 実装前: 受け入れ条件を先に出させる
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
この機能を実装する前に、Given-When-Then 形式で受け入れ条件を 5 件以上書いてください。
|
|
87
|
+
|
|
88
|
+
含めるべき観点:
|
|
89
|
+
- 正常系(最低 2 件)
|
|
90
|
+
- 異常系(最低 2 件)
|
|
91
|
+
- 境界ケース(最低 1 件)
|
|
92
|
+
|
|
93
|
+
各シナリオは独立して検証可能であること。
|
|
94
|
+
まだコードは書かないでください。
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
これにより、AI が「何を作るか」を曖昧なまま実装に入るのを防ぐ。
|
|
98
|
+
|
|
99
|
+
### 実装後: GWT と実装の対応表を出させる
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
実装が完了したら、以下の表を出力してください。
|
|
103
|
+
|
|
104
|
+
| Scenario | 検証コマンド | 実装ファイル | 検証結果 |
|
|
105
|
+
|---|---|---|---|
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
GWT のシナリオ ID と実装の対応を明示することで、後からの保守が楽になる。
|
|
109
|
+
|
|
110
|
+
### テスト生成: GWT からテストコードを生成
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
以下の GWT シナリオに対応するテストコードを生成してください。
|
|
114
|
+
ただし以下の制約を守ってください:
|
|
115
|
+
|
|
116
|
+
- Given は beforeEach または setup ステップに対応
|
|
117
|
+
- When はテスト内の操作 (act) に対応
|
|
118
|
+
- Then は assertion に対応
|
|
119
|
+
- 1 Scenario = 1 test case
|
|
120
|
+
- テスト種別(Unit / Integration / E2E)を明示
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
GWT は人間が読みやすいが、AI が直接実行できる形式ではない。GWT → テストコードへの変換を AI に任せる。
|
|
124
|
+
|
|
125
|
+
## 受け入れ条件への落とし方
|
|
126
|
+
|
|
127
|
+
GWT は人間が読みやすい一方、機械検証可能化が必要。以下の手順で「形名参同」の「名」に変換する。
|
|
128
|
+
|
|
129
|
+
### 1. Then を測定可能な形にする
|
|
130
|
+
|
|
131
|
+
悪い例:
|
|
132
|
+
```
|
|
133
|
+
Then: 正しく動作する
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
良い例:
|
|
137
|
+
```
|
|
138
|
+
Then: レスポンスステータスが 200 で、レスポンスボディの id フィールドが UUID v4 形式
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 2. 検証コマンドに対応させる
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
Scenario: ログイン成功
|
|
145
|
+
Given: 有効なメールアドレスとパスワードを保持
|
|
146
|
+
When: POST /auth/login を呼ぶ
|
|
147
|
+
Then: ステータス 200 とトークンが返る
|
|
148
|
+
|
|
149
|
+
検証コマンド:
|
|
150
|
+
STATUS=$(curl -s -o /tmp/body -w "%{http_code}" -X POST /auth/login \
|
|
151
|
+
-d '{"email":"...","password":"..."}')
|
|
152
|
+
test "$STATUS" = "200" && jq -e '.token' /tmp/body
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 3. 失敗時の振る舞いも GWT で書く
|
|
156
|
+
|
|
157
|
+
正常系だけでは「名」が不完全。異常系も明示する。
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
Scenario: ログイン失敗(無効パスワード)
|
|
161
|
+
Given: 登録済みメールアドレスを保持
|
|
162
|
+
When: 誤ったパスワードで POST /auth/login を呼ぶ
|
|
163
|
+
Then: ステータス 401 と { "error": "invalid_credentials" } が返る
|
|
164
|
+
And: DB の failed_attempts カウンターが +1 される
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
異常系の Then には「拒否される / エラーが返る / 副作用が起きない」を明示する。
|
|
168
|
+
|
|
169
|
+
## アンチパターン
|
|
170
|
+
|
|
171
|
+
| アンチパターン | 何が悪いか | 修正 |
|
|
172
|
+
|---|---|---|
|
|
173
|
+
| 曖昧な Given(「いい感じの状態」) | 再現できない、テストできない | 具体的な状態を列挙 |
|
|
174
|
+
| 副作用を持つ When(内部で他処理を勝手に実行) | 何を検証しているか不明 | 1 When = 1 操作 |
|
|
175
|
+
| 検証不能な Then(「ちゃんと動く」) | 機械検証できない | 出力 / 状態変化を具体化 |
|
|
176
|
+
| Then が複数の責務(ログ + DB + API を 1 行で混在) | 失敗原因が特定できない | Scenario を分ける or And で並列化 |
|
|
177
|
+
| Given に実装詳細(「内部で X 関数が呼ばれている」) | 仕様ではなく実装に依存 | 観測可能な状態のみ書く |
|
|
178
|
+
| Scenario が長すぎる(10 行以上) | 1 Scenario が複数仕様を兼ねている | 分割する |
|
|
179
|
+
| 期待結果が「画面に何か出る」 | 出力内容が確認不能 | 文言 or 構造を具体化 |
|
|
180
|
+
|
|
181
|
+
## 形名参同との関係
|
|
182
|
+
|
|
183
|
+
GWT の Then = 形名参同の「名」。実装後に Then を機械検証コマンドで照合することで、「名」と「形」の一致を確認する。
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
GWT の Then「ステータス 200 と token が返る」
|
|
187
|
+
↓ 機械検証可能化
|
|
188
|
+
名: HTTP status == 200, response.token != null
|
|
189
|
+
↓ 実装後に測定
|
|
190
|
+
形: curl コマンドの実測値
|
|
191
|
+
↓ 照合
|
|
192
|
+
名 == 形 ?
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
GWT を書いた段階で「名」がほぼ確定する。実装は「名」を満たすように行い、検証は「形」と照合するだけ。
|
|
196
|
+
|
|
197
|
+
## 隣接する思想との関係
|
|
198
|
+
|
|
199
|
+
- [`formal-name-match.md`](./formal-name-match.md) — GWT の Then を機械検証可能な「名」に変換し、「形」と照合する
|
|
200
|
+
- [`test-pyramid.md`](./test-pyramid.md) — 各層(Static / Unit / Integration / E2E / DB-RLS)の GWT 例
|
|
201
|
+
- [`qa-techniques.md`](./qa-techniques.md) — GWT で書くべき観点を導出する技法(同値分割・境界値・デシジョンテーブル等)
|
|
202
|
+
|
|
203
|
+
## 出典
|
|
204
|
+
|
|
205
|
+
- Notion ページ: `35b68c677f4380bfa1ffeab248264e92` — テストフロー再設計(参照日 2026-05-13)
|
|
206
|
+
- 一次資料: Cucumber / Gherkin(Given-When-Then 構文の標準化)、BDD(Behavior-Driven Development)
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# QA 技法
|
|
2
|
+
|
|
3
|
+
> **ステータス**: Draft v0.1(Phase 1 dogfooding 後に改訂予定)
|
|
4
|
+
|
|
5
|
+
## このファイルの守備範囲
|
|
6
|
+
|
|
7
|
+
「何をテストすべきか」を漏れなく導き出すための観点設計の体系(同値分割・境界値分析・デシジョンテーブル・状態遷移テスト・エラー推測・チェックリストベースドテスト)を扱う。
|
|
8
|
+
|
|
9
|
+
これらの観点を「名」に変換するのは [`formal-name-match.md`](./formal-name-match.md)、観点を Given-When-Then で記述するのは [`given-when-then.md`](./given-when-then.md)、各層(Unit / Integration / E2E / DB-RLS)にどの技法を適用するかは [`test-pyramid.md`](./test-pyramid.md) を参照。
|
|
10
|
+
|
|
11
|
+
## 概念定義
|
|
12
|
+
|
|
13
|
+
QA 技法は、**「何をテストすべきか」を漏れなく導き出すための観点設計の体系**。テストコードを書く技術ではなく、**テストケースを設計する技術**。
|
|
14
|
+
|
|
15
|
+
AI 駆動開発では「テストを書いて」と依頼すると正常系中心の薄いテストになりがち。AI に明示的に観点を渡すことで、境界条件・条件組み合わせ・状態遷移・例外系の網羅性が上がる。
|
|
16
|
+
|
|
17
|
+
QA 技法は形名参同の「名」(成功基準)に含めるべきテスト観点を漏れなく抽出する道具。
|
|
18
|
+
|
|
19
|
+
## 1. 同値分割
|
|
20
|
+
|
|
21
|
+
入力空間を「同じ振る舞いをする値のグループ」に分け、各グループから 1 つだけ代表値を選ぶ技法。
|
|
22
|
+
|
|
23
|
+
### 例: 「人数は 1〜4 名まで」というバリデーション
|
|
24
|
+
- グループ A: 0 以下 → 無効
|
|
25
|
+
- グループ B: 1〜4 → 有効
|
|
26
|
+
- グループ C: 5 以上 → 無効
|
|
27
|
+
|
|
28
|
+
3 グループ × 各 1 代表 = 3 テストケースで十分。100 件テストする必要はない。
|
|
29
|
+
|
|
30
|
+
### 効果
|
|
31
|
+
- 無駄なテストを減らす
|
|
32
|
+
- 抜けを防ぐ(各グループ最低 1 件)
|
|
33
|
+
|
|
34
|
+
### AI 指示プロンプト
|
|
35
|
+
```
|
|
36
|
+
このバリデーション(1〜4 名)について、同値分割で 3 グループに分け、
|
|
37
|
+
各グループの代表値を 1 つずつ選んでテストケースを作成してください。
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 2. 境界値分析
|
|
41
|
+
|
|
42
|
+
同値分割で分けたグループの**境目**を狙う技法。`>=` と `>`、`<=` と `<` の取り違えが境界で発生しやすい。
|
|
43
|
+
|
|
44
|
+
### 例: 「人数は 1〜4 名まで」
|
|
45
|
+
特に見るべき値: 0, 1, 4, 5
|
|
46
|
+
|
|
47
|
+
- 0: 無効(下限の 1 つ外)
|
|
48
|
+
- 1: 有効(下限)
|
|
49
|
+
- 4: 有効(上限)
|
|
50
|
+
- 5: 無効(上限の 1 つ外)
|
|
51
|
+
|
|
52
|
+
AI が生成した実装でも、「1 以上」を `> 1` と書いてしまうケースが頻発する。境界値テストはこの種のバグを直接突く。
|
|
53
|
+
|
|
54
|
+
### AI 指示プロンプト
|
|
55
|
+
```
|
|
56
|
+
このバリデーションのテストを追加してください。
|
|
57
|
+
特に境界値として 0, 1, 4, 5 を必ず含めてください。
|
|
58
|
+
これは「>= 1」と「> 0」、「<= 4」と「< 5」の取り違えを検出するためです。
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 3. デシジョンテーブル
|
|
62
|
+
|
|
63
|
+
複数条件の組み合わせ漏れを防ぐ技法。表で全パターンを列挙し、各組み合わせの期待結果を明示する。
|
|
64
|
+
|
|
65
|
+
### 例: 「通知メール送信条件」
|
|
66
|
+
3 条件: イベント発生 / 通知 ON / メール登録あり
|
|
67
|
+
|
|
68
|
+
| イベント発生 | 通知 ON | メール登録 | 結果 |
|
|
69
|
+
|---|---|---|---|
|
|
70
|
+
| Yes | Yes | Yes | 送信 |
|
|
71
|
+
| Yes | Yes | No | 送信しない |
|
|
72
|
+
| Yes | No | Yes | 送信しない |
|
|
73
|
+
| No | Yes | Yes | 送信しない |
|
|
74
|
+
| Yes | No | No | 送信しない |
|
|
75
|
+
| No | Yes | No | 送信しない |
|
|
76
|
+
| No | No | Yes | 送信しない |
|
|
77
|
+
| No | No | No | 送信しない |
|
|
78
|
+
|
|
79
|
+
3 条件 × 2 = 8 パターンを表で網羅。AI に「全パターン書いて」と依頼すれば漏れにくい。
|
|
80
|
+
|
|
81
|
+
### AI 指示プロンプト
|
|
82
|
+
```
|
|
83
|
+
以下の仕様について、先にデシジョンテーブルを作成してください。
|
|
84
|
+
3 条件の全 8 パターンを列挙し、各組み合わせの期待結果を明示してください。
|
|
85
|
+
その後、各パターンに対応するテストケースを作成してください。
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 縮約
|
|
89
|
+
|
|
90
|
+
条件数が多いと組み合わせが爆発する(4 条件 = 16 行、5 条件 = 32 行)。
|
|
91
|
+
- 同じ結果の行は省略可(「他の条件が No なら結果も No」等)
|
|
92
|
+
- 4 条件以上は仕様自体の見直し検討
|
|
93
|
+
|
|
94
|
+
## 4. 状態遷移テスト
|
|
95
|
+
|
|
96
|
+
状態を持つ機能で、「どの状態からどの状態へ遷移できるか」を検証する技法。
|
|
97
|
+
|
|
98
|
+
### 例: 注文ステータス
|
|
99
|
+
状態: pending / confirmed / shipped / delivered / cancelled
|
|
100
|
+
|
|
101
|
+
許可される遷移:
|
|
102
|
+
- pending → confirmed
|
|
103
|
+
- confirmed → shipped
|
|
104
|
+
- shipped → delivered
|
|
105
|
+
- pending / confirmed → cancelled
|
|
106
|
+
|
|
107
|
+
禁止される遷移(明示的にテスト):
|
|
108
|
+
- delivered → pending(巻き戻し)
|
|
109
|
+
- cancelled → confirmed(キャンセル取り消し)
|
|
110
|
+
- pending → shipped(confirmed をスキップ)
|
|
111
|
+
|
|
112
|
+
不正遷移のテストが**特に重要**。AI は許可遷移だけテストしがちなので、明示する。
|
|
113
|
+
|
|
114
|
+
### AI 指示プロンプト
|
|
115
|
+
```
|
|
116
|
+
注文ステータスの状態遷移について、先に遷移表を作成してください。
|
|
117
|
+
許可される遷移と禁止される遷移を分け、両方をテストしてください。
|
|
118
|
+
特に禁止される遷移が API 層で拒否されることを確認してください。
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 5. エラー推測
|
|
122
|
+
|
|
123
|
+
過去の障害や運用知見から「ここは壊れやすい」と予測してテストする技法。経験ベース。
|
|
124
|
+
|
|
125
|
+
### 実務で危ない例
|
|
126
|
+
- 二重送信(「保存」連打)
|
|
127
|
+
- 戻る操作後の再送信
|
|
128
|
+
- タイムゾーン差分(UTC vs ローカル)
|
|
129
|
+
- 空文字と null の混在
|
|
130
|
+
- 全角半角混在(メールアドレス、電話番号)
|
|
131
|
+
- 権限の抜け道(フロントで隠しただけで API は素通り)
|
|
132
|
+
- 通信失敗時の中途半端な状態(「成功」表示なのに DB 未反映)
|
|
133
|
+
- ロケール依存(日本語 / 英語 / 多言語)
|
|
134
|
+
- 文字数上限の取り違え(バイト数 vs 文字数 vs Unicode コードポイント)
|
|
135
|
+
- 並行リクエストでのレース(同じユーザーが 2 タブで操作)
|
|
136
|
+
- 大量データでの性能劣化(1 万件以上のリスト)
|
|
137
|
+
|
|
138
|
+
### AI 指示プロンプト
|
|
139
|
+
```
|
|
140
|
+
以下の機能について、エラー推測ベースで「壊れやすそうな点」を 5 件以上挙げてください。
|
|
141
|
+
過去のソフトウェア障害でよくあるパターンを参考にしてください。
|
|
142
|
+
その後、各点に対応するテストを作成してください。
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
これは経験ベースなので、組織で**過去障害知見をチェックリスト化**して AI に渡すと効く。
|
|
146
|
+
失敗パターンは [`sage/failures.md`](../../../sage/failures.md) に蓄積する運用と相性がよい。
|
|
147
|
+
|
|
148
|
+
## 6. チェックリストベースドテスト
|
|
149
|
+
|
|
150
|
+
よく使う観点を**事前にチェックリスト化**しておき、毎回機械的に適用する技法。
|
|
151
|
+
|
|
152
|
+
### 画面実装の標準チェックリスト
|
|
153
|
+
- [ ] 正常系は動くか
|
|
154
|
+
- [ ] バリデーションエラーが表示されるか
|
|
155
|
+
- [ ] ローディング中に二重送信できないか
|
|
156
|
+
- [ ] 権限がないユーザーに操作が見えないか
|
|
157
|
+
- [ ] API 失敗時に UI が壊れないか
|
|
158
|
+
- [ ] 成功表示と実データが一致するか
|
|
159
|
+
- [ ] モバイル表示で崩れないか
|
|
160
|
+
- [ ] console error が出ていないか
|
|
161
|
+
- [ ] 戻る操作で状態が壊れないか
|
|
162
|
+
- [ ] 空データ / 多量データで表示が崩れないか
|
|
163
|
+
|
|
164
|
+
### API 実装の標準チェックリスト
|
|
165
|
+
- [ ] 認証なしで 401 / 403
|
|
166
|
+
- [ ] 権限不足で 403
|
|
167
|
+
- [ ] 不正入力で 400 + エラーメッセージ
|
|
168
|
+
- [ ] 存在しないリソースで 404
|
|
169
|
+
- [ ] 重複作成で 409
|
|
170
|
+
- [ ] レート制限で 429
|
|
171
|
+
- [ ] 内部エラーで 500(スタックトレース漏洩なし)
|
|
172
|
+
- [ ] 別ユーザーのリソースを ID で指定して 403 / 404
|
|
173
|
+
|
|
174
|
+
### AI 指示プロンプト
|
|
175
|
+
```
|
|
176
|
+
以下の <画面|API> 実装について、標準チェックリスト全項目を順に検証するテストを作成してください。
|
|
177
|
+
チェックリストは以下です:
|
|
178
|
+
- <チェックリスト貼付>
|
|
179
|
+
各項目で 1 テストケース以上書いてください。
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## AI へのテスト依頼の型
|
|
183
|
+
|
|
184
|
+
### 悪い依頼
|
|
185
|
+
```
|
|
186
|
+
この機能のテストを書いてください。
|
|
187
|
+
```
|
|
188
|
+
→ 正常系中心の薄いテストになる。
|
|
189
|
+
|
|
190
|
+
### 少し良い依頼
|
|
191
|
+
```
|
|
192
|
+
この機能のテストを追加してください。
|
|
193
|
+
同値分割、境界値分析、条件組み合わせ、状態遷移、null/空文字を含めてください。
|
|
194
|
+
```
|
|
195
|
+
→ 観点は広がるが、何を網羅するか不明瞭。
|
|
196
|
+
|
|
197
|
+
### さらに良い依頼
|
|
198
|
+
```
|
|
199
|
+
この仕様について、以下を先に列挙してください。
|
|
200
|
+
|
|
201
|
+
1. 同値分割(入力グループ分け)
|
|
202
|
+
2. 境界値(各境目の値)
|
|
203
|
+
3. デシジョンテーブル(条件組み合わせの全パターン)
|
|
204
|
+
4. 状態遷移表(許可・禁止両方)
|
|
205
|
+
5. エラー推測(壊れやすそうな点)
|
|
206
|
+
|
|
207
|
+
その結果をもとにテストコードを作成してください。
|
|
208
|
+
各テストケースが上記のどれに対応するかを明記してください。
|
|
209
|
+
```
|
|
210
|
+
→ 観点設計 → テスト生成 の 2 段階で漏れにくい。
|
|
211
|
+
|
|
212
|
+
## 形名参同との関係
|
|
213
|
+
|
|
214
|
+
QA 技法は形名参同の「名」を漏れなく構成するための観点リスト。
|
|
215
|
+
|
|
216
|
+
- **同値分割** → 「名」を不要な重複なく列挙
|
|
217
|
+
- **境界値** → 「名」に境目の値を漏らさない
|
|
218
|
+
- **デシジョンテーブル** → 「名」に条件組み合わせを漏らさない
|
|
219
|
+
- **状態遷移** → 「名」に不正遷移の拒否を含める
|
|
220
|
+
- **エラー推測** → 「名」に運用上の事故パターンを含める
|
|
221
|
+
- **チェックリスト** → 「名」を標準化して属人化を防ぐ
|
|
222
|
+
|
|
223
|
+
QA 技法で導いた観点を [`given-when-then.md`](./given-when-then.md) の GWT 構文で書き、[`formal-name-match.md`](./formal-name-match.md) の形名照合ループで検証する。
|
|
224
|
+
|
|
225
|
+
## 隣接する思想との関係
|
|
226
|
+
|
|
227
|
+
- [`formal-name-match.md`](./formal-name-match.md) — QA 技法で導いた観点を「名」に変換し、実装後に「形」と照合
|
|
228
|
+
- [`test-pyramid.md`](./test-pyramid.md) — 各 QA 技法を Unit / Integration / E2E / DB-RLS のどの層で適用するか
|
|
229
|
+
- [`given-when-then.md`](./given-when-then.md) — QA 技法で導いた観点を Given-When-Then で記述する
|
|
230
|
+
|
|
231
|
+
## 出典
|
|
232
|
+
|
|
233
|
+
- Notion ページ: `dc8774cd03c8490688b066c2b0179cac` — AI 駆動開発時代に押さえる QA 技法(参照日 2026-05-13)
|
|
234
|
+
- 元記事: Zenn「AI 駆動開発時代に、おさえておきたい QA 技法」
|
|
235
|
+
- 一次資料: ISTQB Foundation Level Syllabus(同値分割・境界値・デシジョンテーブル・状態遷移)
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# テストピラミッド(責務分割)
|
|
2
|
+
|
|
3
|
+
> **ステータス**: Draft v0.1(Phase 1 dogfooding 後に改訂予定)
|
|
4
|
+
|
|
5
|
+
## このファイルの守備範囲
|
|
6
|
+
|
|
7
|
+
テストを Static / Unit / Integration / E2E / DB-RLS / Monitoring の 6 層に分け、各層の責務と適切な量を定義する。E2E 偏重の弊害と、責務分割による解消を扱う。
|
|
8
|
+
|
|
9
|
+
各層の「名」(成功基準)の照合は [`formal-name-match.md`](./formal-name-match.md)、各層に書くべき観点の抽出は [`qa-techniques.md`](./qa-techniques.md)、各層のケースを Given-When-Then で記述する方法は [`given-when-then.md`](./given-when-then.md) を参照。
|
|
10
|
+
|
|
11
|
+
## 概念定義
|
|
12
|
+
|
|
13
|
+
テストピラミッドは、**テストを責務別の層に分け、各層に適切な量・実行頻度・期待を割り当てる**設計思想。
|
|
14
|
+
|
|
15
|
+
AI 駆動開発では「安心したいから E2E を増やす」傾向があるが、E2E が肥大化すると以下が起きる:
|
|
16
|
+
|
|
17
|
+
- CI 時間が増えてフィードバックが遅くなる
|
|
18
|
+
- flaky(不安定)テストで開発者が信頼しなくなる
|
|
19
|
+
- 失敗時の原因特定が重くなる
|
|
20
|
+
- 1 件の修正に対するメンテコストが上がる
|
|
21
|
+
|
|
22
|
+
そのため、E2E の量は最小化し、**より下位の層(Static / Unit / Integration)で先に問題を捕まえる**設計が良い。
|
|
23
|
+
|
|
24
|
+
「形名参同」の「名」(成功基準)を、各層でどう定義するかが本ドキュメントの主題。
|
|
25
|
+
|
|
26
|
+
## 各層の定義
|
|
27
|
+
|
|
28
|
+
### 1. Static check(最下層)
|
|
29
|
+
|
|
30
|
+
プログラムを実行せず、ソースコードの静的解析で検出できる問題を扱う。
|
|
31
|
+
|
|
32
|
+
- 型チェック(TypeScript の `tsc --noEmit`、Go の `go vet`、Rust の `cargo check` 等)
|
|
33
|
+
- lint(ESLint / oxlint / Biome / Ruff 等)
|
|
34
|
+
- 未使用コード検出(Knip / depcheck 等)
|
|
35
|
+
- フォーマットチェック(Prettier / gofmt 等)
|
|
36
|
+
|
|
37
|
+
実行コストは最も低く、フィードバックは最も速い。AI 駆動開発では実装直後の **fast loop** に必ず含める。
|
|
38
|
+
|
|
39
|
+
### 2. Unit test
|
|
40
|
+
|
|
41
|
+
純粋関数・モジュール単体の振る舞いを検証する。外部 I/O(ネットワーク / DB / ファイル / 時刻)に依存しない。
|
|
42
|
+
|
|
43
|
+
- バリデーションロジック
|
|
44
|
+
- 変換関数(時刻フォーマット、文字列変換等)
|
|
45
|
+
- 状態遷移計算(reducer / state machine)
|
|
46
|
+
- ドメインロジック(料金計算、権限判定等)
|
|
47
|
+
|
|
48
|
+
実行は数 ms〜数百 ms。多数あっても CI を遅らせない。**最も多くのテストを書くべき層**。
|
|
49
|
+
|
|
50
|
+
### 3. Integration test
|
|
51
|
+
|
|
52
|
+
複数モジュールやレイヤをまたぐ結合動作を検証する。外部依存はモック化または local 実体を使う。
|
|
53
|
+
|
|
54
|
+
- フォームのバリデーション + 送信フロー(UI + API)
|
|
55
|
+
- API ハンドラー + DB(in-memory or local container)
|
|
56
|
+
- 認可ロジック + ユーザー状態の組み合わせ
|
|
57
|
+
- 画面表示と API 結果の整合
|
|
58
|
+
|
|
59
|
+
実行コストは中程度。Unit よりは少なく、E2E よりは多く書く。
|
|
60
|
+
|
|
61
|
+
### 4. E2E test
|
|
62
|
+
|
|
63
|
+
実ブラウザまたは実環境で、エンドユーザー目線の重要導線を検証する。
|
|
64
|
+
|
|
65
|
+
- サインアップ → ログイン → 主要機能利用
|
|
66
|
+
- 決済フロー
|
|
67
|
+
- 認証フロー(外部 IdP との連携を含む場合)
|
|
68
|
+
|
|
69
|
+
実行コストは高い(数秒〜数十秒)。flaky 化しやすい。**事業上壊れたら致命的な導線のみ**に絞る。
|
|
70
|
+
|
|
71
|
+
### 5. DB-RLS test
|
|
72
|
+
|
|
73
|
+
データベース層、特に Row Level Security や権限制御を検証する。
|
|
74
|
+
|
|
75
|
+
- 他人のデータが見えないこと(RLS)
|
|
76
|
+
- 権限がないユーザーが書き込めないこと
|
|
77
|
+
- 制約・トリガー・関数の動作
|
|
78
|
+
|
|
79
|
+
専用ツール(pgTAP 等)を使うことが多い。SQL レベルで検証する。AI に「フロントで隠したから OK」と判断させないために**サーバー側のテストが必須**。
|
|
80
|
+
|
|
81
|
+
### 6. Monitoring(本番)
|
|
82
|
+
|
|
83
|
+
本番環境で再現困難な不具合を検知する。
|
|
84
|
+
|
|
85
|
+
- エラーレート / レイテンシのアラート
|
|
86
|
+
- セッションリプレイ
|
|
87
|
+
- ヘルスチェック / 合成監視(Synthetic Monitoring)
|
|
88
|
+
|
|
89
|
+
「テスト」ではないが、品質保証の連続体として扱う。本番で初めて発覚する問題は、次回のテスト設計にフィードバックする。
|
|
90
|
+
|
|
91
|
+
## 責務分割表
|
|
92
|
+
|
|
93
|
+
| 層 | 検証対象 | 実行頻度 | テスト数 | flake 許容 | 代表ツール例 |
|
|
94
|
+
|---|---|---|---|---|---|
|
|
95
|
+
| Static | 型・lint・未使用 | 毎保存 / pre-commit | - | なし | typecheck / lint / unused-detector |
|
|
96
|
+
| Unit | 純粋ロジック | 毎保存 / CI | 多 | なし | unit test runner |
|
|
97
|
+
| Integration | モジュール結合 | CI | 中 | 小 | test runner + testing-library |
|
|
98
|
+
| E2E | 主要導線 | CI(smoke は PR、full は nightly 等) | 少 | 小 | browser automation |
|
|
99
|
+
| DB-RLS | 権限境界 | CI | 中 | なし | SQL test framework |
|
|
100
|
+
| Monitoring | 本番異常 | 常時 | - | - | APM / synthetic / error tracker |
|
|
101
|
+
|
|
102
|
+
層を上に進むほど、コストが上がり、量が減る。これがピラミッドの形になる理由。
|
|
103
|
+
|
|
104
|
+
## よくある失敗
|
|
105
|
+
|
|
106
|
+
- **E2E 過多**: 安心感のために E2E を増やし、CI が 30 分超かかるようになる
|
|
107
|
+
- **Unit 過少**: 純粋関数を E2E で検証してしまう
|
|
108
|
+
- **DB-RLS 未検証**: フロントの表示制御だけで満足し、API 直叩きで漏洩
|
|
109
|
+
- **Monitoring 設定漏れ**: 本番デプロイ後の異常検知がなく、ユーザー報告で気づく
|
|
110
|
+
- **層を混ぜる**: 1 つのテストが「Unit + Integration + E2E」を兼ねて、失敗原因が不明
|
|
111
|
+
- **責務外のテスト**: Static で検出すべき型エラーを Unit テストで catch しようとする
|
|
112
|
+
- **flaky を放置**: 不安定 E2E を retry で誤魔化し、本物の障害を見逃す
|
|
113
|
+
- **テストを実装の鏡にする**: 仕様ではなく実装をテストして、リファクタで全部壊れる
|
|
114
|
+
|
|
115
|
+
## AI 駆動開発での適用
|
|
116
|
+
|
|
117
|
+
AI に「テストを書いて」と言うと、無意識に E2E や Integration に寄りがち。**責務を明示して指示**する。
|
|
118
|
+
|
|
119
|
+
### Unit を書かせる指示
|
|
120
|
+
```
|
|
121
|
+
このテストは Unit テストです。
|
|
122
|
+
- 外部依存(DB / API / 時刻)はモック化または注入
|
|
123
|
+
- 純粋関数として振る舞いを検証
|
|
124
|
+
- 1 ケース 1 アサート
|
|
125
|
+
- 同値分割と境界値を含める
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### E2E を書かせる指示
|
|
129
|
+
```
|
|
130
|
+
このテストは E2E です。
|
|
131
|
+
- 実ブラウザで操作
|
|
132
|
+
- API 失敗時の表示、二重送信防止、戻る操作を含める
|
|
133
|
+
- 主要導線(ログイン → 機能 X 利用)のみ
|
|
134
|
+
- 副次的なバリエーションは E2E で扱わず Integration へ
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### DB-RLS を書かせる指示
|
|
138
|
+
```
|
|
139
|
+
DB-RLS テストです。
|
|
140
|
+
- SQL level でテストを書く
|
|
141
|
+
- 他人のデータが見えないこと、書けないことの両方を検証
|
|
142
|
+
- role / user_id / tenant_id 等の境界を網羅
|
|
143
|
+
- 「フロントで弾いている」を理由に省略しない
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 形名参同との関係
|
|
147
|
+
|
|
148
|
+
各層の「名」(成功基準)の典型:
|
|
149
|
+
|
|
150
|
+
| 層 | 「名」の例 |
|
|
151
|
+
|---|---|
|
|
152
|
+
| Static | 型エラー 0、lint エラー 0、未使用 export 0 |
|
|
153
|
+
| Unit | 全テスト pass、カバレッジ 80%+(または閾値) |
|
|
154
|
+
| Integration | 主要結合シナリオの正常系・異常系の pass |
|
|
155
|
+
| E2E | 主要導線の smoke test pass |
|
|
156
|
+
| DB-RLS | 権限テスト全 pass、拒否ケース全カバー |
|
|
157
|
+
| Monitoring | エラーレート < 0.1%、p95 レイテンシ < SLO |
|
|
158
|
+
|
|
159
|
+
これらを「形」(実測値)と照合するのが [`formal-name-match.md`](./formal-name-match.md) の役割。
|
|
160
|
+
|
|
161
|
+
## 隣接する思想との関係
|
|
162
|
+
|
|
163
|
+
- [`formal-name-match.md`](./formal-name-match.md) — 各層で測定する「形」を「名」と照合する仕組み(形名参同)
|
|
164
|
+
- [`given-when-then.md`](./given-when-then.md) — 各層のテストケースを Given-When-Then で記述する方法
|
|
165
|
+
- [`qa-techniques.md`](./qa-techniques.md) — 各層に適用すべき QA 技法(境界値・状態遷移等)
|
|
166
|
+
|
|
167
|
+
## 出典
|
|
168
|
+
|
|
169
|
+
- Notion ページ: `35b68c677f4380bfa1ffeab248264e92` — テストフロー再設計(参照日 2026-05-13)
|
|
170
|
+
- 一次資料: The Practical Test Pyramid(Martin Fowler)、Testing Trophy(Kent C. Dodds)
|
|
171
|
+
- DB-RLS 層の補強: Supabase Testing Overview 公式ドキュメント(pgTAP 等の SQL レベル検証手段)。具体の pgTAP / InBucket テンプレートは `supabase-rls` プロファイル系の別 SPEC で扱う
|