Chapter 20
テスト計画とケーススタディ — 全部をつなぐ
この章のゴール.
03 章〜19 章の個別技を、一つのテスト計画に束ねる筋道をつかむこと。リスクから優先度を決め、 面を洗い出し、層(スモーク→機能→堅牢→長時間)で並べ、道具を割り当てる。 最後に、生成 AI が書いた架空の BLE 温度ロガーを題材に、計画からバグ発見まで通しで追う。
この章で使う既出の用語(定義は各リンク先). USB(01 章 2 節)、アナログ(01 章 2 節)、オラクル(01 章 8 節)、規格(01 章 3 節)、pytest(02 章 3 節)、ハーネス(02 章 7 節)、刺激(02 章 1 節)、電源(02 章 2 節)、発熱(03 章 5 節)、オシロ(04 章 8 節)、UART(05 章 1 節)、I²C(06 章 1 節)、SPI(06 章 1 節)、DAC(07 章 2 節)、スキャン(09 章 2 節)、接続(09 章 2 節)、mitmproxy(11 章 4 節)、RTL-SDR(12 章 2 節)、URH(12 章 8 節)、CAN(13 章 5 節)、Facedancer(13 章 4 節)、スループット(14 章 1 節)、デッドライン(14 章 1 節)、ヒストグラム(14 章 3 節)、HIL(15 章 8 節)、カウンタ溢れ(16 章 5 節)、道具(16 章 2 節)
1. 計画は「リスク×面」から
やみくもに全部テストはできない。どこが壊れると痛いか(リスク)と、どこから触れるか(面)を掛けて優先度を決める。
- リスクの棚卸し: 安全(発熱・暴走)、データ喪失、セキュリティ、機能不全、規格違反。痛い順に
- 面の棚卸し: 13 章までで見つけた入口(電源・GPIO・I²C/SPI・UART・BLE・Wi-Fi・USB・デバッグ)
- 掛け合わせて「高リスク×触れる面」から着手する
2. テストを層で積む — ピラミッド
一気に全部やらず、軽い順に積む。下ほど速く多く、上ほど重く少なく。
- スモーク: 起動する・基本状態に入る・応答する(毎コミット、数秒)
- 機能: 各機能が仕様どおり(03 章〜13 章の観測でオラクル)
- 境界・異常: 境界値・不正入力・接続の乱れ(10 章・16 章)
- 堅牢・長時間: リソース枯渇・電源/環境ストレス・ソーク(16 章、夜間)
- セキュリティ: 攻撃面・秘密・認証(17 章)
- 性能: レイテンシ・ジッタ・スループット(14 章)
上へ行くほど HIL(15 章)とハーネス(18 章)と CI(18 章)の価値が上がる。
3. 面ごとに道具を割り当てる — 早見表
| 面/観点 | 主な道具 | 章 |
|---|---|---|
| 状態・電力 | シャント/PPK2/Otii | 3 |
| デジタル信号 | ロジアナ+オシロ、sigrok | 4 |
| UART | USB-シリアル、ロジアナ | 5 |
| I²C/SPI | ロジアナ、偽センサ(自作) | 6, 19 |
| アナログ | DAC/ADC、DMM | 7 |
| デバッグ | pyocd/OpenOCD、RTT/SWO | 8 |
| BLE | bleak、nRF Connect、sniffer | 9, 10 |
| Wi-Fi/ネット | nmap、Wireshark、mitmproxy | 11 |
| サブGHz | RTL-SDR、URH、rtl_433 | 12 |
| USB/CAN | lsusb、usbmon、Facedancer | 13 |
| タイミング | オシロ、GPIO トグル、SWO | 14 |
| 統合自動化 | HIL、pytest、pyvisa、CI | 15, 18 |
4. ケーススタディ — 架空の BLE 温度ロガー
生成 AI に書かせた「電池駆動の BLE 温度ロガー」を題材に、通しで追う。仕様: I²C 温度センサを 1 秒ごとに読み、BLE で通知、閾値超過で警報、ボタンで履歴消去、USB で設定。
計画(リスク×面): 高リスクは「警報が出ない」「電池が異常に減る」「秘密が漏れる」。まずここへ道具を当てる。
通しの流れと、実際に出そうなバグ:
- スモーク(03 章・05 章): 電流波形で起動を確認。だがスリープ時電流が想定の 100 倍——スリープに入り損ねている(電力バグ、生成 AI が省電力を実装し忘れ)。03 章の PPK2 で即発見。
- 機能(06 章・09 章): I²C を覗くと 1 秒ごとに読んでいる。BLE スキャン(09 章)で通知値を確認。偽センサ(06 章)で 85 ℃ を返すと——警報が出る。ただし閾値がちょうど 85 のとき出ない(
>と>=の取り違え、境界バグ)。07 章・16 章の境界攻めで発見。 - 堅牢(10 章・16 章): BLE の履歴消去コマンドに巨大長を書き込むと——ハング(長さ検査なし、バッファ溢れ)。生存確認(10 章)が落ちを検知、入力を保存。
- タイミング(14 章): 警報の GPIO をオシロで測ると中央値 40 ms だが、まれに 600 ms(BLE 通信と競合)。デッドライン 100 ms を破る。ヒストグラムの裾で発見。
- セキュリティ(17 章): BLE の設定キャラクタリスティックが無認証で書ける、通知値が平文、USB 文字列に開発機のシリアルが残存。09 章・11 章・13 章の観測を攻撃者目線で。
- 仕組み化(15 章・18 章): 上を HIL+pytest ハーネスにして、AI が直すたび CI で全再現。夜間ソークで24 時間後にメモリリークで通知停止(16 章)も判明。
こうして「計画→層→道具→発見→仕組み化」が一周する。個々の技(03 章〜19 章)が、計画(本章)という背骨で一本につながる。
5. 生成 AI 製ファームで特に狙う所
本シリーズの動機(AI にコーディングさせた組み込み)ゆえに、経験上ここがよく出る:
- 省電力の抜け(スリープに入らない、周辺を切らない)→ 03 章
- 境界の取り違え(
>/>=、オフバイワン)→ 07 章・16 章 - 例外・異常入力の未処理(長さ検査なし、溢れ)→ 16 章
- 認証・暗号の省略(無認証書き込み、平文)→ 17 章
- 並行・順序のバグ(競合、初期化前操作)→ 16 章
- 長時間の劣化(リーク、カウンタ溢れ)→ 16 章
- タイミング違反(通信と競合してデッドライン破り)→ 14 章
6. 手を動かす
テスト計画を組み立てる
この章のポイント
- 計画はリスク×面で優先度を決める。高リスク×触れる面から着手
- テストは層(スモーク→機能→境界→堅牢→セキュリティ→性能)で軽い順に積む
- 面ごとに道具を割り当てる早見表で、03 章〜19 章の技を配置する
- ケーススタディ(BLE 温度ロガー)で、計画→層→道具→実際のバグ発見→仕組み化を一周
- 生成 AI 製ファームは省電力・境界・例外・認証・並行・長時間・タイミングが狙い目
このシリーズを終えたあなたは、外から機器の状態を読み、刺激を与え、堅牢性と守りを試し、 それを自動の仕組みに育てる道具箱を手にしている。次は、手元の実機で一つ、電流波形を眺めることから始めよう。