GAIO CLUB

2006年02月01日

潜在化するバグを未然に防ぐ「モジュール単体テスト」とテストデータ作成機能を追加した「カバレッジマスター Ver.2」

GAIO CLUB 特集
GAIO CLUB【2006/2月号】
潜在化するバグを未然に防ぐ「モジュール単体テスト」とテストデータ作成機能を追加した「カバレッジマスター Ver.2」
~静的解析、デシジョンテーブルを使用してテストデータ作成を効率化する~


本特集では、近年、組み込みソフトの品質改善手法として注目されている「モジュール単体テスト」について、その効果や課題、効率的なテスト実施方法について解説します。後半では、CASEツールの静的解析機能と連携して、ソースコードのトレースを容易にする機能や、テストデータの組み合わせ手法である「デシジョンテーブル」を使用した、効率的なテストデータ作成機能が追加される、ガイオの「カバレッジマスター Ver.2」(2006年4月リリース予定)について紹介いたします。

組み込みソフト品質向上への意識

組み込み製品の機能そのものがソフトウエアで実装される様になった今では、ソフト実装量の増加と共に、市場での不具合の発生件数も増加しています。最近2、3年の間の傾向として、組み込みソフト開発の分野では、特に「ソフト品質」に対する意識が高まっています。(下図参照)
ガイオは組み込み開発ツールを開発販売するベンダーですが、以前は「工期短縮」「コスト削減」を目的としたツール導入の問い合わせが多かったのに対し、最近では「ソフト品質改善」を掲げた問い合わせが多くなっています。

ソフトウエア検証の分類

組み込みソフトの検証、レビューの工程は、一般的に下の表の様に分類されています。
これらのうち、後半の結合テスト、システムテストは、ほとんどの場合、実機やHWエミュレータ(自動車業界のHIL-S)を使用して行われることが多く、主に機能動作に対するブラックボックステストになります。
これに対し、単体テストは、ソースコード上の変数に対する網羅性を意識した「ホワイトボックステスト」であり、実機や試作HWが完成する前の段階から行うことが可能です。

モジュール単体テストとは

ここで言う単体テストとは1つの関数に対する入出力テストを指します。具体的には、1つの関数に対して、引数や変数などの入力に網羅的なデータパターンを加え、関数実行後の戻り値や変数値が期待値通りであるかをテストするものです。条件分岐を含む関数に対しては、全ての分岐を網羅するデータパターンを与え、ソース上でのテスト網羅率を示すパスカバレッジ(C0、C1など)を結果として出力します。

単体テストの意義

結合後のテストと単体テストで検証するバグは性質が異なります。単体テストでは容易に検証できる内容であっても、結合テスト以降では再現が難しいため見つからないもの(例えば、ゼロ除算、NULLアクセスなど)が多く、単体テストを省いてしまうと、このようなバグは潜在化してしまいます。その結果として、製品をリリースした数ヶ月後に、不具合が再現してしまうことも少なくありません。
単体テストには、ソフト品質に対する次のような効果があるとされています。

・ソフト設計の上流工程での単体テストは潜在バグを未然に防ぐ

これは、前述の通りです。

・関数設計者自身による「網羅率」を意識したテストはソフト品質を向上する

単体テストのためのデータを関数設計者自身が用意することで、普段とは異なった視点で、変数の網羅性意識したソースレビューを行うことになり、気が付かなかったバグを発見する切っ掛けとなる。

・テストの結果が、ソフト品質を示す「客観的・定量的」なデータとなる

パスカバレッジについては、「%」で示される定量的な結果が得られるため、テストの進捗度合いが明確となる。また、テスト担当者に対するプレッシャーにもなる。

単体テスト作業の課題

では、いざ単体テストを行うとすると障害とりがちな課題について考えてみます。単体テストにかかる工数は主に次の2つです。

・テストのためのソースコードの書き換え

Visual C++、GNUなど、組み込みマイコンとは異なるプラットフォームで単体テストを実行する場合の、組み込みソフトをコンパイルするために必要なソースコードの書き換え作業

・テストデータ作成

ソースコードを解析しながら、分岐条件のしきい値等を算出し、C0、C1、MCDCなどのテスト基準を満たすテストデータを作成する工数

1つ目のソースコードの書き換えは、PC上で対象のコードを実行するための問題であり、組み込み用クロスコンパイラに多く存在する独自の仕様(非ANSI文法、#Pragmaなど)を避けるための作業です。これは、テスト対象のソースに手を加えることになるため、最小限にとどめる必要があります。自動車業界でのテスト基準では、ソースに手を加える事自体を「御法度」と定めている場合もあります。
2つ目のテストデータ作成作業は、ソースコードをトレースしながら、入力変数へのデータパターンを作成する作業です。1つの関数に複数の入力条件がある場合、条件の組み合わせも考慮しながら、お互いの条件の依存性を検証しなければなりません。全ての組み合わせをデーター化すると、テストパターン数が天文学的な数になってしまい、テストが不可能であるため、一般に「直交表」「デシジョンテーブル」などのテストケース作成の手法を利用して、最小限のパターンを作成することが必要になります。
一般の組み込み製品には、数百、数千の関数が組み込まれており、ツールなどを効果的に利用して、工数をかけないテスト手法を取り入れることが必要になります。

組み込みソフト専用単体テストツール「カバレッジマスター」

ガイオはこのような課題を解決する、組み込みソフト検証に特化した単体テストツール「カバレッジマスター」を提供しています。実機を使用せず、PCだけで全ての単体テストを行うことができます。以下のような特徴があります。

・テスト実行環境にマイコンシミュレータ(ISS)を使用

ISSとは組み込みマイコンの実行コード(マシン語)を実行可能なシミュレータのことで、クロスコンパイラで生成したオブジェクトをそのまま実行します。実際の製品実装するコードを使用してテスト実行を行うため、PC上で単体テスト実行する他社のツールにありがちなソースの書き換えは一切必要ありません。 また、マイコンの演算器の動作をそのまま再現するため、各マイコン毎にことなるビット精度、アンダーフロー/オーバーフロー、丸め誤差などについても、基本的に実イコンと同じ動作が保証できます。

・テストデータ入力にはCSVファイルを使用

テストテータの入力には、汎用的なCSV形式のファイルを使用しており、ソースコード上の入力変数名や、関数名などをセルに直接書き込んでデータを作成することができます。対象のソースコードの変更なしで、テスト内容を全てCSVで設定することができます。

・C0パスカバレッジを自動レポート

関数に入出力テストの結果として、対象のソースコードが漏れなくテストされているかの指標となるC0カバレッジを自動レポートします。

カバレッジマスターVer2で実現!CASEツール「CasePlayer2」と連携したテストデータ作成支援機能

2006年4月にリリースを予定している「カバレッジマスターVer.2」では、ガイオのソース解析・プログラムチャート作成ツール 「CasePlayer2」と連携した、テストデータ作成機能がサポートされます。

入出力変数検索機能(ソースの静的解析結果を利用)

C言語ベースの組み込みソフト開発では、グローバル変数が多用されるケースが多くあります。 単体テストを行うためには、関数の入力条件となる変数を漏れなく設定する必要があります。
カバレッジマスターVer.2では、CasePlayer2の静的解析結果を利用して、対象の関数に必要な入力条件を自動的にリストアップする機能が備わっており、ソースコードをトレースして変数を探す手間を省くことができます。

変数/チャートブラウジング機能

カバレッジマスターVer.2での変数データ作成時に、CasePlayer2が作成したフローチャートや変数参照リストへリンクする機能が備わります。ビジュアル化されたチャートを利用することで、 ソースコード上での条件分岐のトレースの効率が向上します。

入力条件抽出機能

単体テストにおいて1つの入力変数がある場合には、 その変数が取り得るデータを全て試すことが理想です。 しかしながら、条件に対するしきい値に着目した場合、全ての条件をテストする必要はなく、 条件の中から必要な条件のみを抽出する方法が考えられています。例えば、「10以上20以下の整数」と言う条件がある場合、

・10以上20以下の整数
・ 9以下の整数
・ 21以上の整数

の3つを想定して、それらの代表値1つを試せば必要十分なテストになります。 これを 「同値分割」と呼んでいます。また、しきい値(境界値)に対してはその前後の1サンプルずつを使ってテストを行うのが一般的です。上の例の場合、

・しきい値10に対して→ 9、10、11
・ しきい値20に対して→ 19、20、21

を設定します。合計9通りのデータを試すだけで良いことになります。また、関数について特に考慮すべき条件(ポインタに対するNULL条件、除算に対する0設定など)をテストデータに加えます。カバレッジマスターVer.2では、1つの変数に着目した条件をリスト上で設定することができます。

組み合わせテストデータ作成機能 (「デシジョンデーブル」を使用)

入力変数が複数ある場合には、上で抽出した入力データの組み合わせを考える必要があります。全ての組み合わせを作成してしまうと、各変数のデータ個数のかけ算となり、数個変数があっただけで、テストパターンは膨大(上の例で、変数が5個あるだけで、9の5乗=59,049通り)になってしまいます。
そこで、お互いの変数条件の依存性を考慮しながら、「デシジョンテーブル」の手法を使用して、テストすべき組み合わせを限定する手法を採ります。これは、変数毎に組み合わせを行うデータを「代表値」として設定することで、そのデータについてのみ、他の変数との組み合わせを生成する手法です。各々の変数条件に依存性がある場合には、依存する可能性がある複数のデータを代表値として設定することで、組み合わせを網羅することができます。カバレッジマスターVer.2では、各変数毎に、この「代表値」を指定するだけで、必要な組み合わせパターンを自動生成します。

さいごに

カバレッジマスターは、2003年7月の製品発表以来、自動車ECUソフト開発を始め、多くのお客様にご利用頂いております。2006年4月に本特集で解説したVer.2をリリース致しますが、その後も、C1カバレッジの自動化、より体系的な結果レポートの出力機能のサポートを予定しております。
今後も、組み込みソフト開発特有の問題を解決できるスタンダードツールとして、バージョンアップを重ねて参ります。

人気のコラム

最新のコラム