---
session: S04
exercise: B-4
title: 修正して、動かして、テストを通す
duration: 20min
difficulty: 2
prerequisite: [B-3]
phases:
  1件目を直す: 6min
  2件目を直す: 5min
  テストを書いて通す: 7min
  Issue に結果を書く: 2min
files_to_edit:
  - kadaiB/src/main/java/com/example/equipment/service/EquipmentServiceImpl.java      # AI に修正させます
  - kadaiB/src/test/java/com/example/equipment/service/EquipmentServiceImplTest.java  # AI に新規作成させます
  - kadaiB/issues/ISSUE_001_詳細画面がエラーになる備品がある.md                        # 末尾に ## 修正結果 を追記します
  - kadaiB/issues/ISSUE_002_〈自分で付けた名前〉.md                                    # 同上
  - memo.md                                                                          # ## B-4 に気づきを書きます
hints: hints/step06_issue_driven.md
challenge: true
tags: [Agentモード, 差分レビュー, テスト, 回帰確認]
---

# 演習B-4 修正して、動かして、テストを通す

| 項目 | 内容 |
|---|---|
| 所要時間 | 20分 |
| 難易度 | 中 |
| 使うもの | Claude Code パネル（Agent モード）／ ターミナル ／ ブラウザ |
| 前提 | [B-3](exB3_issue.md) で `ISSUE_002_...` を起票していること |
| 次のステップ | [B-5 自分の Skill を作る](exB5_skill_creator.md) |

---

## 到達ゴール

このステップが演習Bの本体です。**次の3つがそろった状態**を目指します。

1. バグを **2件** 修正した
2. ブラウザで、修正前に壊れていた画面が正しく表示される
3. `./mvnw test` が `BUILD SUCCESS` で終わり、テストが2件以上ある

---

## 目的

Issue を根拠に修正させます。「なんとなく直った」で終わらせず、**直した根拠と、直った証拠**を残します。

証拠は2種類あります。1つは画面で見た結果です。人が目で見て確認します。もう1つはテストです。次に誰かが同じ場所を触ったときに、自動で確認されます。**画面の確認は今日の自分のため、テストは明日の他人のため**にあります。両方やります。

---

## 操作

### 1. Agent モードに戻す

Claude Code パネルの入力欄をクリックしてから <kbd>Shift</kbd>+<kbd>Tab</kbd> を押して、Plan モードを解除します。入力欄の下のモード表示が `plan` から変わったことを目で確認してください。ここからはファイルを書き換えます。

### 2. 1件目を修正させる

Issue のファイルを `@` で指して依頼します。ファイル名は途中まで打つと候補が出ます。

```
@kadaiB/issues/ISSUE_001_詳細画面がエラーになる備品がある.md を読んで、この Issue のとおりに修正してください。業務ルールは CLAUDE.md に従ってください。
```

### 3. 差分を目で読んでから受け入れる

変更の提案が出たら、**受け入れる前に、変更された行を読んでください。** 見るのは次の3点です。

- 変更されたファイルは、Issue の「発生箇所」に書いた場所と一致しているか
- 変更行数が、思っていたより多くないか（1つの Issue に対して、数行のはずです）
- Issue に書いていない箇所まで、ついでに整形されていないか

`CLAUDE.md` の `## 修正するときの決まり（課題B）` に「1つの Issue につき1つの修正にします」と書いてあります。ついでの整形が混ざっていたら、その場で戻すよう伝えてください。

```
Issue に書いていない箇所の変更は元に戻してください。この Issue の修正だけを残してください。
```

### 4. アプリを再起動する

Java のコードを変えたので、アプリを起動し直します。アプリを動かしているターミナルで <kbd>Ctrl</kbd>+<kbd>C</kbd> を押して止めてから、もう一度起動します。

```
./mvnw spring-boot:run
```

Windows PowerShell では `.\mvnw.cmd spring-boot:run` です。

### 5. ブラウザで直ったことを確認する

B-0 でエラーになった備品の詳細画面を、もう一度開いてください。**エラー画面が出ず、詳細が表示されれば成功です。**

あわせて、**壊れていなかった備品も1件開いてください。** 直した箇所が、元から正しかった表示を変えていないかを見ます。片方だけ見ると、直したつもりで別の場所を壊していることに気づけません。

### 6. 2件目を修正させる

同じ手順で、自分で起票した Issue を指して依頼します。

```
@kadaiB/issues/ISSUE_002_〈あなたが付けた名前〉.md を読んで、この Issue のとおりに修正してください。業務ルールは CLAUDE.md に従ってください。
```

再起動して、画面で確認します。2件目はエラーが出ないバグなので、**確認する場所を自分で決める必要があります。** 業務ルールに合った表示になっているかを、該当する備品で見てください。

### 7. テストを書かせる

2件とも直ってから、まとめて依頼します。

```
いま直した2件について、二度と同じ壊れ方をしないことを確認するテストを src/test/java の下に作ってください。テストの名前は何を確かめているかがわかるようにし、日本語のコメントを添えてください。
```

`kadaiB/src/test/java/com/example/equipment/service/EquipmentServiceImplTest.java` が作られます。中身を開いて、**どのテストがどのバグに対応しているかが読み取れるか**を確認してください。読み取れない場合は、コメントを足すよう頼みます。

### 8. テストを実行する

アプリを動かしているのとは**別のターミナル**を開きます（VSCode のターミナル右上にある、四角が2つに割れたアイコンが分割ボタンです）。`kadaiB` フォルダに移動して実行します。

```
./mvnw test
```

Windows PowerShell では `.\mvnw.cmd test` です。

ここで動くテストは3種類あります。**このうち2つは、あなたが書いたものではありません。**

| テストクラス | 誰が用意したか | 何を見ているか |
|---|---|---|
| `EquipmentApplicationTests` | 配布時から入っています | アプリが起動できること |
| `EquipmentAcceptanceTest` | 配布時から入っています | 業務ルールに沿った動きになっているか。**配布時点では意図的に失敗します** |
| `EquipmentServiceImplTest` | 手順7であなたが書かせたもの | 直した2件が二度と壊れないこと |

`EquipmentAcceptanceTest` が到達基準の判定役です。**中身はまだ開かないでください。** 開くと、どこが壊れているかの答えが書いてあります。

最後に `BUILD SUCCESS` と出れば緑です。`BUILD FAILURE` と出た場合は次へ進みます。

### 9. 落ちたテストを直す

まず、**どのテストが落ちたかを名前で確認します。** ターミナルの出力から、次の形の行を探してください。

```
[ERROR] Failures:
[ERROR]   EquipmentAcceptanceTest.在庫が5個ちょうどの備品は要補充と判定される ...
```

日本語の部分がテストの名前です。**この名前が、まだ直っていない業務ルールを指しています。** `EquipmentAcceptanceTest` が落ちている場合は、自分が選んだ2件のほかにも、業務ルールに反している箇所が残っているという意味です。その名前を手がかりに、もう1件直してください。手順は B-3 と B-4 の繰り返しです（`ISSUE_003_...` として起票します）。

`EquipmentServiceImplTest`（自分で書かせたテスト）が落ちている場合は、テストのほうが間違っていることもあります。次に進んでください。

失敗したときのターミナルの出力を**そのままコピーして貼り付け**、依頼します。

```
このテストが落ちています。原因を調べて直してください。

（ここに出力を貼り付ける）
```

貼るのは、`Tests run:` と `FAILURE` が含まれるあたりから、その下の詳細までです。全部貼っても問題ありません。

緑になるまで繰り返します。**テストのほうが間違っている場合もあります。** その場合は、テストを直すのか実装を直すのかを、業務ルールに戻って判断してください。

### 10. Issue に修正結果を追記する

修正した2つの Issue ファイルの末尾に、次の見出しを足します。

```
## 修正結果

- 変更したファイル: 〈パス〉
- 変更内容: 〈1行から2行〉
- 確認方法: 〈画面のどこを見て確認したか〉
- テスト: 〈テストのクラス名とメソッド名〉
```

AI に書かせてもかまいませんが、**確認方法の欄は自分の操作を書いてください。** 実際に見た画面のことです。

---

## 自分で考える

手順7で「二度と同じ壊れ方をしないことを確認する」と頼みました。

**もし「テストを書いて」とだけ頼んだら、何のテストが出てきたと思いますか。**

おそらく、正常に動く場合のテストが並んだはずです。壊れていた条件を狙ったテストにはなりません。**何を確かめたいかを言葉にすると、出てくるものが変わります。** これはテストに限らず、AI に何かを頼むとき全般に当てはまります。

`memo.md` の `## B-4` に、依頼の言い方を変えたことで結果が変わった経験を1行書いてください。

---

## 生成物の名前と場所

- `handson/kadaiB/src/main/java/com/example/equipment/service/EquipmentServiceImpl.java`（修正）
- `handson/kadaiB/src/test/java/com/example/equipment/service/EquipmentServiceImplTest.java`（新規作成）
- `handson/kadaiB/issues/ISSUE_001_詳細画面がエラーになる備品がある.md`（末尾に `## 修正結果` を追記）
- `handson/kadaiB/issues/ISSUE_002_〈自分で付けた名前〉.md`（同上）
- `handson/memo.md` の `## B-4`

修正の対象が `EquipmentServiceImpl.java` 以外に及んだ場合は、その理由を Issue の修正結果に書いてください。

---

## OK基準

- バグを **2件** 修正した
- ブラウザで、修正前にエラーになっていた画面が正常に表示される
- 元から正しく動いていた画面が、壊れていない
- `./mvnw test` が `BUILD SUCCESS` で終わる
- 自分で追加したテストが **2件以上** あり、どちらのバグに対応するかがコメントでわかる（配布時から入っている `EquipmentAcceptanceTest` の件数は数えません）
- 2つの Issue に `## 修正結果` が追記されている

`BUILD SUCCESS` にならないまま時間切れになった場合は、**修正2件と画面での確認までで到達**とします。残っている失敗の名前を `memo.md` の `## B-4` に控えて、次に進んでください。

---

## 追加と考察

修正した箇所は、2件とも `EquipmentServiceImpl.java` の中にありました。画面が崩れていたので `templates/` の HTML を疑った方や、URL の処理なので `EquipmentController.java` を疑った方もいると思います。実際には、**判断をしている場所はサービス層に集まっています。**

このプロジェクトの層は次のように分かれています。

```
controller → service → repository → model
（画面の受け口）（判断）（データの出し入れ）（データの形）
```

「在庫が5個以下かどうか」「備考が空のときどう表示するか」は、どちらも判断です。だから service にあります。**どこを疑うかを絞れると、AI に渡す範囲も絞れます。** 範囲が絞れると、読ませる量が減り、返答も速く正確になります。

もう1点、テストを書いた効果はこの場では見えません。効くのは次に誰かが同じメソッドを触ったときです。今日の20分で書いたテストが、半年後の誰かの30分を守ります。**AI に書かせると、この「あとで効く作業」の費用が下がります。** 従来は時間がないと真っ先に削られていた部分です。

---

## 発展課題

**3件目のバグを自力で探してください。** ヒントは出しません。

始め方は B-2 と同じです。画面・データ・`CLAUDE.md` の業務ルールの3つを突き合わせます。業務ルールは5項目あります。そのうち2項目は今日直しました。残り3項目のうち、守られていないものがあるかを1つずつ確かめてください。

見つけたら、`ISSUE_003_...` を起票し、修正し、テストを足すところまでやってみてください。手順は B-3 と B-4 の繰り返しです。

さらに余裕があれば、`/regression-check` を実行してください。

```
/regression-check
```

`kadaiB/issues/` にあるすべての Issue をなぞり直し、`./mvnw test` を実行して、結果を1枚の表にまとめます。演習Aの `/selfcheck` と同じで、**確認の手順そのものをコマンドに固定してある**例です。結果は `.work/B_regression.md` に残ります。

3件目のバグ探しは、[challenges/ch05_third_bug.md](challenges/ch05_third_bug.md) に詳しい進め方があります。

---

## 詰まったときは

**`./mvnw test` で `No tests to run` と出る**

テストファイルが正しい場所に作られていません。`kadaiB/src/test/java/com/example/equipment/` の下にあるか確認してください。置き場所が違うと実行されません。

**アプリを止めずにテストを実行して、ポートのエラーが出た**

テストの種類によっては、アプリと同じポートを使おうとします。アプリを <kbd>Ctrl</kbd>+<kbd>C</kbd> で止めてから、もう一度 `./mvnw test` を実行してください。

**修正したのに画面が変わらない**

アプリを再起動していない可能性が高いです。ターミナルで <kbd>Ctrl</kbd>+<kbd>C</kbd> を押して止め、起動し直してください。それでも変わらない場合は、ブラウザの再読み込みを強制で行ってください（<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>、Mac は <kbd>Cmd</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>）。

**直したはずの箇所で、別の画面が壊れた**

1つの修正が他に影響しています。何を変えたかを聞き直してください。

```
いまの修正で変更したファイルと行をすべて挙げ、それぞれが影響する画面を教えてください。
```

**テストが延々と直らない（3回以上落ちる）**

いったん止めて、テストの中身を読んでください。**何を確かめようとしているテストなのか**が読み取れない場合、テスト自体が間違っています。1件に絞って書き直させてください。

```
このテストは何を確かめるためのものですか。1文で説明してください。説明できないなら、確かめたいことを1つに絞って書き直してください。
```

**時間が足りない**

優先順位は「2件の修正 → 画面での確認 → テスト」です。テストが1件しか書けなくても、修正と確認が終わっていれば到達しています。挙手してください。
