4 モダン技術:
テスト自動化

概要

  • 製品仕様など開発量の増大に伴うテスト工数問題
    • 開発量はプロダクトライン(流用)で効率化
    • テスト量は爆発的に増大
  • 別の問題:仕様ベーステストの限界
    • システムの複雑化から生ずる問題
    • メモリリークやセキュリティ問題
  • 自動テストの製品群が出現
    • 新たな自動テスト技法の誕生

テスト自動化概観

大別すると

  • 製品別:単体/結合:仕様ベースのテスト
    • テストハーネスの自動化
    • ターゲット環境の仮想化技術
  • 汎用テスト自動化
    • ファズテスト
    • 静的解析/サニタイザー
    • 動的解析

自動化技術の導入課題

  • どの自動化も体系的なアプローチ
    • 担当者個人の技術対応から
    • 組織的なワークフロー,環境投資,訓練,
    • 維持改善するインフラチームが必要
  • 技術リーダー的な役割が求められる

4.1 テストハーネス系自動化

  • 単体テストでは
    • ドライバー:テスト対象を呼び出すコードなど
    • スタブ:テスト対象が呼び出す関数やI/Oの疑似
    • モック:スタブの振舞い版
  • テストハーネス:これらを含めたテスト実行環境のこと
  • 体系化された「自動化テストハーネス」

例:単体テスト自動化

  • テストハーネスを用意するツール
  • 例:Ceedling(C言語、Unity + CMock)
    • Ceedling はOSSだが,他に有償ツールもある
      • 資料参照
    • Ceedlingは情報がオープンで利用者が多い
    • 開発が盛んにおこなわれている

Ceedling の役割

  • C のユニットテスト統合フレームワーク,

  • テストの構成管理ビルド管理テスト実行を一括で自動化.

  • project.yml によりビルド設定を集中管理.

  • Unity や CMock と連携し,テストランナーやモックコードを自動生成.

  • ceedling test:all のようなコマンドでテストプロセス全体を再現性高く実行.

  • コンパイル,リンク,結果レポートの生成も自動化.

Ceedling は「テストドリブン開発」として利用される.

Unity の役割(テストフレームワーク)

  • アサート関数を中心にテストを表現する

  • TEST_ASSERT_EQUAL(expected, actual)

  • TEST_ASSERT_TRUE(condition)

  • TEST_ASSERT_FLOAT_WITHIN(delta, expected, actual)

特徴

  • 組込み機器でも動作する小さなランタイム.
  • 1テスト関数=1ケースという明確な構造.
  • テストランナーを自動生成し,テスト関数を順次呼び出す.

Unity は「C の JUnit」に相当

CMock の役割(モック自動生成)

Ceedling 環境に統合された モック生成ツール
外部依存を切り離したユニットテストを実現する.

  • 与えたヘッダファイル(例:foo.h)からモック関数を自動生成.
  • 関数呼び出し回数,入力引数,戻り値の期待値を設定できる.
  • EXPECT_CALL_FOO(…) のような形でテストコードから期待を記述.
  • 組込み開発で多い「ハードウェア抽象層のテスト」に特に有効.

CMock は外部I/Oを持つコードのテストを容易にし,
制御不能な依存を完全にテスト環境側に置き換える仕組みを提供する.

Ceedlingの自動テスト

  • 仕様に書かれた機能や条件をテストする部分は,テストケース設計が必要.
  • 自動で確認するのはアサート関数(テンプレート)
  • テストドリブン開発;テストファーストのワークフロー版
  • 後述するターゲット仮想環境と組み合わせ,評価ボードでのテストを疑似
  • 製品やチームレベルでの導入

Ceedling の処理フロー(図)

flowchart TD
    A["ユーザーが Ceedling コマンドを実行"] --> B["テストスイートの探索(test/test_*.c)"]
    B --> C["必要なモックの自動生成(CMock)"]
    C --> D["Unity によるテストランナー生成"]
    D --> E["コンパイル & リンク(gcc/clなど)"]
    E --> F["テスト実行"]
    F --> G["結果の集約 & レポート表示"]

全体の典型ワークフロー

sequenceDiagram
    participant User as "ユーザー"
    participant Ceed as "Ceedling"
    participant Unity as "Unity"
    participant CMock as "CMock"
    participant GCC as "コンパイラ"

    User->>Ceed: "ceedling test:add"
    Ceed->>Ceed: テストファイル抽出
    Ceed->>CMock: 必要なモック生成
    CMock-->>Ceed: モックCファイル
    Ceed->>Unity: テストランナー生成
    Unity-->>Ceed: ランナーコード
    Ceed->>GCC: ビルド
    GCC-->>Ceed: 実行ファイル
    Ceed->>User: テスト結果を表示

4.2 ターゲット環境での自動化

  • 組込み開発におけるテストの特殊性
    • 開発環境と実行環境が異なる
    • 実行環境は複数あり,固有のECU依存
  • ECU別の「評価ボード」テスト
    • テストやデバッグ資源が貧弱
    • ボード別に特別な知識が必要
  • 組込みテスト生産性の大きな課題

救世主 QEMU の出現

  • QEMU(Quick Emulator)
    • OSSの高速エミュレータ/仮想化基盤
  • Fabrice Bellard が 2003 年頃に公開
  • KVM との統合で高速なハードウェア仮想化基盤

QEMU誕生の背景

  1. 異なるCPUアーキテクチャ開発の困難さ
  • 多様なアーキテクチャ(x86, ARM, MIPS, PowerPC など)
  1. OS開発・ブートローダ開発のための仮想環境
  • 開発者を多様なアーキテクチャ対応から解放
  1. 仮想化技術の進化
  • 2008 年以降,KVM (Kernel-based Virtual Machine) との連携
  • KVM:ハイパー技術の元祖

QEMU の主な仕組み

  1. TCG(Tiny Code Generator)による動的バイナリ翻訳
  2. デバイスモデルのエミュレーション
  • 仮想CPU, メモリ・MMU, PCI / USB / VGA / NIC
  • ストレージ(IDE, SCSI, Virtio など)
  1. KVM によるハードウェア支援仮想化
  • ゲストOSはホストCPU上でほぼネイティブ実行
  • VMware や VirtualBox と同等の性能を発揮できる.

docker / docker compose

  • OSレベルの仮想化技術としてQEMU/KVM
  • もっと軽量でアプリレベルの仮想化としてDocker
  • Docker Compose:複数コンテナをまとめて定義・起動する

単体/結合テストのクロス開発

  • docker 上にQEMUを動作させて
  • クロスコンパイルしたテスト対象やCeedlingを動作させる
  • 実機の評価ボードより高速
  • 同時に多重実行できる.

【演習4-1】グループ討論

  • モダン技術による自動テストを組み込んだ開発フロー
  • 統合ECU型の開発では一般化している
    • テスラ他,中国EV開発
  • 既存の派生開発を置き換えるのではなく
  • 新たなSDV系開発に移った時の技術として
  • どの部分に興味を持つのか,何が重要なのか
  • グループでまとめてください.
  • 疑問や不安でも良いです.
  • 【ブレークアウト 7分】

汎用テスト自動化

仕様と実装の確認では無いテスト

4.3 ファズテスト

  • 仕様ベーステストとは異質のテスト
    • クラッシュやリークなど未定義動作を検出
  • システムレベルでのテスト
    • 異常の検出方法:アサート挿入
    • テスト入力:想定外の入力を自動生成
  • 膨大なマシンパワーを消耗する
    • 組込み系は小さいので普通に可能
    • ファズ環境の専門技術が必要

ファズテストの歴史

  • インターネットの発展期
  • 様々なセキュリティ問題が発生
    • 現代でも続いている
  • 製品やサービスの脆弱性が問われた
    • その対策として発達した

ファズテストの原理

  • ファズテストは自身で入力データを探索しながら無限に実行する.
  • 探索の効率化がファズテストの能力を決める.
  1. 入力生成器(Generator): ランダム入力を基に変異を加える(Mutation fuzzing)
  2. ターゲット実行器(Executor): 生成した入力を対象プログラムに高速に注入し,実行させ, クラッシュ,assert失敗,例外,タイムアウトなどの挙動を監視する.
  3. フィードバック(Feedback loop): 実行トレースやカバレッジ情報を利用し,入力を学習し続ける.

ファズテストの進化

  • 他の技術と連携し,現在も進化している.
  1. 黒箱・灰色箱・白箱ファジングの登場と高度化
  2. コンコリックテスト(Concolic Testing)との統合
  3. 動的解析ツールとの連携

詳細は資料

  • 専門性の高い領域
  • 組込み系でも需要拡大傾向
    • クラウド連携
    • 車両外との通信
    • 悪意のある侵入

4.4 静的解析/サニタイザー

  • 始まりは MISRA-C などコーディング規範
  • その静的解析ツールが販売された(売りにしている)
  • 意味のある静的解析はコベルティ(Coverity)以降

Coverity の革新点

  • 抽象解釈(Abstract Interpretation)を高度化し,大規模コードでも実用的な速度を維持.
  • C,C++ の深い制御フロー,データフローを解析して NULL参照,メモリ破壊などを高精度で検出.
  • Linux カーネルを解析し,実際に多数のバグが発見されたことで有名に.

様々な機能/製品

  1. Coverity(Synopsys)
  2. Polyspace(MathWorks)
  3. QA·C / QA·C++(Perforce / 元 PRQA)
  4. clang-tidy / clang static analyzer(オープンソース)
  5. PVS-Studio
  6. Klocwork(Perforce)

利用上の課題

  • 擬陽性問題
    • 既存のコードに対してチェックすると
    • 膨大な指摘を吐き出す
      • ツールが持つルール違反だが
      • コードの無害な修正が困難
  • 開発段階で使うツール

【演習4-2】

  • 擬陽性エラーに対する対応問題
  • 建前と現実,様々な対応がある
  • グループで意見交換してください
  • グループで,意見を記録して
  • 【ブレークアウト 7分】

4.5 動的解析

  • コードを実行(JAVAの仮想マシンの方式)
  • その挙動を監視し,異常動作を検知する
  • アサーションを1命令ごとに確認できる
  • 実行時依存(変数の変化など)も解析できる

動的解析の種類

(1)サニタイザ系動的解析(SAN 系)

  • AddressSanitizer (ASan)
  • UndefinedBehaviorSanitizer (UBSan)
  • MemorySanitizer (MSan)
  • ThreadSanitizer (TSan)

(2)プロファイラ系動的解析

主にパフォーマンス改善やボトルネック分析に使用される. 性能要件の診断に不可欠で,テスト中の挙動把握にも役立つ.

(3)トレーシング系動的解析

プログラムの実行過程を詳細に記録し,制御フローやシステムコールの履歴を把握する手法. デバッグ,高度な障害解析,セキュリティフォレンジクスに用いられる.

(4)メモリチェッカ・動的検証ツール

実行時の正確なメモリ動作を追跡し,不正アクセスやリークを検出する. サニタイザより詳細で強力だが,オーバーヘッドは高い.

(5)動的モデル検査(Dynamic Model Checking)

プログラムを実行しながら状態空間を探索する. 並行プログラムのデッドロックや競合検出に特に強い.

選択と設定

  • どんな障害を検出したいか
  • 対象製品の構造上,どんな障害が予測され または発生しないか.
    • RTOSの多くはスタックメモリーを使わない
    • RTOSはシングルタスク など
  • テスト対象とツールの理解が必要

4.6 まとめ

  • モダン技術としての自動テスト
  • 機能動作の正しさを確認するテストとは違う
  • 想定外の挙動を検出するための自動テスト
  • 現代も進化中:専門性が高度化
  • 現場で使える軽量ツールもある
    • 選択と使い方が重要

有則のテスト/無則のテスト

考え方

  • 有則:
    • 仕様に明示された機能や振舞い
    • + 実装時仕様と呼ばれる機能や振舞い
      • 例:ガーベイコレクションなど
  • 無則:
    • 想定外の有害な機能や振舞い
      • メモリーリーク,デッドロック
      • セキュリティホール,バックドア

次は,