(57)【要約】【課題】従来の有界モデル検査に基づくテストケース生成では、単一ステップのプログラムコードに対して試験を実行するが、複数のステップ処理に対するテストケース、すなわち試験用の時系列入力を自動生成できない課題があった。その結果、複数ステップにわたって実行した場合に到達不可能となる箇所を特定できない点が問題であった。【解決手段】１ステップ分のプログラムコードを複数ステップ分連結したプログラムコードを用いて、分岐箇所に到達するか否かを解析し、分岐箇所に到達する入出力変数を記録することで、複数ステップに対応したテストケースプログラムの生成を可能とする。【選択図】  図１
2014063415.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアのテスト仕様を生成するテストケース自動生成装置において、
プログラムコードの分岐箇所に到達したか否かを記録する記録文を前記分岐箇所に挿入する分岐記録文挿入手段と、
１ステップ分のプログラムコードを複数ステップ分連結する複数ステップ連結手段と、
前記複数ステップ分連結されたプログラムコードを実行した場合に前記分岐箇所に到達
するか否かを解析する解析手段と、
を備えることを特徴とするテストケース自動生成装置。
【請求項２】
前記解析手段は前記複数ステップ分連結されたプログラムコードを有界モデル検査用コードに変換して実行することを特徴とする請求項１に記載のテストケース自動生成装置。
【請求項３】
前記複数ステップ分連結されたプログラムコードは各ステップに入力または出力される大域変数を有し、前のステップによって決定された前記大域変数に応じて次のステップのプログラムコードの状態が決定されることを特徴とする請求項１乃至２のいずれか１項に記載のテストケース自動生成装置。
【請求項４】
前記解析手段は前記連結手段において連結されるプログラムコードのステップ数を増やしながら、前記解析手段での解析を繰り返すことを特徴とする請求項１乃至３のいずれか１項に記載のテストケース自動生成装置。
【請求項５】
請求項１乃至４のいずれか１項に記載のテストケース自動生成装置が備える前記各手段としての機能をコンピュータに実現させるためのテストケース自動生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は組み込みソフトウェアを含むソフトウェアのテスト仕様を自動的に生成するテストケース自動生成装置及びテストケース自動生成プログラムに関するものである。
【背景技術】
【０００２】
組込みリアルタイムソフトウェアは制御対象を監視し、リアルタイムに制御を行うためによく用いられている。この際、プログラムは作成が簡易で視認性の良い「モデル」として記述される場合が多い。モデルの制御ロジックを作成し、モデルに入力値を与えてシミュレーションを行うことで効率的なソフトウェア開発を行える。
【０００３】
組込みリアルタイムソフトウェア開発では、設計・プログラムコード作成工程とともに試験工程が重要となる。例えば、自動車におけるＩＳＯ２６２６２、宇宙航空におけるＤＯ−１７８Ｂなどの国際標準規格では、試験工程においてプログラムコード中の分岐箇所をすべて実行することが求められる。ここで、分岐箇所とはｉｆ，ｓｗｉｔｃｈなどの分岐条件を有する箇所であり、分岐箇所において真偽それぞれの場合を実行したかどうかの割合を分岐カバレッジとして表す。分岐箇所をすべて実行することは、分岐カバレッジ１００％が要求されることに相当し、全てのプログラムコードを実行し、バグを検出することを目的としている。しかし、テストケースの対象モデルが複雑な場合、コンピュータで解析できる限界を超え、テストケースの生成に多大な時間を要する場合がある。この場合、分岐カバレッジ１００％を満たせない場合も存在する。
【０００４】
これまでの例として、非特許文献１で開示されている有界モデル検査（Ｂｏｕｎｄｅｄ Ｍｏｄｅｌ Ｃｈｅｃｋｉｎｇ、ＢＭＣ）では、１ステップ分のプログラムコードを試験するための入力信号が生成され、この入力信号を用いてプログラムコードのループ構造を解析している。
【非特許文献１】Edmund Clarke, Daniel Kroening, Flavio Lerda,“A Tool for Checking ANSI-C Programs,” TACAS 2004, vol.2988 of LNCS, March 2004.
【発明の概要】
【発明が解決しようとする課題】
【０００５】
有界モデル検査に基づきプログラムコードを解析する従来のテストケース生成では、単一ステップのプログラムコードを実行する例が示されているが、複数ステップにわたってプログラムコードを実行する構成は示されていない。その結果、複数ステップの処理を行う際の試験用の時系列入力、すなわちテストケースを自動生成できない課題があった。また、複数ステップにわたって実行した場合に到達不可能となる箇所を特定できない問題があった。
さらに、既に実行したステップの状態に応じて次に実行するステップの状態が決定される状態依存処理のあるプログラムコードに対しても、全ての分岐箇所を実行するテストケースの生成が必要となる。しかし、従来技術は複数ステップにわたる処理に対応しておらず、状態依存処理を持つプログラムコードに対応できない問題があった。
【０００６】
この発明は上記のような問題点を解決するためになされたもので、プログラムコードを複数ステップにわたって実行する時系列入力を生成し、複数ステップにわたって実行した場合に論理的に到達不可能な箇所を特定できるテストケースのプログラムを自動生成することを目的としている。
【課題を解決するための手段】
【０００７】
上記の目的を達成するために、本発明におけるソフトウェアのテスト仕様を生成するテストケース自動生成装置は、プログラムコードの分岐箇所に到達したか否かを記録する記録文を前記分岐箇所に挿入する分岐記録文挿入手段と、１ステップ分のプログラムコードを複数ステップ分連結する複数ステップ連結手段と、前記複数ステップ分連結されたプログラムコードを実行した場合に前記分岐箇所に到達するか否かを解析する解析手段と、を備えることを特徴とする。
【発明の効果】
【０００８】
本発明にかかる発明では、プログラムコードを複数ステップにわたって実行する時系列入力を生成でき、論理的に到達不可能な箇所を特定することが可能となる。また、フィードバックなど状態依存処理があるプログラムコードに対しても、到達可能な分岐箇所を把握できるプログラムを生成できる。
【図面の簡単な説明】
【０００９】
【図１】本発明の実施の形態１に係るテストケース自動生成装置。
【図２】本発明の実施の形態１に係る基本プログラムコード。
【図３】本発明の実施の形態１に係るテストケース生成処理を示すフローチャート。
【図４】本発明の実施の形態１に係る分岐記録文を挿入したプログラムコード。
【図５】本発明の実施の形態１において複数ステップを連結した状態依存処理コード。
【図６】本発明の実施の形態１に係る有界モデル検査用状態依存処理コード。
【図７】本発明の実施の形態１において各分岐箇所に到達する時系列入力をまとめたテーブル。
【図８】本発明の実施の形態２に係る複数ステップ分を連結した状態依存処理コード。
【図９】本発明の実施の形態３に係るプログラムコード。
【図１０】本発明の実施の形態４に係るコンピュータの構成。
【発明を実施するための形態】
【００１０】
実施の形態１．
本実施の形態では、プログラムを複数ステップにわたって実行する場合の試験用の時系列入力を生成し、論理的に到達不可能な箇所を特定できるテストケースを自動生成する構成を開示する。図１は本発明の実施の形態１におけるテストケース自動生成装置の全体構成を示している。
【００１１】
図において、１０１はプログラムコード格納部、１０２はプログラムコード内の分岐箇所に到達したか否かを記録する分岐記録文を挿入する分岐記録文挿入部、１０３は入出力変数格納部、１０４は１ステップ分のプログラムコードとその入出力変数を識別する情報から複数ステップ分連結したコードを作成する複数ステップ連結部、１０５は複数ステップ分連結された状態依存処理コードを格納する状態依存処理コード格納部、１０６は従来の有界モデル検査で解析できる形式にプログラムコードを変換する有界モデル検査用コード変換部、１０７は有界モデル検査用に変換されたコードを格納する有界モデル検査用の状態処理依存コード格納部、１０８は有界モデル検査を用いて状態依存処理コードを解析し、各分岐記録文に到達する入力変数値を把握する入力変数値計算部、１０９は入力変数値計算部で計算された入力変数の値からテストケースとして用いる時系列入力を作成する時系列入力生成部、１１０は作成された時系列入力を記憶するための時系列入力記憶部、１１１は時系列入力生成部で分岐記録文に到達する時系列入力を作成できなかった箇所を特定する到達不能解析部、１１２は到達不能箇所記憶部、１１３は１０５から１１２までの部分をまとめて解析部として表している。ここで、状態依存処理コードとはステップごとの動作が特定のパラメータまたは状態に依存して決定されるプログラムのコードを表す。
【００１２】
図２は本発明が対象とするプログラムコードの典型的な構造を示している。２０１は入力変数、２０２は出力変数、２０３は１ステップ分の関数、２０４は分岐処理、２０５は繰り返し処理、２０６は周期実行、２０７は過去の処理結果を保存している大域変数を示している。また、図３は図１に基づく本発明の実施の形態１におけるテストケース生成の処理手順を示すフローチャートである。
【００１３】
本実施の形態では、図２に示すようにプログラムコードに対して入力変数２０１を与え、過去の処理結果を保存している大域変数２０７の読み込みや書き出しを行いながら、ｉｆ文などの分岐処理やｗｈｉｌｅ文などの繰り返し処理を進める。複数ステップにわたって実行を行い、論理的に到達不可能な分岐箇所を特定することで、各ステップでの入力変数と到達可能な分岐箇所の関係を明らかにする。また、各ステップで入力すべき変数を格納し、テストケースのプログラムを自動生成する。入力変数２０１、出力変数２０２は、各ステップごとに与えられる入力変数、出力変数であり、大域変数２０７は状態に依存して決定される大域変数である。このような処理により、複数ステップにわたって実行する時系列入力を生成し、複数ステップにわたって実行した場合に論理的に到達不可能な箇所を特定できるテストケースのプログラムを自動生成する。また、大域変数２０７は第１のステップの状態に応じて書き出され、その値に応じて第２のステップの状態が決定される。本実施の形態では、このような状態依存処理のあるプログラムコードに対応したテストケースを生成する。
【００１４】
なお、１ステップ分の関数の中には、自身の関数の再帰呼び出しや、関数呼び出しが連なって自身に戻ってくる循環呼び出しなどの処理が含まれても構わない。また、入力変数２０１、出力変数２０２、大域変数２０７は、基本型（整数、浮動小数点など）や構造型（同じ種類の基本型の集合である配列、異なる種類の基本型の集合である構造体など）などいかなる型の変数であっても構わない。
【００１５】
図３を参照しながら、この動作を実現するための制御について説明する。分岐記録分挿入部１０２では、プログラムコード格納部１０１からプログラムコードを読み込み、プログラムコードに入力を与えたときに分岐箇所に到達したか記録するための分岐記録文を全ての分岐箇所に挿入する（Ｓ３０１）。具体的には、ｉｆ文などの分岐処理の各分岐先の先頭部分、ｗｈｉｌｅ文などの繰り返し処理の内側の先頭部分を分岐箇所として識別する。次に、複数ステップ連結部１０４では、入出力変数格納部１０３から与えられた入出力変数を識別する情報に基づき、分岐記録文を挿入したプログラムコードの１ステップ分の関数を入出力変数を用いて複数ステップ分連結した状態依存処理コードを作成する（Ｓ３０２）。作成された状態依存処理コードは記憶部１０５に格納される。さらに、有界モデル検査用コード変換部１０６では、状態依存処理コードを従来の有界モデル検査で解析できる形式に変換する（Ｓ３０３）。入力変数値計算部１０８では、有界モデル検査を用いて状態依存処理コード１０７をステップごとに解析し、各ステップにおいて分岐記録文に到達するための入力変数の値を計算する。具体的には、有界モデル検査に基づき、各分岐箇所に到達したか否かを特定し（Ｓ３０４）、分岐箇所に到達した場合には（Ｓ３０５）、その入力変数値を計算する（Ｓ３０６）。その入力変数値を計算して、次のステップに進み（Ｓ３０８）、ステップ数が最大でない場合はＳ３０４からＳ３０６の処理を繰り返す（Ｓ３０７）。ステップ数が最大となる場合は（Ｓ３０７）、時系列入力生成部１０９において入力変数値計算部１０８で計算した入力変数の値から、プログラムコードに対するテストケースとなる時系列入力を作成し、時系列入力記憶部１１０に格納する（Ｓ３０９）。到達不能解析部１１１では、時系列入力生成部で分岐記録文に到達する時系列入力を作成できなかった箇所を、到達不能箇所１１２として格納する（Ｓ３１０）。
【００１６】
本制御における入力はプログラムコードとその入出力変数を識別する情報であり、本制御による出力はテストケースとなる時系列入力と、どのような時系列入力を与えても到達不可能な箇所である。この出力によって、テストケースで到達可能な個所とその入力変数に関する情報が得られ、実際のテスト段階においてその情報を用いてプログラムの試験を円滑に行うことができる。
【００１７】
図３の制御において分岐箇所に到達する入力変数を計算するＳ３０４からＳ３０６までの１ステップ分の処理手順は従来の有界モデル検査に基づくものである。本実施の形態の特徴は、分岐箇所に到達する入力変数を複数のステップに対して計算するＳ３０７、Ｓ３０８の処理にある。また、複数のステップに対する入力変数を連結する部分（Ｓ３０９）、到達不能箇所１１２を特定する処理（Ｓ３１０）を行う部分も本発明の特徴である。すなわち、本実施の形態では大域変数２０７を用いて複数ステップのプログラムコードを実行し、複数ステップに対応して入力変数の計算、到達不能箇所の特定を行う構成を新たに示している。
【００１８】
図４は図３のＳ３０１において、分岐箇所に到達したか記録するための分岐記録文を挿入したプログラムコードを示している。図２と同一部分には同一符号を付して説明を省略する。分岐箇所として識別するのは、ｉｆ文などの分岐処理２０４の各分岐先の先頭部分４０１、４０２と、ｗｈｉｌｅ文などの繰り返し処理２０５の内側の先頭部分４０３である。分岐記録文では、その分岐箇所に到達した際にその情報が記録される。その結果、どの分岐条件に達したかを把握することが可能となる。
【００１９】
以降では、説明を簡単化するため、入力変数に関する説明を中心に行い、出力変数に関する説明を適宜省略する。しかし、これはプログラムコードに出力変数がないことを意味するものではない。また、有界モデル検査用の状態依存処理コードに作成する際に、ループ構造（関数内のｗｈｉｌｅ文などの繰り返し処理、自身の関数の再帰呼び出し、関数呼び出しが連なって自身に戻ってくる循環呼び出し）に関する説明を適宜省略する。しかし、これはプログラムコードにループ構造がないことを意味するものではない。
【００２０】
図５は図３のＳ３０２において、複数ステップ分を連結した状態依存処理コードを示している。図において、５０１、５０２、５０３は各ステップにおける入力変数、５０４は大域変数を表している。本図では衝突を避けるため、各ステップでの入力変数５０１、５０２、５０３および出力変数の変数名を異なる名前としている。一方、過去の処理結果を保存する大域変数５０４は変数名を変更せず、関数内での読み込み処理や書き出し処理の変数名も変更しない。
【００２１】
図６は図３のＳ３０３において、状態依存処理コードを有界モデル検査で解析できる形式に変換したプログラムコードを示している。６０１は状態依存処理コード、６０２は有界モデル検査用の状態依存処理コード、６０３、６０４、６０５は各ステップにおける入力変数、６０６は大域変数、６０７は有界モデル検査、６０８は時系列入力生成処理、６０９は各分岐の到達解析を表す。図６では状態依存処理コード６０１を有界モデル検査で解析できる形式６０２に変換する（図３のＳ３０３に相当）。さらに、未到達の分岐記録文について、有界モデル検査を用いて到達可能か到達不能かを解析する（Ｓ３０４に相当）。分岐箇所に到達可能の場合は、分岐条件を満たす入力変数の値を計算する（Ｓ３０５，Ｓ３０６に相当）。一度到達した分岐記録文（２ステップ目以降における分岐記録文Ａ）は解析対象から除外する。計算した入力変数値を分岐記録文ごとに保存して、状態依存処理コードに含まれる最大ステップ数まで繰り返す。また、分岐記録文ごとに保存した分岐箇所への到達時の入力変数値を時間軸に沿って連結し、プログラムコード中の分岐箇所を実行するためのテストケースとなる時系列入力６０８を作成する（Ｓ３０９に相当）。最後に、各分岐の到達解析６０９において状態依存処理コードに含まれる最大ステップまで解析し、未到達の分岐記録文を、論理的に到達不可能な箇所と判定する（Ｓ３１０に相当）。
【００２２】
図７にＳ３１０において記録された到達可能／不能箇所及び各分岐箇所に到達する時系列入力をまとめたテーブルを示す。図において、分岐記録文Ａには入力変数ｉ１，ｊ１のときに到達しており、その入力変数と到達可能であることが示されている。また、一旦到達した後は、解析対象から除外されるため、それ以降の入力変数は入力されない。一方、分岐記録文Ｂには複数のステップを重ねた後に到達するため、到達するまでの各ステップにおける入力変数が本テーブルに記載されている。分岐記録文Ｃには到達しなかったため、到達不能と判定される。
【００２３】
以上のように本発明では、大域変数２０７を用いて複数ステップのプログラムコードを実行し、複数ステップに対応して入力変数の計算、到達不能箇所の特定を行う構成を新たに示している。その結果、以下に示す効果を得ることができる。
１）プログラムコード中の各分岐箇所に到達可能な時系列入力を自動生成することで、
テストケースの作成工数を削減できる。
２）プログラムコードを複数ステップにわたって実行しても論理的に到達不可能な箇所
を特定することで、分岐カバレッジが１００％にならない場合の正当な証拠を得ら
れる。
３）プログラムコード中の各分岐箇所に到達するテストケースを１つだけにすることで、テスト実施工数を削減できる。
【００２４】
実施の形態２．
実施の形態１では、入力変数と関数を複数ステップ分連結して状態依存処理コードを作成してから有界モデル検査で解析する方法を説明した。これに対して、本実施の形態では、入力変数と関数の連結を１ステップずつ増やしながら、段階的に有界モデル検査で解析する方法を説明する。
【００２５】
実施の形態１では、複数ステップ連結部１０４において入力変数と関数を複数ステップ分連結して状態依存処理コードを作成し（Ｓ３０２）、その後分岐箇所に到達する入力変数を計算した。しかし、複数ステップ連結部１０４において連結するステップ数は任意の値とすることも可能である。
【００２６】
そこで、本実施の形態では、図８に示すように入力変数と関数の連結を１ステップずつ増やしながら段階的に有界モデル検査で解析する。
【００２７】
具体的には、まず１ステップ分の状態依存処理コードを作成して、実施の形態１と同様に処理して長さ１の時系列入力を生成し、１ステップでの時系列入力と到達不能箇所を求める。次に、２ステップ分連結した状態依存処理コードを作成して、１ステップでの到達不能箇所を対象に実施の形態１と同様に処理して長さ２の時系列入力を生成し、２ステップでの到達不能箇所を求める。この動作を最大ステップ数まで繰り返し、ここまでに求めたすべての時系列入力をテストケースとする。また、未到達の分岐記録文を論理的に到達不可能な箇所として判定する。
【００２８】
有界モデル検査を用いる場合、プログラムコードの規模や複雑さが大きくなると状態爆発により解析不能に陥り、テストケースを一つも生成できないことが起こり得る。このような場合においても本実施の形態では、有界モデル検査が解析不能に陥るまでは、テストケースを部分的に生成することができる。その結果、計算可能な範囲において時系列入力と到達不能箇所を生成することができる利点がある。また、プログラムコードの規模や複雑さが大きくなっても、テストケースを部分的に生成することで、テストケース作成工数を削減できる利点がある。
【００２９】
実施の形態３．
実施の形態１では、プログラムコードの入出力変数を異なる変数として定義し、各関数でそれぞれ個別の変数を読み込み／書き出す方法について説明した。しかし、図９に示すように、各関数に関数の入力引数９０１、関数の戻り値９０２、９０３を定義し、各関数に入力変数９０４を入力し、出力変数９０５を受け取るようにプログラムコードを書くことも可能である。
本実施の形態によっても、実施の形態１と同様の効果を得ることができる。
【００３０】
実施の形態４．
実施の形態１〜３に記載されたテストケース自動生成装置は、メモリや補助記憶装置等のハードウェアの存在を前提として、ＣＰＵによって実行されるテーブル作成等のプログラムに基づき実現される。図１０に本構成を実現するコンピュータの構成を示す。図１０において、コンピュータ１００１はＣＤ−ＲＯＭ駆動装置１００２、ＲＡＭ１００３、ＲＯＭ１００４、ＨＤＤ（ハードディスクドライブ）１００５、ＣＰＵ１００６等から構成されている。その他、ディスプレイ、入力部などは省略されている。 
【００３１】
実施の形態１〜３に記載されたテストケース自動生成装置を実行するプログラムの一部または全部は、例えば、そのプログラムを記録したＣＤ−ＲＯＭ等のコンピュータ読み取り可能な記録媒体によって提供される。使用者は、このプログラムの記録媒体としてのＣＤ−ＲＯＭを購入して、ＣＤ−ＲＯＭ駆動装置１００２に装着し、そのＣＤ−ＲＯＭからそのプログラムを読み出してテストケース自動生成装置の補助記憶装置、例えば、ＲＡＭ１００３、ＲＯＭ１００４、ＨＤＤ（ハードディスクドライブ）などにインストールし、実行することができる。このように、実施の形態１〜３に示す各機能をコンピュータに実行させるプログラムの形態として提供することもできる。
【符号の説明】
【００３２】
１０１：プログラムコード格納部
１０２：分岐記録文挿入部
１０３：入出力変数格納部
１０４：複数ステップ連結部
１０５：状態依存処理コード
１０６：有界モデル検査用コード変換部
１０７：有界モデル検査用コード格納部
１０８：入力変数値計算部
１０９：時系列入力生成部
１１０：時系列入力記憶部
１１１：到達不能解析部
１１２：到達不能箇所記憶部
１１３：解析部
２０１：入力変数
２０２：出力変数
２０３：１ステップ分の関数
２０４：分岐処理
２０５：繰り返し処理
２０６：周期実行
２０７：大域変数
４０１：入力変数
４０２：出力変数
４０３：分岐処理
４０４：繰り返し処理
４０５：大域変数
５０１、５０２、５０３：入力変数
５０４：大域変数
６０１：状態依存処理コード
６０２：有界モデル検査用の状態依存処理コード
６０３、６０４、６０５：各ステップにおける入力変数
６０６：大域変数
６０７：有界モデル検査
６０８：時系列入力生成処理
６０９：各分岐の到達解析
９０１：関数の入力引数
９０２、９０３：関数の戻り値
９０４：入力変数
９０５：出力変数
１００１：コンピュータ
１００２：ＣＤ−ＲＯＭ駆動装置
１００３：ＲＡＭ
１００４：ＲＯＭ
１００５：ＨＤＤ（ハードディスクドライブ）
１００６：ＣＰＵ
【図１】
2014063415.tif 000003
【図２】
2014063415.tif 000004
【図３】
2014063415.tif 000005
【図４】
2014063415.tif 000006
【図５】
2014063415.tif 000007
【図６】
2014063415.tif 000008
【図７】
2014063415.tif 000009
【図８】
2014063415.tif 000010
【図９】
2014063415.tif 000011
【図１０】
2014063415.tif 000012