「テストは237本、全部通っています」
Claude Code に実装を任せて、機能を1つ足すたびにテストも書かせてきました。完了条件は「pytest が全部通ること」です。その結果が237本です。
そのうち、AIの判断が妥当かを見ているテストが何本あるか。数えようとして、数えられませんでした。
手が遅いからではありません。数える対象を間違えていました。
前提:どういう構成か
- Python / FastAPI / Alembic のバックエンド(ビル管理の業務システム)
- テストは pytest。収集対象は
tests/integration/以下 -
tests/直下にはrun()型の手動スクリプトが別にあり、こちらは pytest に収集されない - フルスイートは1回4〜5分
237という数字は、この収集範囲の内側を数えたものです。
marker で分類しようとして、止まった
最初に考えたのは、pytest の marker で印をつけることでした。
@pytest.mark.ai_judgment
def test_xxx():
...
こうしておけば pytest -m ai_judgment で絞り込めます。問題は、その印をつける作業です。
いまの分類の軸はディレクトリしかありません。タグも命名規則も無いので、「AIが関与する処理かどうか」で絞り込む手段がない。いまは ai_ で始まるモジュール名を手がかりに、人が目で拾っています。
marker を付けるには、237本を1本ずつ読んで判断することになります。1本1分でも4時間。途中で判断の基準がぶれたら、最初からやり直しです。
そして、100本に印をつけ終えた時点でも、残り137本に「AIの判断を見ているテスト」があるかどうかは確定しません。途中経過に意味がない。止まったら全部が無駄になります。
ここで止まりました。
数え切れる側は、反対にあった
止まったまま反対側を数えたら、こちらは終わりました。
このシステムでAIが判断している工程は、12個です。
| # | 工程 |
|---|---|
| 1 | 点検欠落の検知 |
| 2 | 巡回超過の検知 |
| 3 | 修繕放置の検知 |
| 4 | 契約期限の検知 |
| 5 | SSOT陳腐化の検知 |
| 6 | 提出期限の検知 |
| 7 | 管轄未解決の検知 |
| 8 | 有資格者欠如の検知 |
| 9 | 優先順位の算出 |
| 10 | リスクスコアの算出 |
| 11 | 放置リスクの言語化 |
| 12 | 故障の予測 |
全部に名前が付いています。数えるのに5分もかかりません。
237本は分類できない。12個は数え切れる。同じことを確かめようとしていたのに、片方だけが終わりました。
テストの外に、1枚の表を置く
やることが1つに決まります。テストの側に marker を足すのではなく、テストの外に表を1枚置きます。
- 行:AIが判断している工程(12行)
- 列:「動作の検証」と「判断の検証」の2つだけ
- マス:テストのノードIDを書く
ノードIDの一覧は、pytest の収集だけで取れます。
pytest --collect-only -q tests/integration
tests/integration/test_xxx.py::test_yyy の形で1行ずつ出るので、それを該当するマスに貼るだけです。テストのコードは1行も変えません。
表の形はこうなります。
| 工程 | 動作の検証 | 判断の検証 |
|---|---|---|
| 点検欠落の検知 | ||
| 巡回超過の検知 | ||
| 修繕放置の検知 | ||
| … | ||
| 故障の予測 |
この形にすると、埋める作業は12回で終わります。237回ではありません。
そして埋め終わったとき、空欄が答えになります。テストが1本も当たっていない工程が、そのまま見える。全部埋め終わる前でも、1行目から空欄は見えます。
なぜ、少ない側から数えると終わるのか
数が多い側から数えると、全部を触るまで何も確定しません。
数が少ない側から数えると、1行目で1つ確定します。「点検欠落の検知に、判断を見ているテストがあるか」は、その1行を調べた時点で決まる。残りの11行は関係ありません。
分類の作業は、多い側からは終わらない。少ない側からしか終わりません。
テストに限らず、ログの分類でも、問い合わせの分類でも同じ形でした。分類しようとして止まるときは、たいてい多い側から手をつけています。
237は、何を確かめた数字だったか
237本が通っていることには価値があります。仕様どおりに動くことも、前に動いていたものが壊れていないことも、それで確かめられます。
ただし 237 は「テストが何本あるか」の数字であって、「AIが判断している工程のうち、いくつが守られているか」の数字ではありません。この2つは別物です。
237冊の本に索引を付けようとしていました。棚は、12本です。
この記事で扱ったのは「どこから数えるか」までです。
では、237本が通っていることは何を保証していて、何を保証していないのか。保証していないものは3つありました ── AIの判断そのものの妥当性、実データでの正しさ、係数と確信度の値。この3つを1つずつ分解した記録を note に書いています。