Embedded Test 18 · テスト自動化ハーネスを作る — 手技を仕組みに

Chapter 18

テスト自動化ハーネスを作る — 手技を仕組みに

この章のゴール.

単発の手作業を、繰り返し自動で回るテストハーネスに育てる設計をつかむこと。 刺激・観測・判定の抽象化、機器ドライバの分離、pytest での記述、計測器連携(pyvisa/ppk2)、 ログとレポート、そして CI で「生成 AI が直すたびに全部走る」形にするところまで。

この章で使う既出の用語(定義は各リンク先). USB(01 章 2 節)、オラクル(01 章 8 節)、仕様書(01 章 3 節)、再現性(01 章 4 節)、記録(01 章 4 節)、ハーネス(02 章 7 節)、判定(02 章 1 節)、刺激(02 章 1 節)、電源(02 章 2 節)、オシロ(04 章 8 節)、UART(05 章 1 節)、モード(06 章 5 節)、DAC(07 章 2 節)、接続(09 章 2 節)、read(10 章 2 節)、CAN(13 章 5 節)、ばらつき(14 章 1 節)、HIL(15 章 8 節)、時系列(16 章 5 節)、道具(16 章 2 節)

1. なぜ仕組みにするのか

03 章〜17 章の技は、手でやると一度きりで終わる。生成 AI は何度もコードを直すから、そのたびに同じ検証を手で繰り返すのは非現実的。テストハーネス——刺激を与え、観測を集め、判定し、記録する自動装置——にまとめれば、「変更→全テスト自動実行→回帰検出」が回る。

テストハーネス(test harness) とは、テスト対象を組み込んで自動実行する土台のこと。対象への刺激注入、応答の収集、期待との照合、結果の記録を一手に担う「テストを走らせる骨組み」。

ハーネスは三層に分ける——上ほど読みやすく、ハード非依存テスト層「起動→モード設定→温度異常→0.5s 以内に警報」=仕様書のように読める筋書き機器モデル層dut.set_temp(85) / dut.state() / dut.wait_for("ALARM")=意味のある操作(刺激・観測・判定)トランスポート層UART・bleak・ロジアナ・DAC・ppk2 を実際に叩く=ハードが変わってもここだけ直すpytest を土台に fixture・パラメータ化・マーカーで整理する
図18-1 テストハーネスの三層構造。

2. 三層に分ける — 抽象化が命

良いハーネスは、変わりやすい所と変わりにくい所を分ける。おすすめは三層。

こうしておくと、テスト(上)は日本語の仕様書のように読め、ハードの都合(下)に汚されない。

class DUT:                       # 機器モデル層
    def __init__(self, uart, ppk, fake_temp):
        self._uart, self._ppk, self._temp = uart, ppk, fake_temp
    def set_temp(self, c):       # 刺激(偽センサ, [07 章](07_アナログ周辺とセンサ.md))
        self._temp.set_celsius(c)
    def state(self):             # 観測(コンソール, [05 章](05_UARTとシリアルコンソール.md))
        return self._uart.query("state?")
    def current_mA(self):        # 観測(電流, [03 章](03_電源と消費電流から状態を読む.md))
        return self._ppk.mean_mA()

def test_overheat_alarm(dut):    # テスト層(読みやすい筋書き)
    dut.set_temp(25); assert dut.state() == "IDLE"
    dut.set_temp(85); assert dut.wait_for("ALARM", 0.5)

3. pytest を土台にする

車輪を再発明せず、成熟したテストランナーに乗る。Python なら pytest が定番。

4. 計測器とつなぐ

ハーネスの下層は、実際の計測器・注入器を叩く。標準的な口を押さえる。

5. ログとレポート — 落ちたとき再現できるか

自動テストの価値は、失敗を正確に残すことにある(02 章の再現性)。

CI に載せて、AI の反復修正と噛み合わせるpushコード変更buildビルドHIL 実機テスト回帰一式レポート合否・傾向失敗ログを生成 AI に戻す速いスモークは毎コミット、重いソークは夜間・週次に段階化する
図18-2 CI パイプラインと自動修正ループ。

6. CI に載せる — 生成 AI と噛み合わせる

最終形は、コード変更のたびに自動でテスト一式が走ること。

7. 何を大事にするか(この章のオラクル観)

8. 手を動かす

ハーネスを設計する


この章のポイント