GAIO CLUB

2006年12月01日

 組込みソフト品質を改善する基本検証「単体テスト」の重要性と C1カバレッジに対応した「カバレッジマスターwinAMS」

GAIO CLUB 特集
GAIO CLUB【2006/12月号】
組込みソフト品質を改善する基本検証「単体テスト」の重要性とC1カバレッジに対応した「カバレッジマスターwinAMS V2.2」
~静的解析機能を使用してC1カバレッジテストデータを自動生成~


組込みソフトの品質保証・品質改善の基本テストとして、関数の入出力テストをベースとした「モジュール単体テスト」は、自動車業界を始め、一般家電製品でも盛に行われるようになってきました。本特集では、2006年12月末にバージョンアップされる、ガイオの単体テストツール「カバレッジマスターwinAMS v2.2」でサポートさたC1カバレッジ機能を取り上げ、テストデータ作成手法や効率的な単体テスト実施方法について解説致します。

組込みソフト開発の現状と業界共通の課題

  • 世の中には新しい組込み製品が次々と登場していますが、これらの新しい機能は、今やソフトウエアで実現されているものがほとんどです。製品分野に関わらず、組みソフトウエアの規模は、複雑化、巨大化しています。それに伴い、ソフトウエアが原因となる不具合が、市場に出てしまう例も少なくありません。右の円グラフは、経済産業省、情報処理機構(IPA)がまとめた製品出荷後の設計品質問題の要因を示しています。
  • 製品出荷後の設計品質問題の主な要因
ここからも、ソフトウエアが原因となる問題が半数以を占めていることが分かります。企業内での最優先課題としては、一昔前までは「コスト削減」「効率化」を掲げることが多くありましたが、下の経営者・事業者向け調の調査からも分かる通り、最近では「設計品質の向上」が群を抜いています。このように、組込みソフトの品質を確保することが、開発部隊の課題に留まらず、企業としの最重要課題の1つとなっているのです。

進歩しているとは言えないソフト検証手法

  • 組込みソフトウエアは日々進化し、複雑化していますが、その検証方法はどうでしょうか?現状の多くは、昔ながらのデバッグ、テスト手法を続けており、ソフトウアの進歩に比較すると、検証手法や工程が大きく進歩しているとは決して言えません。
  • 事業部門に課せられている課題
組込み開発と言えば、固有のハードウエアに依存した部分が多く、どうしてもターゲットを意識したデバッグが多くなってしまうため、「実機しか信用しない」「実機で題が起こらなければ全て良し」と考える古い組込み技術者も少なくありません。確かに組込みの分野では、技術者の長年の経験と勘に頼って、品質を確保して来た一面もりますが、いまや、このような方法では、ソフトの複雑さに追い付けず、品質確保が難しくなっています。

単体テストの重要性

  • ここで、検証のプロセスを考えてみましょう。コーディングを行ってから開発完了までの間には、ソフト品質を確認するいくつかの段階があります。大まかには下のうな流れになります。ターゲットボードに実装してからの結合テスト、最終システムテストは、必ず行われる工程ですが、その前に位置する単体テストは軽視されがちです。
  • 単体テストの重要性
各工程で発見すべき不具合の内容は、下の表のようになりますが、結合後のテストは、ソフトの機能に着目したブラックボックステストとなり、検証できる内容は、際のシステムで再現できる範囲に留まります。特に、例外系の様な想定外の入力に対するソフトの挙動については、結合後のテストで全てを検証することは不可能で、多が潜在化してしまいます。
各テスト工程で発見すべきバグの分類
そこで、システムを構成する関数モジュールに対して、結合テストの前に、想定外入力に対する検証を行っておくことが、システムの堅牢性(ロバスト性)を高め、体的なソフト品質を高めることにつながると考えられています。
また、結合テストの前に、関数モジュールの完成度を高めておくことで、結合テストでのテスト項目数を減らし、不具合が発見された場合の原因の特定が容易になります単体テストには、主に次のような効果があるとされています。

・ホワイトボックステストで想定外入力に対する挙動を保証することで、潜在化するバグを未然に防ぐ
・組込みソフト開発の関数の再利用において、製品品質を確保可能にする
・テストの結果が、品質を示す「定量的・客観的」データとなり明確になる
・関数設計者自身がテストデータを作ることで、入力条件の網羅性を意識したソースレビューが可能になる

従来の単体テストツール・手法の比較

  • では、単体テストを効率的に行うためのツールについて考えてみましょう。単体テストは、製品に搭載される数百、数千の関数1つ1つに対して行う入出力テストでるため、開発ツールを採用する際に、作業工数がどの程度改善されるかを意識しがちです。しかしながら、その他にも留意すべきポイントがあります。右のような項目があげられます。
  • 単体テストツール選定に対しての留意点
現状の単体テストの多くは、次のような方法で行われています。

ICEデバッガ/純正ISSを使用した手作業

これは、最もオーソドックスな方法です。関数仕様に従って入力データを作成した後、ICEデバッガや半導体メーカー製シミュレータ(ISS)を使用して、手作業で単テストを行う方法です。数千ある関数を評価することを考えると、気が遠くなる様な工数がかかります。

テスト方法

1. デバッガの機能を使用して、テスト対象の関数の直前にブレークポイントを設定
2. 入力条件となる全ての変数にデバッガの機能を使用してデータをセット
3. デバッガで関数の最後まで実行(カバレッジをとる場合はステップ実行して、実行経路をソースリスト上に記録する)
4. 評価対象の変数値をデバッガ機能で確認、表へ記入

純正ISSのスクリプト機能を利用した自動テスト

これは、半導体メーカー製のマイコンシミュレータ(ISS)を利用して、それが持つスクリプト機能を駆使して、テスト作業を自動化する方法です。確かにテスト実行作業は自動化されますが、スクリプトの作成や、結果の解析は手作業で行う必要があるため、大幅な作業改善は望めません。

テスト方法

1. ブレーク設定、入力変数へのデータ設定を行うスクリプトを作成
2. スクリプトを自動実行(ISSにカバレッジ機能があれば、これを利用してカバレッジ記録をとる。なければ、カバレッジテストは不可能。)
3. 実行結果のログを解析
4. 評価対象の変数値をログから確認、表へ記入

Windows系、GNU系単体テストツールを利用

これは、Windowsなどオープン系のツールをそのまま利用する方法です。データの作成方法は、そのツール独自の方法となりますが、比較的汎用性を高くすることがきます。ただし、組込み用ではないため、単体テストのために検証対象のソースコードを書き換える必要があることと、ツールによっては、対象関数にプリプロセッサのうな特殊なコードを加える必要があります。また、多くはX86系のコードにコンパイルされて動作するため、組込みマイコンの上での実行検証が行われる訳ではありまん。

このように、既存の方法には一長一短があり、組込みコードに対して、信頼性が高い単体テストを効率的に行えるツールが必要となります。

組込みに特化した単体テストツール「カバレッジマスターwinAMS」

ガイオは、これらの従来のツールの問題点をクリアする組込みソフト評価に特化した単体テストツール「カバレッジマスターwinAMS」を提供しています。このツーは、コード実行環境にマイコンシミュレータ(ISS)を使用しており、命令セットレベルでは、実マイコンと同じ動作で検証が行えます。また、組込みに使用するクロスンパイラで生成したコードを実行してテストを行うため、最終製品に対して信頼性の高いテストが行えます。
入力データはCSVファイルで与えることが可能で、テストデータさえ用意できれば、テスト実行から入出力結果のレポート、カバレッジ記録までのすべての作業を自動化ます。
単体テストに必要な機能、例えばスタブ関数作成機能や、静的解析ツールと連携したテストデータ作成機能なども装備しており、前述の従来の単体テストツールの問題点クリアしています。
組込みソフト単体テストで使用されるツール比較とカバッレッジマスターの優位性

C1カバレッジに対応したテストデータ作成機能を搭載

自動車ECUソフト開発を始め、多くの業界C1では、単体テストにおけるテスト指針として、C1カバレッジ(※)が必須となっています。
最新バージョンでは、C1カバレッジを満たすためのテストデータ作成・支援機能が追加されます。if、switch、for、whileなど、条件分岐のある箇所について、TRUEFALSEなどのすべての条件を満たすためのデータを自動生成します。
これらのデータ作成に必要なソース解析は、ガイオのプログラム静的解析ツール「CasePlayer2」を使用して行います。

※ C1カバレッジ:条件分岐に対してすべてのケース(if文のTRUEとFALSE、switch文のすべてのcase)が少なくとも1度は実行して結果が正しいことを検証する。

ガイオのコード解析技術を駆使した最適化テストデータ作成

下に、サンプルソースと、C1カバレッジを満たすためのデータ作成ビューを示します。解析結果から、各々の条件式のTRUE/FALSEケースを満たす入力変数データと、件文同士のネスト状態、依存状態により、C0/C1を満たせるように、入力変数データの組み合わせを自動生成します。
このデータ組み合わせ機能はガイオのコンパイラ技術で培ったソース解析技術が応用されており、対象のソースコードが解析できる限りにおいては、 C0/C1を満たす最少のテストケースが生成できるように、最適化が図られます。
条件式のロジックが複雑で、静的解析機能で入力変数の解析が不可能な場合には、データ生成は行わず、他の条件文のために自動生成されたデータに、その箇所のデータユーザーが追加できるようになっています。追加した場合のデータ組み合わせは、前バージョンで追加されている「ディシジョンテーブル」の手法により、組み合わせデタを自動生成します。

※「ディシジョンテーブル」によるデータ作成手法は、GAIOCLUB 2006年2/3月合併号に掲載されています。

従来、ソースコードや仕様書を手作業で追いながら、入力データをEXCEL上に作成していた工程に比べれば、比較にならないほど、テストデータ作成の工程が効率化れることをお感じ頂けると思います。
単体テスト対象のサンプル

C1テストベクタ編集画面

上の図は条件式 if( gb_b > 20 && gb_c > 30 )を解析して生成されたデータの表示画面。CasePlayer2 により解析された結果を基に、関数に含まれる条件式が全てストアップされます。選択した条件式に関わっている変数がgb_b、gb_cであることを太字で示し、C1を満たすために必要な最小限のデータを生成します。生成されるデタは、gb_b、gb_cの各変数の境界値 20、30 の上下1 の値(± 1)となります。

無駄なデータを作らない最適化データ生成

上の図はC1テストベクタ編集画面から生成された、組み合わせデータ。1、2 行目のデータが、条件式 if( gb_b > 20 && gb_c > 30 )のTRUE/FALSEケースに応している。この部分は、上位の条件式 if( gb_a > 10 ) のネスト内にあるため、これら両方の条件の依存関係を解析して、最小限の2パターンのテストデータのみを成している。データ自動生成の最適化機能により、この関数のC0/C1を満たすデータとして、最少の6 パターンのみを生成。

簡単操作の自動単体テスト作業

  • 生成されたデータは一旦CSVファイルに保存され、カバレッジマスターから起動されたマイコンシミュレータ(ISS)によって、単体テスト実行されます。テスト行は「シミュレータ起動」ボタンを押すだけで起動され、チェックボックスで指定したテストデータ(CSV ファイル)を一斉にテストすることが可能です。
  • テスト実行はテスト管理ツールのボタンを押すだけ
実行後の出力結果については、期待値が設定されている場合は、それとの照合結果をOK/NGで示し、期待値との相違がある部分をCSVデータセル上に出力します。

分かり易いC1カバレッジレポート

カバレッジ結果は、ソースコード上にC0とC1の実行結果を出力したテキストファイルを生成します。与えた入力データでは実行されなかったソース行をテスト漏れ(C0 カバレッジを満たさない行)として表示します。if文などの条件式ではTRUE/FALSEの両方のケースがテストされているかどうかを「T/F」の記号で明示します。switch文では、全CASE数に対して、テストされたCASE数を示すようになっています。
C0/C1カバッレッジ結果報告書

まとめ

ガイオは、マイコンシミュレータ(ISS)を使用して信頼性の高い単体テストを行う「カバレッジマスターwinAMS」をリリースして以来、多くのユーザー様のご意見を取り入れてバージョンアップを重ねて参りました。今回のC1カバレッジ機能も、単体テストの本質である入出力テストを効率的に確実に行い、ソフトウエアの基礎である関数モ ジュールの信頼性を正しく評価することを目標にしたものです。今後も、組込み業界の大きな課題となってるソフト品質改善に向けて、皆様のお役に立てるソリューションを提供して参ります。

人気のコラム

最新のコラム