テスト・レビュー学習記事全11節Verify

重複・入れ違い・想定利用量のリスクを、実行できる範囲で確認する

この記事で身につくこと許可されない操作、重複、途中失敗、同時更新、想定利用量に対する振る舞いを確かめる目的を、承認と差戻しの例で説明できる。

記事内目次(25項目)
この記事の管理情報(該当工程・関連要件・成果物の閲覧と保存・実行記録)
記事ID
09-03
該当工程
09-03 例外・権限・同時操作・負荷を確認する(関連:09-02、05-02、05-03、04-04、09-01、08-04)
関連要件
REQ-002、REQ-003、REQ-006、REQ-007
到達目標
許可されない操作、重複、途中失敗、同時更新、想定利用量に対する振る舞いを確かめる目的を、承認と差戻しの例で説明できる
主要な成果物
確認環境と検証状況
本文のコードは examples/09-03-risk-tests/ を正本とし、Claude Codeが2026-09-20にローカルで実行して stdout・stderr・終了コードを記録済み(macOS 26.6.2、Node.js v24.18.0)。ただし本格的な同時アクセス・負荷は未検証。人による実読・内容確認は未実施。
未検証の範囲
実際の複数プロセス・複数利用者による同時アクセス、本番相当の利用量に対する負荷試験、状態条件以外の壊れ方に対する検出力は、この記事の時点では確認していない。
実行記録

正本の原稿にある管理表(記事ID・先に読むと理解しやすい記事・成果物パス・最終更新日など)は、この下の本文冒頭に「原稿の管理表」として開閉できる形で残しています。

原稿の管理表(13項目:記事ID・カテゴリ・要件ID・先に読むと理解しやすい記事・成果物パス・対象ツール・検証状況・最終更新日など)
管理項目内容
記事ID09-03
主な中カテゴリ09-03 例外・権限・同時操作・負荷を確認する
関連中カテゴリ09-02、05-02、05-03、04-04、09-01、08-04
関連要件IDREQ-002、REQ-003、REQ-006、REQ-007
先に読むと理解しやすい記事09-02(AIの実装を業務の流れで検証する、SAMPLE-B)、09-01(個々の処理を確認する)を読んでいると理解しやすい。未読でも本文で必要な内容は説明する
到達目標許可されない操作、重複、途中失敗、同時更新、想定利用量に対する振る舞いを確かめる目的を、承認と差戻しの例で説明できる
3層の配置理解する=第3〜4節/作って確かめる=第5〜7節/設計を判断する=第8節
成果物パスtemplates/09-03-risk-tests_template.md、templates/09-03-risk-tests_example.md、examples/09-03-risk-tests/(storage_guard.js、run_duplicate.js、run_resubmit_guard.js、run_repeat_scale.js、run_mutation_check.js)、evidence_public/phase5b1-2026-09-20/09-03/run_log.md
出典第11節参照
対象ツール・バージョン教材演習用にNode.js v24.18.0(node:fs、node:pathのみ使用)
検証状況本文のコードは examples/09-03-risk-tests/ を正本とし、Claude Codeが2026-09-20にローカルで実行して stdout・stderr・終了コードを記録済み(第6〜7節、evidence_public/phase5b1-2026-09-20/09-03/run_log.md)。ただし本格的な同時アクセス・負荷は未検証(第7・8節)。人による実読・内容確認は未実施
残課題第11節参照
最終更新日2026-09-20(新規作成。同日、Phase 5B-1:Verify型のPilotとして、読む順路・第3.3節「PASSで分かること・分からないこと」・第4節の判断項目・第5.4節「テストの検出力を確かめる」(run_mutation_check.js、新規)・第7節の確かめたこと・確かめていないこと・第8.3節「AIにテスト生成を任せるときの注意」を追加し、実行結果を再実行の実測に置き換えた。確認の範囲・完了条件・既存3スクリプトは不変)

この記事の会社・人物・データはすべて架空の設定です。実在する会社や案件とは関係ありません。本文のコードは examples/09-03-risk-tests/ の正本と同じもので、実行結果は2026-09-20にローカル環境で実際に実行して記録したものです(第6〜7節、実行記録は第9節)。この記事の「同時に起きる場合」の確認は、実際の同時アクセスを再現したものではなく、保存先の状態条件を順番に呼び出して確かめた独立した小さなテストです(第5節)。想定利用量は教材上の仮定であり、実際の利用量ではありません(第8.2節)。

この記事は何の話か。同じ承認操作が二重に届く場合と、承認者の承認と依頼者の再提出が入れ違う場合について、保存先の状態条件で防げるかどうかを確認し、その確認が何を証明していて何を証明していないかを書き分け、実行できない項目は未検証と明記する話です。

なぜ必要か。09-02までの確認は、1件の操作を1回だけ行う場面が中心でした。実際の業務では、操作が重複して届いたり、複数の操作が入れ違ったりする場面があり、それに対する振る舞いを確かめておく必要があります。同時に、「テストが全部通った」は「安全だ」と同じではありません。通ったテストが何を見ていて、何を見逃すかを知らないと、確認していないことを確認済みとして次の工程に渡してしまいます。

この記事を読むとできるようになること。

  • 許可されない操作、重複、途中失敗、同時更新、想定利用量に対する振る舞いを確かめる目的を説明できる
  • 重複・入れ違いの場面について期待する結果を定めて確認し、「PASSで分かること・分からないこと」を分けてリスク別の検証結果に記録できる
  • テストの検出力(壊れたときに本当に失敗するか)を確かめ、確認する範囲を失敗の影響と確認費用から判断して、確かめない項目とその理由を書ける

読む順路。この記事は3つの深さで読めます。全部を順に読む必要はありません。

  • 基本だけ理解する:第1節→第3節(4つのリスクと、PASSで分かること・分からないこと)→第4節(判断すること)→第6節の表(リスク別の検証結果)→第7節の「確かめていないこと」→第9節。コードを読まなくても、何を確かめ、何を確かめていないかが分かります。
  • 作って確かめる:上に加えて第5.1〜5.3節(重複・入れ違い・繰り返しのコード)→第5.4節(テストの検出力を確かめる)→第6節の実行結果→第7節。
  • 設計判断を深める:上に加えて第8節(状態条件で防げること・防げないこと、確認する範囲の判断、AIにテスト生成を任せるときの注意)。

1. 今回の業務課題と完成するもの

この記事でやることは、同じ承認操作が二重に届く場合と、承認者の承認と依頼者の再提出が入れ違う場合について、期待する結果を定めて実行できる範囲で確認し、リスク別の検証結果に記録することです。あわせて、想定利用量に対する小規模な繰り返し確認と、テストの検出力の確認も行います。

09-02(SAMPLE-B)では、正常・無権限・自己承認・対象外状態・重複依頼の5系統を確認しましたが、複数の操作が入れ違う場面はまだ扱っていませんでした。記事Bの確かめていないことの表には「2人の承認者が同時に操作したとき」が「09-03で」と書かれています。この記事はその項目を引き受けますが、本格的な同時操作の再現ではなく、保存先の状態条件が働くことの確認までを行います。

この記事を読み終えると、次のものが手元にできます。

  • 重複・入れ違い確認、小規模な繰り返し確認、検出力確認のコード(examples/09-03-risk-tests/)
  • リスク別の検証結果(リスク、場面、期待結果、確認方法、結果、実行済み/未検証、関連要件ID)

2. 前提知識と読む順路

この記事で使う言葉を先に説明します。

重複

一言でいうと、同じ操作の指示が2回以上届くことです。たとえば、画面の二重クリックや、通信の再送によって、同じ承認操作が2回届く場合があります。

同時更新

一言でいうと、複数の操作がほぼ同時に、同じ対象に対して行われることです。たとえば、承認者が承認する操作と、依頼者が再提出する操作が入れ違う場合です。

状態条件つきの更新

一言でいうと、「更新前の状態が期待どおりのときだけ更新する」という条件を付けた更新方法です。この記事では、実際の同時アクセスを再現する代わりに、この条件が正しく働くかを確認します。

これがないと、1回だけ操作した場合は正しく動いても、操作が重複したり入れ違ったりした場合に、意図しない状態になる可能性に気づけません。

テストの検出力

一言でいうと、実装が壊れたときに、テストが本当に失敗してくれるかどうかです。

たとえば、状態条件を削った実装に対して重複のテストを実行し、「想定外の結果」と判定されれば、そのテストには検出力があります。「期待どおり」と判定されてしまえば、そのテストは壊れていても通ってしまう、見た目だけのテストです。

これがないと、「テストが通った」が「実装が正しい」ことの証拠にならず、AIが書いたテストをAIが通す、という構図に気づけません(記事B)。

読む順路:業務の流れでの検証は09-02、状態遷移は05-02、権限は05-03、例外時の画面は04-04が該当します。この記事の検証結果は、09-04のレビュー、10-04の利用開始判定で使います。

3. 理解する:確認する4つのリスク

3.1 権限・重複・途中失敗・同時更新

リスク内容この記事での扱い
権限割当外・自己承認の操作が許可されてしまう09-01・09-02で確認済み。この記事では結果を引用する
重複同じ操作が二重に届くこの記事で新たに確認する(第5.1節)
途中失敗一部の保存だけ成功し、残りが失敗する08-04で確認済み。この記事では結果を引用する
同時更新複数の操作が入れ違うこの記事で新たに確認する(第5.2節)

3.2 よくある誤解

「同時操作の確認は、実際に複数のプログラムを同時に動かさないとできない」。本格的な同時アクセスの再現は準備の負荷が大きいため、この記事では保存先の状態条件(更新前の状態が期待どおりかどうか)を順番に呼び出して確認します。これは同時操作の再現ではなく、条件が正しく働くかどうかの確認です(設計書ADDENDUM §2と同じ考え方)。

「繰り返し実行できれば、負荷試験をしたことになる」。この記事で行う繰り返し確認は、架空データ50件をエラーなく処理できるかどうかの小規模な確認であり、本番相当の利用量・同時アクセス数に対する負荷試験ではありません(第6節・第8.2節)。

「テストが全部PASSしたら、正しいことが証明された」。テストは、書いた期待結果の範囲だけを確かめます。何を証明したかは、テストが何を見ているかで決まります(第3.3節)。

3.3 PASSで分かること・分からないこと

結論から言うと、この記事のテストがPASSして分かるのは「保存先の状態条件は、順番に呼ばれたときに働く」ことだけです。

みらい業務サービスの例で言うと、鈴木さんが承認ボタンを二度押しし、2つ目の操作が1つ目の直後に届いた場合、2つ目は更新されません。これは確かめます。しかし、2つの操作が本当に同じ瞬間に届き、両方が「まだ提出済みだ」と読んでから両方が書き込む、という場面は、この記事の方法では起きません。順番に呼んでいるからです。

テスト何を証明したいかPASSで分かることPASSしても分からないこと
重複(第5.1節)同じ承認が2回届いても、2回目は反映されない状態条件が、2回目の呼び出しを拒否すること2つの操作が同時に「提出済み」を読んだ場合に、片方だけが書き込めるか(本物の競合)
入れ違い(第5.2節)承認済みになった後の再提出は反映されない状態条件が、状態の変わった後の操作を拒否すること承認と再提出が同じ瞬間に届いた場合の結果。画面から届く再提出の扱い(画面は未実装)
繰り返し(第5.3節)架空データ50件をエラーなく処理できる50件でエラーが出ないこと本番相当の件数・同時利用者数での性能。50件の所要時間は環境依存で、性能の指標ではない
検出力(第5.4節)状態条件を削ったら、重複のテストが失敗する重複のテストが、状態条件の欠落を検知できること他の壊し方(別の条件の欠落、履歴の書き忘れなど)を検知できるか

この表の右の列が、第7節の「確かめていないこと」の元になります。テストを書くときは、左の「何を証明したいか」を先に決め、右の「分からないこと」を同じ重さで残します。

順に試すことと、同時は別。この演習:順に呼び出す:1回目に更新 → 2回目は拒否、変わった後の状態条件を確認。未検証:同時に読み取る:2つの操作が同じ状態を読む、本物の競合・排他制御は別の確認。繰り返し回数だけでは、負荷試験にならない。

4. 判断すること

この検証で人が判断することは、次の5つです。

4.1 この記事で判断すること

判断することなぜ判断が必要か仮置きしてよいか間違えた場合の影響
何を証明したいか(テストの目的)目的が無いテストは、通っても何が分かったのか説明できない(第3.3節)不可。第3.3節の表を実行前に決める通ったテストの数だけが残り、「同時操作は確認済み」と誤って引き継がれる
期待結果をどこから取るか実装から取ると、実装の出力を追認するだけになる不可。05-02の状態遷移表と、記事AのAC-008(重複)から取る実装が壊れていても、壊れた出力を期待結果にしてPASSする
同時操作を再現するか、状態条件の確認で代えるか再現には複数プロセスと排他制御の準備が要る。確認費用と失敗の影響で決める可(初版は状態条件の確認で代え、「同時操作は未検証」と書く。設計書ADDENDUM §2)「未検証」と書かずに代えると、10-04の判定材料が実際より良く見える
テストの検出力をどこまで確かめるか検出力を確かめないテストは、壊れても通る可能性がある可(この記事では、最も重要な条件(状態条件)を削った1通りだけ確かめる。他の壊し方は未確認と書く)検出力のないテストのPASSを、安全の根拠にしてしまう
AIに任せる範囲テストの実行・結果の整理・修正案はAIに任せられるが、期待結果と「何を証明したいか」は人が決める(第8.3節)—AIが書いたテストをAIが通し、人が期待結果を見ていない状態で「全件PASS」が報告される

4.2 勝手に決めてはいけないこと

  • 実際の同時アクセスを再現したかのように書きません。保存先の状態条件の確認であることを明記します。
  • 実際の本番利用量(利用者数、同時アクセス数など)を、確認済みの事実として書きません。架空の仮定として扱います。
  • 期待結果を、実装の出力に合わせて書き換えません。
  • 検出力を確かめた1通りの結果を、「このテストはどんな壊れ方も検知できる」に広げません。

4.3 AIに任せる範囲

テストコードの下書き、実行、結果の整理、失敗したときの原因の説明はAIに任せられます。しかし、何を証明したいか(第3.3節)、期待結果(第4.1節)、同時操作を再現するかどうかの判断、検出力の確認結果をどう読むかは人が決めます。AIに「テストを書いて通して」とだけ頼むと、通るテストは書けますが、何を証明したかは残りません(第8.3節)。

5. 作って確かめる:重複と入れ違いを確認する

5.1 重複した承認操作の確認

// examples/09-03-risk-tests/storage_guard.js(抜粋)
// 更新前の状態がexpectedStateと一致する場合だけ状態を変更し、更新できたかどうかを返す。
// 一致しない場合は更新せず { updated: false } を返す(保存先の条件チェックのみ。同時操作の再現ではない)。
function changeStateIfExpected(id, expectedState, nextState, actor, action) {
  const db = loadDb();
  const req = db.requests.find((r) => r.id === id);
  if (!req || req.state !== expectedState) {
    return { updated: false, currentState: req ? req.state : null };
  }
  req.state = nextState;
  db.history.push({ requestId: id, action, actor, at: new Date().toISOString() });
  saveDb(db);
  return { updated: true, currentState: nextState };
}
// examples/09-03-risk-tests/run_duplicate.js(抜粋)
console.log("=== 1回目の承認操作(先に届いた想定) ===");
const first = changeStateIfExpected("REQ-0004", "提出済み", "承認済み", "鈴木", "承認");
console.log("=== 2回目の承認操作(同じ操作が二重に届いた想定) ===");
const second = changeStateIfExpected("REQ-0004", "提出済み", "承認済み", "鈴木", "承認");

期待結果は、実装より先に記事AのAC-008(同じ承認を2回しても効果は1回分)から決めています。run_duplicate.js は末尾で first.updated && !second.updated を判定し、満たせば「期待どおり」、満たさなければ「想定外の結果」と表示します。この判定が第5.4節の検出力確認の対象です。

5.2 承認と再提出が入れ違う場合の確認

// examples/09-03-risk-tests/run_resubmit_guard.js(抜粋)
console.log("=== 承認者の承認が先に反映された想定 ===");
const approve = changeStateIfExpected("REQ-0005", "提出済み", "承認済み", "鈴木", "承認");
console.log("=== 依頼者が(承認と入れ違いで)再提出を試みた想定 ===");
const resubmit = changeStateIfExpected("REQ-0005", "提出済み", "提出済み", "佐藤", "再提出");

5.3 小規模な繰り返し確認(負荷試験ではない)

// examples/09-03-risk-tests/run_repeat_scale.js(抜粋)
const COUNT = 50; // 教材上の仮定:小規模な繰り返し確認用の件数(本番の想定利用量ではない)
const start = Date.now();
for (let i = 1; i <= COUNT; i++) {
  createRequest({ id: `REQ-BULK-${String(i).padStart(3, "0")}`, requester: "佐藤", approver: "鈴木" });
}
const elapsedMs = Date.now() - start;

5.4 テストの検出力を確かめる

第5.1節のテストが「状態条件が壊れたら本当に失敗するか」を確かめます。記事Bと同じ考え方で、正本の storage_guard.js をこのフォルダ直下の work-mutation/ にコピーし、状態条件の行をわざと削った版を作って、重複の場面を実行します。壊した版は正本に混ぜず、終了時に削除します。

// examples/09-03-risk-tests/run_mutation_check.js(抜粋)
const guardLine = "if (!req || req.state !== expectedState) {";
const mutated = original.replace(guardLine, "if (!req) { // 故意の誤変更:状態条件を削除(説明用)");
fs.writeFileSync(path.join(WORK, "storage_guard.js"), mutated);

const { createRequest, changeStateIfExpected, DB_FILE } = require(path.join(WORK, "storage_guard.js"));
createRequest({ id: "REQ-0004", requester: "佐藤", approver: "鈴木" });
const first = changeStateIfExpected("REQ-0004", "提出済み", "承認済み", "鈴木", "承認");
const second = changeStateIfExpected("REQ-0004", "提出済み", "承認済み", "鈴木", "承認");

const testPassed = first.updated && !second.updated; // run_duplicate.js と同じ判定

期待結果は「壊した版では testPassed が false になる(テストが失敗する)」です。もし壊した版でも true になれば、第5.1節のテストは状態条件の欠落を見逃す、見た目だけのテストだと分かります。

6. 実行結果(リスク別の検証結果)

examples/09-03-risk-tests/ で実行した stdout と終了コードです(整形・省略なし。stderr への出力はありませんでした。所要時間は実行のたびに変わります)。

$ node run_duplicate.js
=== 1回目の承認操作(先に届いた想定) ===
結果: {"updated":true,"currentState":"承認済み"}
=== 2回目の承認操作(同じ操作が二重に届いた想定) ===
結果: {"updated":false,"currentState":"承認済み"}

期待どおり:2回目は更新されなかった(重複を防止)
終了コード: 0
$ node run_resubmit_guard.js
=== 承認者の承認が先に反映された想定 ===
結果: {"updated":true,"currentState":"承認済み"}
=== 依頼者が(承認と入れ違いで)再提出を試みた想定 ===
結果: {"updated":false,"currentState":"承認済み"}

期待どおり:承認済みになった後の再提出は防止された
終了コード: 0
$ node run_repeat_scale.js
作成件数: 50件(想定: 50件)
所要時間: 6ms
この確認は小規模な繰り返しの動作確認であり、負荷試験ではない。
終了コード: 0
$ node run_mutation_check.js
=== 故意に状態条件を削った版に対して、同じ承認操作を2回届ける ===
1回目: {"updated":true,"currentState":"承認済み"}
2回目: {"updated":true,"currentState":"承認済み"}

検出できた:壊した版ではテストが「想定外の結果」と判定した(状態条件の欠落を見つけられる)
終了コード: 0

壊した版では2回目も updated: true になり、第5.1節の判定(first.updated && !second.updated)は false になりました。つまり、状態条件を削ると重複のテストは失敗します。このテストには、少なくとも「状態条件の欠落」に対する検出力があります。

リスク場面期待結果確認方法結果実行済み/未検証
権限割当外・自己承認の操作承認できない09-01・09-02のテストケース期待どおり(09-01・09-02参照)実行済み
重複同じ承認操作が二重に届く2回目は更新されない状態条件つき更新を2回連続で呼び出す期待どおり(第6節)実行済み(状態条件の確認。同時アクセスの再現ではない)
途中失敗状態変更後に履歴の記録が失敗する部分失敗として扱われる08-04の修正済みコード期待どおり(08-04参照)実行済み
同時更新承認と再提出が入れ違う承認済み後の再提出は防止される状態条件つき更新を順に呼び出す期待どおり(第6節)実行済み(状態条件の確認。同時アクセスの再現ではない)
想定利用量架空データ50件の繰り返し処理エラーなく完了する繰り返し実行し所要時間を記録50件・6ms(第6節。所要時間は環境依存)実行済み(小規模な繰り返し確認。負荷試験ではない)
検出力状態条件を削った版に対する重複のテストテストが失敗する正本のコピーを故意に壊して重複の場面を実行検出できた(第6節)実行済み(壊し方1通りのみ)

7. 確認結果

実行環境:macOS 26.6.2、Node.js v24.18.0(node:fs、node:pathのみ使用)、2026-09-20に実行。教材演習用のローカルファイルのみを使い、実際の複数プロセス・複数利用者による同時アクセスは行っていません。stdout・stderr・終了コードをそのまま記録した実行記録は第9節の run_log.md にあります。

完了条件との照合:

完了条件確認結果
権限・重複・途中失敗・同時更新の4系統がある第3.1節・第6節の表に記載
未検証項目に理由と今後の確認方法がある本節の表、第8.2節に記載
想定利用量が架空の仮定と表示されている冒頭の注記、第5.3節・第6節・第8.2節に記載

この確認で確かめたこと:保存先の状態条件が、順番に呼ばれた重複・入れ違いの操作を拒否すること。架空データ50件の作成がエラーなく完了すること。状態条件を削ると重複のテストが失敗すること(検出力)。

この確認で確かめていないこと:

範囲理由どこで確かめるか
実際の複数プロセス・複数利用者による同時アクセス(本物の競合)教材演習用のローカル環境では安全に再現する準備が大きい。順番に呼び出す方法では、2つの操作が同時に「提出済み」を読む状況は起きない実際のデータベースを使う実装に進んだ段階で、排他制御機能(トランザクション分離レベルなど)を使って確認する
本番相当の利用量・同時アクセス数に対する性能(負荷試験)本番の利用量自体が架空の仮定であり、実測する対象が定まっていない利用開始が近づいた段階で、想定利用量を業務担当者と確認したうえで検討する(10-04)
画面から届く重複・再提出画面が未実装。関数を直接呼んでいる画面実装後の通し検証(10-01)
状態条件以外の壊れ方に対する検出力検出力の確認は「状態条件の削除」1通りだけ他の壊し方(履歴の書き忘れ、操作者の取り違え)は記事Bの4種を参考に追加を検討
差戻し・再提出の重複テストを用意していない(記事Bでも未検証)追加を検討

この4件が通ったことは、保存先の状態条件がこの4場面で期待どおりに働くことの証拠です。同時アクセスに対してアプリが安全であることの証拠ではありません。この記事の本文はClaude Codeが作成したもので、業務担当者による内容確認は行っていません。

8. 設計を判断する

8.1 保存先の状態条件で防げること・防げないこと

防げること防げないこと
同じ操作が二重に届いた場合の、2回目の反映実際の複数プロセスが同時に読み書きした場合の競合(この記事の方法では再現していない)
状態が変わった後の、条件に合わない操作の反映ネットワークの遅延やタイミングによって生じる、より複雑な入れ違いのパターン

保存先の状態条件は、多くの重複・入れ違いを防ぐ効果がありますが、本格的な同時アクセスの安全性を保証するものではありません。「読んでから書く」の間に別の操作が割り込む隙を塞ぐには、保存先側の排他制御(記事Bの「保存先」の行)が要ります。

8.2 確認する範囲を、失敗の影響と確認費用から判断する

項目判断
本格的な同時アクセスの再現確認費用(環境準備、再現の難しさ)が大きく、初版では行わない。データベースを使う実装に進んだ段階で再検討する
負荷試験想定利用量(架空の仮定)自体が確定していないため、初版では行わない。利用開始が近づいた段階で業務担当者と確認する
状態条件つき更新の確認(この記事で実施)確認費用が小さく、重複・入れ違いの多くの場面を防ぐ効果があるため、初版で実施する
検出力の確認(この記事で実施、1通り)確認費用が小さく(正本のコピーを壊すだけ)、「テストが見た目だけでない」ことを示せるため、初版で実施する。壊し方を増やすかは、テストが増えた段階で判断する

想定利用量は教材上の仮定であり、実際の業務における利用者数・同時アクセス数は、この記事の時点では確認していません。

8.3 AIにテスト生成を任せるときの注意

AIにテストを書かせるのは有効ですが、次の3点は人が持ちます。

観点AIに任せるとどうなりやすいか人が持つこと
期待結果実装を読んで、その出力を期待結果にしたテストを書く。実装が壊れていても通る期待結果は要件(05-02、記事AのAC)から先に決めて渡す
何を証明したいか「重複のテスト」という名前は付くが、同時操作を確認したかのように読める報告になる第3.3節の「PASSで分かること・分からないこと」を人が書く
検出力AIが書いたテストをAIが実行して「全件PASS」と報告する。壊したら失敗するかは確かめない最も重要な条件を1つ削って、テストが失敗することを確かめる(第5.4節)

AIの「全件PASSしました」は、AIが書いた範囲のテストが通ったという意味です。何を証明したかと、何を証明していないかは、テストの数からは分かりません。

8.4 適用限界

この記事の確認は、教材演習用のローカルファイルを保存先にした小さな例に対するものです。実際のデータベースを使う実装、複数の利用者が同時に使う環境では、確認の方法(排他制御、負荷試験)も結果も変わります。

9. 持ち帰る成果物

成果物空欄版記入例
リスク別の検証結果ひな形(リスク、場面、期待結果、確認方法、結果、実行済み/未検証、関連要件ID)templates/09-03-risk-tests_template.mdtemplates/09-03-risk-tests_example.md
重複・入れ違い・繰り返し・検出力確認コード一式examples/09-03-risk-tests/(storage_guard.js、run_duplicate.js、run_resubmit_guard.js、run_repeat_scale.js、run_mutation_check.js)同上
実行記録(stdout・stderr・終了コード、整形なし)—evidence_public/phase5b1-2026-09-20/09-03/run_log.md

自分の業務に使うときの手順は次のとおりです。

  1. 権限・重複・途中失敗・同時更新の4系統について、何を証明したいかと期待する結果を決める(第3.3節・第4.1節)
  2. 実行できる範囲(保存先の状態条件など)で確認し、結果を記録する
  3. 最も重要な条件を1つ削って、テストが失敗することを確かめる(第5.4節)
  4. 実行できない項目は未検証と書き、理由と今後の確認方法を添える
  5. 想定利用量を架空の仮定として明記し、確認する範囲を判断する

10. 次工程への受渡し

次へ渡すもの:リスク別の検証結果(実行済み6件、未検証5件の表)。

次工程での使われ方:09-04(第三者の視点でレビューする)では、この検証結果をレビュー観点の1つとして使います。10-04(利用開始の可否を判断する)では、この検証結果を判定材料の1つとして使い、「本格的な同時アクセス・負荷が未検証」は実業務導入前に確認する未解決問題として扱われています。

前工程へ戻る条件:この検証結果が05-02・05-03の設計と食い違う場合は、それぞれの記事に戻って確認します。検出力の確認でテストが壊れた版でも通ってしまった場合は、テストの期待結果を記事Aの受入条件と照合し直します。

11. 根拠と更新情報

  • この記事の会社・人物・データはすべて架空の設定です。
  • 「同時操作の本格的な検証・実装は行わない」「保存先の状態条件を、独立した小さなテストで確認する」という考え方は、教材設計書PHASE1_REVISION_ADDENDUM.md第2節に基づきます。
  • テストの検出力を故意の誤変更で確かめる方法は、記事Bの mutation_check.py と同じ考え方です。この記事では壊し方を1通りに絞っています。
  • 権限の確認結果は09-01・09-02、途中失敗の確認結果は08-04を引用しています。
  • 制作の来歴:本文はClaude Codeが作成しました。第5〜6節のコードは examples/09-03-risk-tests/ を正本とし、2026-09-20にmacOS 26.6.2・Node.js v24.18.0の環境で実際に実行して、stdout・stderr・終了コードを evidence_public/phase5b1-2026-09-20/09-03/run_log.md に記録しています。人(ユーザー)による実読・内容確認は未実施です。
  • 2026-09-20(Phase 5B-1):Verify型のPilotとして、読む順路(3つの深さ)、第2節「テストの検出力」の用語説明、第3.3節「PASSで分かること・分からないこと」、第4節の判断項目、第5.4節「テストの検出力を確かめる」(run_mutation_check.js、新規)、第7節の確かめたこと・確かめていないことの表、第8.3節「AIにテスト生成を任せるときの注意」、記事間の参照を追加し、第6節の実行結果を再実行の実測に置き換えた(所要時間は5msから6msに変わった。環境依存の値であり、性能の指標ではない)。既存の3スクリプト・確認の範囲・完了条件は変えていない。
  • 未確認事項:実際の複数プロセス・複数利用者による同時アクセス、本番相当の利用量に対する負荷試験、状態条件以外の壊れ方に対する検出力は、この記事の時点では確認していません(第7節)。