JP6583033B2 - ドライバ生成プログラム、装置、及び方法 - Google Patents

ドライバ生成プログラム、装置、及び方法 Download PDF

Info

Publication number
JP6583033B2
JP6583033B2 JP2016024930A JP2016024930A JP6583033B2 JP 6583033 B2 JP6583033 B2 JP 6583033B2 JP 2016024930 A JP2016024930 A JP 2016024930A JP 2016024930 A JP2016024930 A JP 2016024930A JP 6583033 B2 JP6583033 B2 JP 6583033B2
Authority
JP
Japan
Prior art keywords
array
index
driver
test target
program
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2016024930A
Other languages
English (en)
Other versions
JP2017142733A (ja
Inventor
スッパシット モンプラターンチャイ
スッパシット モンプラターンチャイ
忠弘 上原
忠弘 上原
竜一 梅川
竜一 梅川
英生 谷田
英生 谷田
朝子 片山
朝子 片山
裕介 佐々木
裕介 佐々木
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2016024930A priority Critical patent/JP6583033B2/ja
Publication of JP2017142733A publication Critical patent/JP2017142733A/ja
Application granted granted Critical
Publication of JP6583033B2 publication Critical patent/JP6583033B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Description

開示の技術は、ドライバ生成プログラム、ドライバ生成装置、及びドライバ生成方法に関する。
シンボリック実行技術によるプログラムのテスト技術において、テスト対象のプログラムの実行環境を構築及び設定し、テスト対象のプログラムを起動するプログラムであるドライバを生成する技術が存在する。
例えば、記号テストドライバを反復生成する方法が提案されている。この方法では、1又は複数のコンピューティング装置により、評価されるべきコンピューティング装置に対する命令を決定し、評価されるべき1又は複数の命令及び該命令の一部に対応する記号変数の指示を有する第1の記号テストドライバを生成する。そして、記号変数に関して命令を記号実行し、記号実行の結果から、記号変数の所与の値で命令を実行する1又は複数のコマンドを有するテストケースを決定する。また、コマンド内のオブジェクト指向プログラミングコンポーネントの1又は複数の呼び出しを決定し、決定した呼び出しに基づき呼び出しを有する新しい記号テストドライバを生成する。そして、新しい記号テストドライバを記号実行する。
また、プログラムの中には、オブジェクトや配列型の変数など、非プリミティブな変数が含まれる場合がある。このようなプログラムについて、プログラムのコンパイルやプログラムコードの修正等に関する技術が提案されている。
例えば、主記憶装置の配列領域のサイズ以上の配列領域を必要とするプログラムに対し、主記憶装置と拡張記憶装置との間のデータ転送文を考慮することなく、ソースプログラムに対応した目的プログラムを生成する手法が提案されている。
また、プログラム中から型や添字範囲の宣言を取り出して変数構造体に置き換えてシミュレートして最大値などを収集し、適切な型や添字範囲に自動修正する手法が提案されている。
特開2014−21982号公報 特開平06−348505号公報 特開平07−281905号公報
シンボリック実行のためのドライバ生成において、シンボル化したい変数がオブジェクトや配列型などの非プリミティブな変数の場合には、その変数の値のバリエーションをドライバに設定する。
しかし、配列型の変数の中には、プログラムの実行中に、配列の要素数が動的に変更されるものもあり、プログラムコードの静的解析からは、配列の要素数を把握することが困難な場合がある。配列の要素数が適切に把握できない場合には、その配列のバリエーションを適切にドライバに設定することができないため、テストの実行が失敗したり、テスト網羅性が低下したりする場合がある。
開示の技術は、一つの側面として、要素数が動的に変更される配列型の変数をシンボル化の対象とする場合でも、テストの実行失敗及びテスト網羅性の低下を抑制するシンボリック実行のドライバを生成することを目的とする。
開示の技術は、一つの態様として、テスト対象のプログラムから、配列にアクセスする命令に含まれ、かつ該配列の要素を指定する指数を抽出し、抽出した指数に基づいて、前記テスト対象のプログラムからアクセスされる配列の最大指数を算出する。そして、前記テスト対象のプログラムのシンボリック実行時におけるシンボル化対象の配列のバリエーションとして、算出した前記最大指数に対応する要素数の配列のバリエーションを設定したドライバを生成する。
一つの側面として、要素数が動的に変更される配列型の変数をシンボル化の対象とする場合でも、テストの実行失敗及びテスト網羅性の低下を抑制するシンボリック実行のドライバを生成することができる、という効果を有する。
本実施形態に係るドライバ生成装置の概略構成を示す機能ブロック図である。 シンボリック実行技術を用いたプログラムの単体テストの手順を説明するための図である。 ドライバの基本構成部分を説明するための図である。 非プリミティブ型の変数のバリエーションが設定されたドライバを説明するための図である。 動的配列型の変数をシンボル化することを想定したドライバの生成を説明するための図である。 配列のバリエーションが設定されたドライバを説明するための図である。 ドライバ生成装置として機能するコンピュータの概略構成を示すブロック図である。 ドライバ生成処理の一例を示すフローチャートである。 動的配列型の変数の抽出を説明するための図である。 スタブの一例を示す図である。 テスト対象クラスを制御フローに変換した一例を示す図である。 制御パスから抽出された実行パスの一例を示す図である。 指数の値の計算を説明するための図である。 最大指数算出処理の一例を示すフローチャートである。 最大指数の算出を説明するための図である。 配列の要素を削除する命令により削除される要素数を加算する理由を説明するための図である。 最大指数に応じた要素数の配列のバリエーションが設定されたドライバを説明するための図である。 スタブが変更された際の最大指数の再算出を説明するための図である。 最大指数の更新に応じて配列のバリエーションが追加設定されたドライバを説明するための図である。
以下、図面を参照して、開示の技術に関する実施形態の一例を詳細に説明する。なお、本実施形態では、テスト対象プログラムを、Java(登録商標)で記述されたクラス及びメソッドとする場合を例に説明する。
図1に示すように、本実施形態に係るドライバ生成装置10は、テスト対象クラス31を入力として受け付ける。そして、ドライバ生成装置10は、テスト対象クラス31から、シンボリック実行ドライバ33及びスタブ32を生成して出力する。
なお、シンボリック実行ドライバ33(以下、単に「ドライバ33」という。)とは、テスト対象クラス31の実行環境を構築及び設定し、テスト対象クラス31を起動するプログラムである。また、スタブ32とは、テスト対象クラス31が呼び出すプログラム部品のダミー実装である。テスト対象クラス31から呼び出されるプログラム部品は、テスト対象クラス31のテスト段階では、実装途中であったり、そのプログラム部品のテストが未実施であったりする場合がある。また、プログラム部品が、ファイルやデータベースなどへの外部アクセスを実行するものである場合もある。このような理由で、テスト時において、テスト対象クラス31から呼び出されるプログラム部品を利用できない場合には、実際のプログラム部品の代わりにスタブ32を用いる。
ここで、シンボリック実行技術を用いたプログラムの単体テストの手順について説明する。
図2に示すように、まず、ドライバ33及びスタブ32を生成する(S100)。次に、生成したドライバ33及びスタブ32と、テスト対象クラス31とをシンボリック実行エンジン200に入力し、シンボリック実行エンジン200でテストケースが生成される(S101)。そして、生成されたテストケースを使って、単体テストツール201によりテストを実行することにより、テスト対象クラス31についてのテスト結果が得られる(S103)。
シンボリック実行ドライバ33の基本的な構成には、シンボル変数宣言、テスト対象オブジェクト生成、及びテスト対象クラス呼出の3つの部分が含まれる。例えば、図3右図に示すドライバ33A(Driver01)が、図3左図に示すテスト対象クラス31A(TargetClass01)に対応するドライバ31であるとする。なお、この例では、テスト対象クラス31A内の変数str及びiをシンボル化することを想定している。
シンボル変数宣言は、破線部41Aで示す部分である。シンボル変数宣言の部分では、例えば、@Symbolicなどのアノテーションを付加して、シンボル化したい変数が指定される。シンボル変数宣言された変数には、任意の初期値を設定することができる。テスト対象オブジェクト生成は、破線部42Aで示す部分である。テスト対象オブジェクト生成の部分では、テスト対象クラス31Aがインスタンス化される。テスト対象クラス呼出は、破線部43Aで示す部分である。テスト対象クラス呼出では、シンボル変数を引数で渡して、テスト対象クラス31A内のメソッド(method1)を実行する。
なお、ドライバ33は、テスト対象クラス31に含まれる1メソッドにつき1つ必要である。
上記のシンボル変数宣言において、@Symbolicでシンボル化が可能な変数は、プリミティブなデータ型の変数のみである。プリミティブなデータ型の変数であれば、シンボル変数として宣言しておくことで、シンボリック実行エンジン200によるシンボリック実行の際に、シンボル化された変数のバリエーションを解析しながら実行パスが抽出される。
シンボル化したい変数がオブジェクト型の場合には、テスト対象クラス31を、例えば、ASMなどのフリーソフトを用いて静的解析して、オブジェクト内のプリミティブなデータ型の変数を抽出する。そして、抽出した変数をシンボル変数宣言すると共に、オブジェクトのバリエーションを設定する。
例えば、図4右図に示すドライバ33B(Driver02)が、図4左図に示すテスト対象クラス31B(TargetClass02)に対応するドライバであるとする。なお、この例では、テスト対象クラス31B内の変数pをシンボル化することを想定している。変数pは、ユーザ定義オブジェクトPersonの変数であり、プリミティブなデータ型ではないため、@Symbolicによるシンボル変数宣言はできない。この場合、ユーザ定義オブジェクトPersonのユーザ定義オブジェクトクラス34Bからプリミティブなデータ型の変数ageを抽出し、シンボル変数宣言する(破線部41Bの3〜4行目)。なお、同じくプリミティブなデータ型の変数nameについては、テスト対象クラス31B内で使用されていないため、シンボル変数宣言されていない。
また、テスト対象クラス31Bを解析すると、変数pがnullか否か、及びageが20より小さいか否かで分岐する条件文が存在することがわかる(テスト対象クラス31Bの3〜4行目)。そこで、変数pがnullの場合とnullではない場合のバリエーションを生成する(破線部41Bの1〜2行目及び破線部44B)。これにより、シンボル変数宣言した変数ageとあわせて、変数pについて、null、age<20のオブジェクトp、及びage≧20のオブジェクトpのバリエーションが設定される。シンボリック実行時には、上記のようにバリエーションが設定された変数pが、テスト対象クラス呼出(破線部43B)で引数として渡され、テスト対象クラス31A内のメソッド(method2)が実行される。
シンボル化したい変数が、プログラム実行中に配列の要素数が動的に変更される動的配列型の変数(例えば、ArrayListなど)の場合には、シグネチャを分析するだけでは、その配列の要素数を把握することができない。例えば、図5に示すテスト対象クラス31C(TargetClass03)に対応するドライバとして、変数x及びlistをシンボル化することを想定したドライバを生成することを考える。この場合、図5の破線部51に示すように、シグネチャからは変数listのサイズ(配列の要素数)を把握することはできない。
また、配列型の変数にアクセスする命令には、配列の要素を指定する指数が含まれる。例えば、ArrayListの場合は、getメソッドの引数として指数が指定される。なお、本実施形態では、要素数がnの配列の指数は、0,1,・・・,n−1とする。ここで、破線部52に示すように、LibClass.lib01()で参照される参照ライブラリ35Cには、ユーザが入力した値を返却することが規定されている。すなわち、LibClass.lib01()は不定値であるため、list.get(b+LibClass.lib01())は、listのどの要素にアクセスする命令であるかを把握することができない。
このような動的配列型の変数をシンボル化の対象とする場合、配列の要素数を予め定めた固定の値とし、その要素数に対応する配列のバリエーションを生成することが考えられる。
図6に、テスト対象クラス31C(TargetClass03)について、要素数を2として、変数listの配列のバリエーションを設定したドライバ33Cの例を示す。この例では、破線部41Cの1〜2行目及び破線部44Cにより、変数listの配列のバリエーションとして、null、空配列、1要素を持つ配列、及び2要素を持つ配列が設定されている。また、破線部41Cの3〜4行目は、配列のサイズを制御するための変数をシンボル変数宣言したものである。また、破線部41Cの5〜8行目は、配列の各要素の値(プリミティブなデータ型)をシンボル変数宣言したものである。
このように、配列の要素数を固定した場合、テスト対象クラス31内に、固定した要素数以上の配列の位置にアクセスする命令が存在する場合には、テスト対象クラス31の実行時にエラーが発生し、テストの実行が失敗してしまう。例えば、図6に示すテスト対象クラス31Cをドライバ33C(要素数=2で固定)で実行した場合において、10行目でLibClass.lib01()の返却値が1以上であるとする。この場合、指数は2以上となり、最大でも指数0及び1に対応する2要素しか持たない変数listの配列にアクセスすることができず、NullPointerExceptionの例外が発生する。15行目では、指数は4であるため、同様に、NullPointerExceptionの例外が発生する。また、4行目及び16行目からi=0,1,2,3であることが分かるが、17行目でi=3の場合も同様に、NullPointerExceptionの例外が発生する。
また、テスト対象クラス31内に、配列の要素数に応じて分岐する条件文が存在する場合、固定した要素数ではない値に応じた分岐先の命令が実行されず、テスト網羅性(コードカバレッジ)が低下する場合がある。例えば、図6に示すテスト対象クラス31Cをドライバ33C(要素数=2で固定)で実行した場合、変数listの配列のバリエーションとして、要素数が4以上の配列のバリエーションは存在しない。そのため、5行目の条件分岐は常にtrueとなり、falseの場合の分岐先である8行目以降の命令が実行されない。これにより、コードカバレッジが100%にならない。
そこで、本実施形態では、動的配列型の変数をシンボル化する際の配列のバリエーションを最適化してドライバ33を生成する。以下、ドライバ生成装置10の各部について詳述する。
図1に示すように、ドライバ生成装置10は、機能的には、スタブ生成部11と、算出部12と、ドライバ生成部13とを含む。
スタブ生成部11は、入力されたテスト対象クラス31から、シンボリック実行時に呼び出されるスタブ32を生成する。スタブの生成方法は、従来既知の手法を用いることができるため、本実施形態では詳細な説明を省略する。
算出部12は、テスト対象クラス31から、シンボル化対象の変数である配列にアクセスする命令に含まれる指数を抽出する。そして、算出部12は、抽出した指数に基づいて、テスト対象クラス31における、シンボル化対象の変数である配列にアクセスする際に用いられる指数の最大値(以下、「最大指数」という)を算出する。
具体的には、算出部12は、テスト対象クラス31からシンボル化対象の動的配列型の変数を抽出し、集合SYM21に格納する。また、算出部12は、テスト対象クラス31のプログラムコードを、Control Flow Graph Generatorなどのフリーソフトを用いて、制御フローに変換する。そして、算出部12は、制御フローをトラバースして、配列にアクセスする命令を探索し、その命令に含まれる指数を抽出し、集合INDEX22に格納する。INDEX22は、シンボル化対象の動的配列型の変数毎に用意される。
また、算出部12は、テスト対象クラス31から整数型のローカル変数を抽出し、集合VAR23に格納する。そして、算出部12は、INDEX22に格納された指数が、テスト対象クラス31に含まれる整数型の変数を使用している場合には、制御フローをトラバースして、その整数型の変数が取り得る最大値を算出し、VAR23に記録する。また、算出部12は、INDEX22に格納された指数が、スタブ32からの返却値を使用している場合には、スタブ32からの返却値を取得する。また、算出部12は、テスト対象クラス31に含まれる、シンボル化対象の変数である配列の要素を削除する命令の数を削除カウンタ24に記録する。例えばArrayListの場合は、配列の要素を削除する命令はremoveメソッド等である。なお、削除カウンタ24は、シンボル化対象の動的配列型の変数毎に用意される。そして、算出部12は、SYM21、INDEX22、VAR23、及び削除カウンタ24に格納された値を用いて、最大指数を算出する。
また、算出部12は、スタブ32のプログラムコードが変更され、スタブ32からの返却値が変更された場合には、最大指数を再算出する。
ドライバ生成部13は、算出部12により算出された最大指数に対応する要素数の配列のバリエーションを設定したドライバ33を生成する。最大指数に対応する要素数とは、ここでは、最大指数を尾指数(配列の末尾の要素に対応する指数)とする要素数までの各要素数である。具体的には、ドライバ生成部13は、最大指数がn−1の場合、要素数が0,1,・・・,nの各々となる配列のバリエーションを設定したドライバ33を生成する。
また、ドライバ生成部13は、算出部12により最大指数が再算出され、最大指数が新たな値に更新された場合には、更新された最大指数の値に応じて、ドライバ33に配列のバリエーションを追加設定する。
ドライバ生成装置10は、例えば、図7に示すコンピュータ60で実現することができる。コンピュータ60はCPU61、一時記憶領域としてのメモリ62、及び不揮発性の記憶部63を備える。また、コンピュータ60は、表示装置及び入力装置等の入出力装置64、記録媒体69に対するデータの読み込みと書き込みとを制御するread/write(R/W)部65、及びインターネット等のネットワークに接続されるネットワークinterface(I/F)66を備える。CPU61、メモリ62、記憶部63、入出力装置64、R/W部65、及びネットワークI/F66は、バス67を介して互いに接続される。
記憶部63は、Hard Disk Drive(HDD)、solid state drive(SSD)、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部63には、コンピュータ60をドライバ生成装置10として機能させるためのドライバ生成プログラム70が記憶される。
CPU61は、ドライバ生成プログラム70を記憶部63から読み出してメモリ62に展開し、ドライバ生成プログラム70が有するプロセスを順次実行する。ドライバ生成プログラム70は、スタブ生成プロセス71と、算出プロセス72と、ドライバ生成プロセス73とを有する。CPU61は、スタブ生成プロセス71を実行することで、図1に示すスタブ生成部11として動作する。また、CPU61は、算出プロセス72を実行することで、図1に示す算出部12として動作する。また、CPU61は、ドライバ生成プロセス73を実行することで、図1に示すドライバ生成部13として動作する。これにより、ドライバ生成プログラム70を実行したコンピュータ60が、ドライバ生成装置10として機能することになる。
なお、ドライバ生成プログラム70により実現される機能は、例えば半導体集積回路、より詳しくはApplication Specific Integrated Circuit(ASIC)等で実現することも可能である。
次に、本実施形態に係るドライバ生成装置10の作用について説明する。ドライバ生成装置10にテスト対象クラス31が入力されると、ドライバ生成装置10において、図8に示すドライバ生成処理が実行される。なお、ここでは、図9左図に示すようなテスト対象クラス31C(TargetClass03)が入力され、テスト対象クラス31Cの整数型の変数x、及び動的配列型の変数listをシンボル化の対象とする場合について説明する。また、テスト対象クラス31Cの10行目では、参照ライブラリ35Cが参照される。
図8に示すドライバ生成処理のステップS11で、算出部12が、シンボル化対象の動的配列型の変数を格納するための集合SYM21、及び整数型のローカル変数を格納するための集合VAR23の各々を空集合として用意する。
次に、ステップS12で、算出部12は、テスト対象クラス31Cからシンボル化対象の動的配列型の変数を抽出し、SYM21に格納する。ここでは、図9の(1)に示すように、変数listがSYM21に格納される。
次に、ステップS13で、算出部12が、SYM21に格納した変数k毎に、空集合の集合INDEX22、及び初期値(0)に設定された削除カウンタ24を用意する。ここでは、図9の(2)に示すように、変数listについてのINDEXlist22及び削除カウンタlist24が用意される。
次に、ステップS14で、スタブ生成部11が、参照ライブラリ35Cのダミー部品として、図10に示すようなスタブ32Cを生成する。図10の例では、スタブ32Cは、テスト対象クラス31Cの10行目の実行時に、LibClass.lib01())で呼び出され、返却値として「0」を返却する。
次に、ステップS15で、算出部12が、テスト対象クラス31Cのプログラムコードを制御フローに変換する。ここでは、テスト対象クラス31Cのプログラムコードは、図11に示すような制御フローに変換される。
次に、ステップS16で、算出部12が、制御フローをトラバースして、全ての実行パスを抽出する。ここでは、図12に示すように、8通りの実行パスが抽出される。なお、図12に示す実行パスのA、B、・・・は、図11に示す制御フローの各命令文(ステップ)に付した符号に対応している。
次に、ステップS17で、算出部12が、各実行パスをトラバースして、整数型のローカル変数を抽出し、抽出したローカル変数をVAR23に格納する。具体的には、算出部12が図12に示す実行パス1をトラバースする際に、図13の(1)に示すように、整数型のローカル変数aを含む命令文A、ローカル変数bを含む命令文B、及びローカル変数iを含む命令文Lの各々を通る。そこで、算出部12は、ローカル変数a、b、及びiを抽出し、抽出したローカル変数a、b、及びiをVAR23に格納する。他の実行パス2〜8をトラバースした場合も同じ抽出結果になるため、最終的には、図13の(2)に示すように、VAR23に、ローカル変数a、b、及びiの3つの変数が格納された状態となる。
次に、ステップS20で、図14に詳細を示す最大指数算出処理が実行される。
最大指数算出処理のステップS21で、算出部12が、SYM21に格納された各変数kについて、各実行パスをトラバースして、変数kにアクセスする命令に含まれる指数を抽出し、INDEX22に格納する。
具体的には、算出部12が実行パス1をトラバースする際に、図13の(3)に示すように、変数listにアクセスする命令文F、G、及びKの各々を通る。そこで、算出部12は、命令文F、G、及びKの各々に含まれる指数a、b+LibClass.lib01()、及び4をINDEXlist22に格納する。また、算出部12が実行パス5をトラバースする際に、図13の(4)に示すように、変数listにアクセスする命令文F、G、K、及びNの各々を通る。そこで、算出部12は、初めて通った命令文Nに含まれる指数iをINDEXlist22に格納する。他の実行パス2〜4及び6〜8をトラバースした場合には、初めて通る命令文は存在しない。そのため、最終的には、図13の(5)に示すように、INDEXlist22に、a、b+LibClass.lib01()、4、及びiの4つの指数が格納された状態となる。
次に、ステップS22で、算出部12が、変数kの配列から要素を削除する命令をカウントし、削除カウンタ24にセットする。具体的には、算出部12が実行パス3をトラバースする際に、図13の(5)に示すようにし、変数listの配列から要素を削除する命令文Jを通る。そこで、算出部12は、削除カウンタlist24の値を1インクリメントする。実行パス4、7、及び8でも命令文Jを通るが、命令文Jは実行パス3で1回通ったため、同じ命令文について2回目以降に通る場合にはカウントしない。最終的には、図13の(6)に示すように、削除カウンタlist24の値は1となる。
次に、ステップS23で、VAR23に格納された各ローカル変数jについて、各実行パスをトラバースして、各ローカル変数jが取り得る最大値を算出し、VAR23に記録する。
具体的には、算出部12は、VAR23に格納されたローカル変数aについて、実行パス1をトラバースして、命令文Aでa=1に初期化し、命令文Dで1加算してa=2を得る。また、算出部12は、実行パス2をトラバースして、命令文Aでa=1に初期化し、命令文Eで1減算してa=0を得る。算出部12は、実行パス3、5、及び7のトラバースでは、実行パス1と同様に、a=2を得る。また、算出部12は、実行パス4、6、及び8のトラバースでは、実行パス2と同様に、a=0を得る。したがって、算出部12は、ローカル変数aの最大値を、MAX(0,2)=2と算出し、ローカル変数aに対応付けて、最大値2をVAR23に記録する。
また、算出部12は、VAR23に格納されたローカル変数bについて、実行パス1をトラバースして、命令文Bでb=2を得る。ローカル変数bについては、他のいずれの実行パスのトラバースでも同様の結果となる。したがって、算出部12は、ローカル変数bの最大値を、MAX(2)=2と算出し、ローカル変数bに対応付けて、最大値2をVAR23に記録する。
また、算出部12は、VAR23に格納されたローカル変数iについて、実行パス1をトラバースして、命令文Lでi=1を得る。算出部12は、実行パス2、3、及び4のトラバースでは、実行パス1と同様に、i=1を得る。また、算出部12は、実行パス5をトラバースして、命令文Mで、iの値はb*2−1まで命令文Oの1加算の計算を繰り返すため、i=1+(b*2−1)=b*2を得る。ローカル変数bの最大値は2であるため、算出部12は、ローカル変数iの最大値を、MAX(1,b*2)=MAX(1,MAX(b)*2)=MAX(1,2*2)=MAX(1,4)=4と算出する。そして、算出部12は、ローカル変数iに対応付けて、最大値4をVAR23に記録する。
これにより、VAR23は、最終的には、図13の(7)に示すように、各ローカル変数とその最大値とが格納された状態となる。
次に、ステップS24で、算出部12が、VAR23に格納された各ローカル変数jの最大値、及び削除カウンタ24の値を用いて、各変数kの最大指数を算出し、INDEX22に記録する。
具体的には、図15に示すように、INDEXlist22に格納された各指数がローカル変数を含む場合には、算出部12は、VAR23に記録されている各ローカル変数の最大値をその指数に代入する。例えば、算出部12は、INDEXlist22に格納されている指数aに、VAR23に記録されているローカル変数aの最大値2を代入する。
また、INDEXlist22に格納された各指数がスタブ32からの返却値を含む場合には、算出部12は、スタブ生成部11により生成されたスタブ32を参照して、スタブ32の返却値をその指数に代入する。例えば、算出部12は、INDEXlist22に格納されている指数b+LibClass.lib01()に含まれるLibClass.lib01()に、スタブ32Cからの返却値0を代入する。
そして、算出部12は、INDEXlist22に格納された値の最大値を取得し、その最大値に削除カウンタlist24の値を加算した値を、変数listについての最大指数として算出し、INDEXlist22に記録する。ここでは、図15に示すように、INDEXlist22に格納された値の最大値は4であり、これに削除カウンタlist24の値1が加算され、変数listについての最大指数は5となる。
ここで、指数の最大値に削除カウンタ24の値を加算する理由について説明する。
要素を削除する前の配列がn個の要素を持つ場合において、要素をm個削除すると、その配列の尾指数はn−1−mになる。配列の指数p(削除カウンタ24の値を加算する前の指数の最大値)にアクセスするとき、n−1−mがp以上でないと、NullPointerExceptionの例外が発生する。そのため、n−1−n≧p(つまりn−1≧p+m)の条件を満たすように、指数pに少なくともmの値を加算して最大指数を算出する必要がある。すなわち、指数pは、テスト対象クラス31で使用される指数の最大値ではあるが、実際の配列の要素数の最大値を算出するためには、配列の要素を削除する命令も考慮する必要がある。
例えば、テスト対象クラス31Cの10行目の段階(命令文G、図9及び図11参照)で、配列が図16に示すように5個の要素を持っているとする。この場合、配列の尾指数は4である。テスト対象クラス31Cの11〜14行目(命令文H、I、及びJ、図9及び図11参照)が、図16の枠53内に相当する。配列の要素が1つ削除されると要素数は4となり、尾指数は3となる。この場合、テスト対象クラス31Cの15行目(命令文K、図9及び図11参照)で配列の指数4にアクセスした際に、NullPointerExceptionの例外が発生する。なお、配列の要素を追加する命令については、配列へのアクセスに用いる指数より、実際の配列の指数の方が大きくなる処理であるため、特に考慮する必要はない。
SYM21に格納された各変数kについての最大指数の算出が終了すると、最大指数算出処理は終了し、処理は図8に示すドライバ生成処理に戻る。
次に、ドライバ生成処理のステップS31で、ドライバ生成部13が、INDEX22に記録された各変数kの最大指数を尾指数とする要素数までの各要素数の配列のバリエーションを設定したドライバ33を生成する。例えば、変数listについての最大指数が5と算出されている場合には、ドライバ生成部13は、図17の破線部46に示すように、要素数が0、1、2、3、4、5、及び6の配列のバリエーションを、ドライバ33Dに設定する。
次に、ステップS32で、算出部12が、上記ステップS14で生成されたスタブ32が、例えばユーザにより修正されるなどして、変更されたか否かを判定する。例えば、スタブ32が変更された場合に、その旨を示すフラグを設定しておいたり、上記ステップS14で生成されたスタブ32と、本ステップ実行時におけるスタブ32とに差分があるか否かを判定したりすることにより、本ステップの判定を行うことができる。スタブ32が変更されている場合には、処理は図14に示す最大指数算出処理のステップS23へ移行する。
スタブ32が変更された後のステップS23及びS24では、算出部12が、変更後のスタブ32の返却値を用いて、各変数kについての最大指数を再算出する。例えば、図18に示すように、LibClass.lib01()で呼び出されるスタブ32Cの返却値が0から3に変更されたとする。この場合、図18の破線の楕円部で示すように、変数listについての最大指数は5から6に更新される。
次に、図8に示すドライバ生成処理に戻り、ステップS31で、ドライバ生成部13が、更新された最大指数の値に応じて、ドライバ33に配列のバリエーションを追加設定する。図18に示すように、変数listについての最大指数が5から6に更新された場合には、ドライバ生成部13は、図19の破線部47に示すように、要素数が7の配列のバリエーションをドライバ33Dに追加設定する。
なお、スタブ32からの返却値が変更されても、スタブ32からの返却値を使用する指数より大きな値の指数がINDEX22に存在する場合には、前回算出された最大指数は更新されない。その場合には、ドライバ生成部13による配列のバリエーションの追加も行われない。
ステップS32で、スタブ32が変更されていないと判定されると、ドライバ生成処理は終了する。
以上説明したように、本実施形態に係るドライバ生成装置によれば、テスト対象クラスにおいて、配列にアクセスする命令に含まれる指数の最大値に対応する要素数の配列のバリエーションを設定したドライバを生成する。このように生成されたドライバを用いてシンボリック実行によりテストケースを生成すると、配列にアクセスする命令箇所でのテストの実行失敗を抑制することができる。また、配列の要素数に応じた条件分岐においても、何れかの分岐先の命令が実行されないといったテスト網羅性の低下を抑制することができる。これにより、テストの効率化が図れる。
例えば、図9に示すテスト対象クラス31Cに対して、図10に示すスタブ32C(LibClass.lib01()に対する返却値が0)、及び図17に示すドライバ33Dが生成されたとする。ドライバ33Dには、要素数が0、1、2、3、4、5、及び6の配列のバリエーションが設定されている。
このドライバ33Dでテスト対象クラス31Cを実行した場合、LibClass.lib01()の返却値は0であるため、10行目において、list.get(2+0)でlistにアクセスされる。ドライバ33Dには、要素数が3以上の配列のバリエーションが存在するため、NullPointerExceptionの例外は発生せず、list.get(2+0)が問題なく実行される。
また、テスト対象クラス31Cの15行目のlist.get(4)についても、ドライバ33Dには、要素数が5以上の配列のバリエーションが存在するため、NullPointerExceptionの例外は発生せず、list.get(4)が問題なく実行される。
また、テスト対象クラス31Cの17行目のlist.get(i)について、i=0,1,2,3であるが、ドライバ33Dには、要素数が1〜4の各配列のバリエーションが存在する。そのため、NullPointerExceptionの例外は発生せず、list.get(i)が問題なく実行される。
また、ドライバ33Dには、要素数が3以下の配列のバリエーションも、要素数が4以上の配列のバリエーションも存在する。したがって、5行目の条件分岐は、trueの場合及びfalseの場合共に実行され、コードカバレッジが向上する。
なお、上記実施形態では、Java(登録商標)で記述されたクラス及びメソッドを、テスト対象のプログラムとする場合について説明したが、これに限定されない。開示の技術は、他の言語で記述されたプログラム、特に、オブジェクト指向言語で記述されたプログラムに適用可能である。
また、上記では、ドライバ生成プログラム70が記憶部63に予め記憶(インストール)されている態様を説明したが、これに限定されない。開示の技術に係るプログラムは、CD−ROM、DVD−ROM、USBメモリ等の記録媒体に記録された形態で提供することも可能である。
以上の実施形態に関し、更に以下の付記を開示する。
(付記1)
コンピュータに、
テスト対象のプログラムから、配列にアクセスする命令に含まれ、かつ該配列の要素を指定する指数を抽出し、抽出した指数に基づいて、前記テスト対象のプログラムからアクセスされる配列の最大指数を算出し、
前記テスト対象のプログラムのシンボリック実行時におけるシンボル化対象の配列のバリエーションとして、算出した前記最大指数に対応する要素数の配列のバリエーションを設定したドライバを生成する
ことを含む処理を実行させるドライバ生成プログラム。
(付記2)
前記最大指数を算出する際に、前記テスト対象のプログラムに含まれる変数が使用されている指数については、該変数が取り得る最大値を用いて該指数の値を計算する付記1記載のドライバ生成プログラム。
(付記3)
前記最大指数を算出する際に、前記テスト対象のプログラムのシンボリック実行時に該テスト対象のプログラムから呼び出されるスタブの返却値を使用する指数については、該返却値を用いて該指数の値を計算する付記1又は付記2記載のドライバ生成プログラム。
(付記4)
前記スタブの返却値が変更された場合には、前記最大指数を再度算出し、該最大指数が更新された場合には、前記ドライバに設定する配列のバリエーションを追加する付記3記載のドライバ生成プログラム。
(付記5)
前記テスト対象のプログラムに配列の要素を削除する命令が含まれる場合、抽出した指数の値の最大値に、前記配列の要素を削除する命令により削除される要素数を加算した値を、前記最大指数として算出する付記1〜付記4のいずれか1項記載のドライバ生成プログラム。
(付記6)
前記指数を抽出する際、前記テスト対象のプログラムを制御フローに変換し、該制御フローをトラバースして、前記配列にアクセスする命令を探索する付記1〜付記5のいずれか1項記載のドライバ生成プログラム。
(付記7)
前記配列のバリエーションは、0から前記最大指数に1加算した値まで1ずつ加算した値の各々を要素数とする配列の各々である付記1〜付記6のいずれか1項記載のドライバ生成プログラム。
(付記8)
テスト対象のプログラムから、配列にアクセスする命令に含まれ、かつ該配列の要素を指定する指数を抽出し、抽出した指数に基づいて、前記テスト対象のプログラムからアクセスされる配列の最大指数を算出する算出部と、
前記テスト対象のプログラムのシンボリック実行時におけるシンボル化対象の配列のバリエーションとして、算出した前記最大指数に対応する要素数の配列のバリエーションを設定したドライバを生成する生成部と、
を含むドライバ生成装置。
(付記9)
前記算出部は、前記最大指数を算出する際に、前記テスト対象のプログラムに含まれる変数が使用されている指数については、該変数が取り得る最大値を用いて該指数の値を計算する付記8記載のドライバ生成装置。
(付記10)
前記算出部は、前記最大指数を算出する際に、前記テスト対象のプログラムのシンボリック実行時に該テスト対象のプログラムから呼び出されるスタブの返却値を使用する指数については、該返却値を用いて該指数の値を計算する付記8又は付記9記載のドライバ生成装置。
(付記11)
前記スタブの返却値が変更された場合には、前記算出部は、前記最大指数を再度算出し、該最大指数が更新された場合には、前記生成部は、前記ドライバに設定する配列のバリエーションを追加する付記10記載のドライバ生成装置。
(付記12)
前記算出部は、前記テスト対象のプログラムに配列の要素を削除する命令が含まれる場合、抽出した指数の値の最大値に、前記配列の要素を削除する命令により削除される要素数を加算した値を、前記最大指数として算出する付記8〜付記11のいずれか1項記載のドライバ生成装置。
(付記13)
前記算出部は、前記指数を抽出する際、前記テスト対象のプログラムを制御フローに変換し、該制御フローをトラバースして、前記配列にアクセスする命令を探索する付記8〜付記12のいずれか1項記載のドライバ生成装置。
(付記14)
前記配列のバリエーションは、0から前記最大指数に1加算した値まで1ずつ加算した値の各々を要素数とする配列の各々である付記8〜付記13のいずれか1項記載のドライバ生成装置。
(付記15)
コンピュータに、
テスト対象のプログラムから、配列にアクセスする命令に含まれ、かつ該配列の要素を指定する指数を抽出し、抽出した指数に基づいて、前記テスト対象のプログラムからアクセスされる配列の最大指数を算出し、
前記テスト対象のプログラムのシンボリック実行時におけるシンボル化対象の配列のバリエーションとして、算出した前記最大指数に対応する要素数の配列のバリエーションを設定したドライバを生成する
ことを含む処理を実行させるドライバ生成方法。
(付記16)
前記最大指数を算出する際に、前記テスト対象のプログラムに含まれる変数が使用されている指数については、該変数が取り得る最大値を用いて該指数の値を計算する付記15記載のドライバ生成方法。
(付記17)
前記最大指数を算出する際に、前記テスト対象のプログラムのシンボリック実行時に該テスト対象のプログラムから呼び出されるスタブの返却値を使用する指数については、該返却値を用いて該指数の値を計算する付記15又は付記16記載のドライバ生成方法。
(付記18)
前記スタブの返却値が変更された場合には、前記最大指数を再度算出し、該最大指数が更新された場合には、前記ドライバに設定する配列のバリエーションを追加する付記17記載のドライバ生成方法。
(付記19)
前記テスト対象のプログラムに配列の要素を削除する命令が含まれる場合、抽出した指数の値の最大値に、前記配列の要素を削除する命令により削除される要素数を加算した値を、前記最大指数として算出する付記15〜付記18のいずれか1項記載のドライバ生成方法。
(付記20)
前記指数を抽出する際、前記テスト対象のプログラムを制御フローに変換し、該制御フローをトラバースして、前記配列にアクセスする命令を探索する付記15〜付記19のいずれか1項記載のドライバ生成方法。
(付記21)
前記配列のバリエーションは、0から前記最大指数に1加算した値まで1ずつ加算した値の各々を要素数とする配列の各々である付記15〜付記20のいずれか1項記載のドライバ生成方法。
(付記22)
コンピュータに、
テスト対象のプログラムから、配列にアクセスする命令に含まれ、かつ該配列の要素を指定する指数を抽出し、抽出した指数に基づいて、前記テスト対象のプログラムからアクセスされる配列の最大指数を算出し、
前記テスト対象のプログラムのシンボリック実行時におけるシンボル化対象の配列のバリエーションとして、算出した前記最大指数に対応する要素数の配列のバリエーションを設定したドライバを生成する
ことを含む処理を実行させるドライバ生成プログラムを記憶した記憶媒体。
10 ドライバ生成装置
11 スタブ生成部
12 算出部
13 ドライバ生成部
21 SYM集合
22 INDEX集合
23 VAR集合
24 削除カウンタ
31 テスト対象クラス
32 スタブ
33 ドライバ
60 コンピュータ
61 CPU
62 メモリ
63 記憶部
69 記録媒体
70 ドライバ生成プログラム

Claims (9)

  1. コンピュータに、
    テスト対象のプログラムから、配列にアクセスする命令に含まれ、かつ該配列の要素を指定する指数を抽出し、抽出した指数に基づいて、前記テスト対象のプログラムからアクセスされる配列の最大指数を算出し、
    前記テスト対象のプログラムのシンボリック実行時におけるシンボル化対象の配列のバリエーションとして、算出した前記最大指数に対応する要素数の配列のバリエーションを設定したドライバを生成する
    ことを含む処理を実行させるドライバ生成プログラム。
  2. 前記最大指数を算出する際に、前記テスト対象のプログラムに含まれる変数が使用されている指数については、該変数が取り得る最大値を用いて該指数の値を計算する請求項1記載のドライバ生成プログラム。
  3. 前記最大指数を算出する際に、前記テスト対象のプログラムのシンボリック実行時に該テスト対象のプログラムから呼び出されるスタブの返却値を使用する指数については、該返却値を用いて該指数の値を計算する請求項1又は請求項2記載のドライバ生成プログラム。
  4. 前記スタブの返却値が変更された場合には、前記最大指数を再度算出し、該最大指数が更新された場合には、前記ドライバに設定する配列のバリエーションを追加する請求項3記載のドライバ生成プログラム。
  5. 前記テスト対象のプログラムに配列の要素を削除する命令が含まれる場合、抽出した指数の値の最大値に、前記配列の要素を削除する命令により削除される要素数を加算した値を、前記最大指数として算出する請求項1〜請求項4のいずれか1項記載のドライバ生成プログラム。
  6. 前記指数を抽出する際、前記テスト対象のプログラムを制御フローに変換し、該制御フローをトラバースして、前記配列にアクセスする命令を探索する請求項1〜請求項5のいずれか1項記載のドライバ生成プログラム。
  7. 前記配列のバリエーションは、0から前記最大指数に1加算した値まで1ずつ加算した値の各々を要素数とする配列の各々である請求項1〜請求項6のいずれか1項記載のドライバ生成プログラム。
  8. テスト対象のプログラムから、配列にアクセスする命令に含まれ、かつ該配列の要素を指定する指数を抽出し、抽出した指数に基づいて、前記テスト対象のプログラムからアクセスされる配列の最大指数を算出する算出部と、
    前記テスト対象のプログラムのシンボリック実行時におけるシンボル化対象の配列のバリエーションとして、算出した前記最大指数に対応する要素数の配列のバリエーションを設定したドライバを生成する生成部と、
    を含むドライバ生成装置。
  9. コンピュータに、
    テスト対象のプログラムから、配列にアクセスする命令に含まれ、かつ該配列の要素を指定する指数を抽出し、抽出した指数に基づいて、前記テスト対象のプログラムからアクセスされる配列の最大指数を算出し、
    前記テスト対象のプログラムのシンボリック実行時におけるシンボル化対象の配列のバリエーションとして、算出した前記最大指数に対応する要素数の配列のバリエーションを設定したドライバを生成する
    ことを含む処理を実行させるドライバ生成方法。
JP2016024930A 2016-02-12 2016-02-12 ドライバ生成プログラム、装置、及び方法 Active JP6583033B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2016024930A JP6583033B2 (ja) 2016-02-12 2016-02-12 ドライバ生成プログラム、装置、及び方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016024930A JP6583033B2 (ja) 2016-02-12 2016-02-12 ドライバ生成プログラム、装置、及び方法

Publications (2)

Publication Number Publication Date
JP2017142733A JP2017142733A (ja) 2017-08-17
JP6583033B2 true JP6583033B2 (ja) 2019-10-02

Family

ID=59627342

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016024930A Active JP6583033B2 (ja) 2016-02-12 2016-02-12 ドライバ生成プログラム、装置、及び方法

Country Status (1)

Country Link
JP (1) JP6583033B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023210159A1 (ja) * 2022-04-27 2023-11-02 ソニーグループ株式会社 情報処理装置及び情報処理方法、並びにコンピュータプログラム

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0421030A (ja) * 1990-05-14 1992-01-24 Hitachi Ltd 配列の宣言範囲外参照の検出オブジェクト生成方式
JP5556655B2 (ja) * 2010-12-28 2014-07-23 富士通株式会社 解析支援プログラム,解析支援装置および解析支援方法
JP5884657B2 (ja) * 2012-06-22 2016-03-15 富士通株式会社 プログラム、テストケース生成方法およびテストケース生成装置
US9436587B2 (en) * 2014-01-31 2016-09-06 Fujitsu Limited Test context generation

Also Published As

Publication number Publication date
JP2017142733A (ja) 2017-08-17

Similar Documents

Publication Publication Date Title
JP5652326B2 (ja) ソフトウェアモジュールのテスト方法及びシステム
US20140380279A1 (en) Prioritizing test cases using multiple variables
US10394694B2 (en) Unexplored branch search in hybrid fuzz testing of software binaries
JP2005302028A (ja) プログラムを計装するプローブ最適化のための方法およびシステム
JP6253521B2 (ja) プログラム可視化装置、プログラム可視化方法、及びプログラム可視化プログラム
JP6003699B2 (ja) テストデータ生成プログラム、方法及び装置
US20120185669A1 (en) Program inspection method and non-transitory, computer readable storage medium storing inspection program
JP5403999B2 (ja) トンネリング及びスライシング・ベースのbmc分解のためのシステム及び方法
US20130212565A1 (en) Application analysis method, analysis system and recording medium
JP6701799B2 (ja) データ源解析に基づく逐次反復的な試験生成
JP6583033B2 (ja) ドライバ生成プログラム、装置、及び方法
JP6730587B2 (ja) キャッシュミス推定プログラム、キャッシュミス推定方法及び情報処理装置
US10102099B2 (en) Performance information generating method, information processing apparatus and computer-readable storage medium storing performance information generation program
JP2009104252A (ja) デバッグ支援装置およびデバッグ支援方法
JP5887811B2 (ja) コンパイル装置、コンパイル方法、コンパイルプログラム、記録媒体
JP7380851B2 (ja) テストスクリプト生成装置、テストスクリプト生成方法及びプログラム
JP6512032B2 (ja) スタブ化対象判定装置、方法、及びプログラム
JP5578625B2 (ja) プログラム分析装置、プログラム分析方法、及びプログラム
JP2008090699A (ja) トレースロギング方法、装置及びプログラム
JP6390217B2 (ja) ソフトウェア変更プログラム、ソフトウェア変更装置、及びソフトウェア変更方法
JP2018147114A (ja) テストケース生成方法、計算機及びプログラム
JPWO2019142266A1 (ja) テストケース生成装置、テストケース生成方法およびテストケース生成プログラム
Letychevskyi et al. Fuzz Testing Technique and its Use in Cybersecurity Tasks
US20230222376A1 (en) Dynamic quantum compute insertion
JP6081144B2 (ja) ソースコード解析装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20181011

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20190708

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20190806

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190819

R150 Certificate of patent or registration of utility model

Ref document number: 6583033

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150