JP2018147114A - テストケース生成方法、計算機及びプログラム - Google Patents

テストケース生成方法、計算機及びプログラム Download PDF

Info

Publication number
JP2018147114A
JP2018147114A JP2017039785A JP2017039785A JP2018147114A JP 2018147114 A JP2018147114 A JP 2018147114A JP 2017039785 A JP2017039785 A JP 2017039785A JP 2017039785 A JP2017039785 A JP 2017039785A JP 2018147114 A JP2018147114 A JP 2018147114A
Authority
JP
Japan
Prior art keywords
function
test case
calling
value
computer
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.)
Granted
Application number
JP2017039785A
Other languages
English (en)
Other versions
JP6693898B2 (ja
Inventor
浩気 大林
Hiroki Obayashi
浩気 大林
秀行 鹿糠
Hideyuki Kanuka
秀行 鹿糠
洋子 上野
Yoko Ueno
洋子 上野
鈴木 哲也
Tetsuya Suzuki
哲也 鈴木
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.)
Hitachi Ltd
Original Assignee
Hitachi 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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2017039785A priority Critical patent/JP6693898B2/ja
Publication of JP2018147114A publication Critical patent/JP2018147114A/ja
Application granted granted Critical
Publication of JP6693898B2 publication Critical patent/JP6693898B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Abstract

【課題】下位関数から順番に記号実行を実施することで自動的に下位関数の単体テストの結果相当のデータを生成する。【解決手段】プロセッサとメモリを有する計算機でソースコードのテストケースを生成するテストケース生成方法であって、計算機がソースコードを読み込み、ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する。また、計算機は、被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施し、呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成する。【選択図】図2

Description

本発明は、ソフトウェアのテストにおいて記号実行技術を用いてテストケースを自動生成する技術に関する。
ソフトウェアのテストを行う技術として、記号実行技術が知られている。記号実行とは関数の入力値を1、10などの具体的な数値ではなく、x、yなどの記号値として実行する技術である(例えば非特許文献1を参照)。
記号実行技術を用いてプログラムの経路を解析することができ、プログラムの経路を網羅するようなテストケースを得ることができる。
吉原 慧、高田 眞吾、"記号的実行による統合テスト用テストデータ自動生成"、情報処理学会第72回全国大会講演論文集、2P-5、2010年3月8日、P1-467〜P1-468頁
記号実行技術の問題として、プログラムが大規模、複雑になると経路の組合せ爆発により計算時間が膨大になるということが知られている。これに対して、前記非特許文献1には、記号実行の際に下位関数の呼出し箇所を記号実行せずに、単体テスト結果に置き換えることにより、経路の組合せ爆発を抑制する方法が公開されている。
しかし、非特許文献1には、単体テストの結果を用意する方法について具体的に明示されていない。また、非特許文献1には、用意する単体テストの具体的な入力値によっては、呼出し側関数の経路を網羅するために必要な出力値が得られず、生成されるテストケースの網羅性が低下するという問題があった。
そこで、本発明では、下位関数から順番に記号実行を実施することで自動的に下位関数の単体テストの結果相当のデータを生成し、また、記号実行を用いて経路を網羅するために必要な出力値を準備することで生成されるテストケースの網羅性を確保する方法を提供する。
本発明は、プロセッサとメモリを有する計算機でソースコードのテストケースを生成するテストケース生成方法であって、前記計算機が、前記ソースコードを読み込む第1のステップと、前記計算機が、前記ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する第2のステップと、前記計算機が、前記被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施する第3のステップと、前記計算機が、前記呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成する第4のステップと、を含む。
本発明によれば、記号実行技術を用いてテストケースを生成する際に、生成されるテストケースによるプログラムの実行経路の網羅性を低下させずに、計算量を削減する事ができる。
本発明の実施例を示し、テストケース生成システムのハードウェア構成を示すブロック図である。 本発明の実施例を示し、テストケース生成システムのソフトウェア部分の構成を示すブロック図である。 本発明の実施例を示し、テストケースの生成対象となるソースコードの一例を示す図である。 本発明の実施例を示し、関数情報記憶部のデータ構造を示す図である。 本発明の実施例を示し、テストケース情報記憶部のデータ構造を示す図である。 本発明の実施例を示し、コールグラフの一例を示す図である。 本発明の実施例を示し、必要戻り値解析処理の一例を示す図である。 本発明の実施例を示し、テストケース生成処理の一例を示す図である。 本発明の実施例を示し、テストケース生成処理の一例を示す図である。 本発明の実施例を示し、全体の処理の一例を示すフローチャートである。 本発明の実施例を示し、関数情報解析処理の一例を示すフローチャートである。 本発明の実施例を示し、入力値生成順序決定処理の一例を示すフローチャートである。 本発明の実施例を示し、必要戻り値解析処理の一例を示すフローチャートである。 本発明の実施例を示し、入力値生成処理の一例を示すフローチャートである。 従来の問題点の一例を示す図である。
以下、本発明に係るテストケース生成システムの一実施例について説明する。
図1は、本発明の実施例を示し、テストケース生成装置1のハードウェア構成を示すブロック図である。
図1に示すようにテストケース生成装置1は、例えば、パーソナルコンピュータやサーバや専用ハードウェアなどであり、CPU(Central Processing Unit)4と、ROM(Read Only Memory)5と、RAM(Random Access Memory)6と、HDD(Hard Disk Drive)7と、入力装置9と、表示装置10と、通信I/F11と、CDROMドライブ12が、BUS8により接続された計算機である。
CPU4は、コンピュータの主要な部分であって、演算処理および各部を制御するデバイスであり、HDD7に格納されたプログラムを、RAM6にロードして実行する。ROM5は、起動プログラムであるBIOSやUEFIなどを記憶する読み出し専用の半導体記憶装置である。
RAM6は、OS(Operating System)やアプリケーションソフトウェアなどの各種プログラムやワークデータ等を記憶する書き換え可能な半導体記憶装置であり、テストケース生成装置1の主記憶装置である。
HDD7は、大容量の記憶装置であり、OSやアプリケーションソフトウェアなどの各種プログラムや、プログラムに使用されるデータなどを格納する補助記憶装置である。CDROMドライブ12は、CDROM(Compact Disc Read Only Memory)12Aに記憶されたプログラムやデータを読み取る装置である。
通信I/F11は、ネットワーク(図示省略)との通信を制御する装置である。入力装置9は、各種操作指示を行うキーボードやマウスなどのポインティングデバイスである。表示装置8は、各種情報を表示するLCD(Liquid Crystal Display)などの表示のための装置である。
なお、各種プログラムやデータ等を格納するのは、HDD7に限らずSSD(Solid State Drive)などの半導体記憶装置なども用いることができ、記憶媒体としてはCDROM12Aに限らずDVDやその他の磁気、光学、半導体などを用いた媒体を用いることができる。また、通信I/F11を介してネットワーク(図示省略)からプログラムやデータをダウンロードしてHDD7やRAM6に記憶してもよい。なお、プログラムやデータは、特定のOS上で稼働するか、OSを必要としないか、特定のOSやアプリケーション群を構成するファイルの一部であるかは問わない。
本実施形態のテストケース生成装置1は、図1に示したハードウェア構成で、HDD7に格納されたアプリケーションソフトウェアが、RAM6にロードされて、CPU4がプログラムを解釈実行することにより、その機能が実行される。
図2は、テストケース生成装置1のソフトウェア部分の構成を示すブロック図である。
図2に示すように、テストケース生成装置1のソフトウェア部分は、テストケース生成プログラム13と記憶部14と記号実行部22より構成される。
テストケース生成プログラム13はテストケース生成装置1のアプリケーションソフトウェアであり、ソースコード内の関数定義を解析し関数情報を関数情報記憶部に格納する関数情報解析部15と、関数間の呼出し関係に基づき関数のテスト入力値を生成する順序を決定する入力値生成順序決定部16と、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する必要戻り値解析部17と、呼出し側と被呼出し側全ての関数内の経路を網羅するためのテスト入力値を生成するテストケース生成部18を有する。
なお、本実施例の経路とは、関数の出力値や条件分岐によって異なる処理を実行する手順の集合とする。
記憶部14はテストケース生成装置1の記憶領域で、テストケース生成対象のソースコードが格納されているソースコード記憶部19と、テストケース生成プログラム13に使用されるデータベースでありテストケース生成対象となる関数の情報を記憶する関数情報記憶部20と、テストケース生成プログラム13に使用されるデータベースであり、生成されたテストケースの情報を記憶するテストケース情報記憶部21を有する。記憶部14は、例えば、HDD7等の記憶領域に設定することができる。
記号実行部22はテストケース生成プログラム13に使用される外部モジュールであり、前記背景技術の非特許文献1で述べた記号実行技術を用いて経路を網羅するための関数の入力値及び出力値を生成する機能を有する。
関数情報解析部15と、入力値生成順序決定部16と、必要戻り値解析部17と、テストケース生成部18の各機能部はプログラムとしてRAM6にロードされる。
CPU4は、各機能部のプログラムに従って処理することによって、所定の機能を提供する機能部として稼働する。例えば、CPU4は、関数情報解析プログラムに従って処理することで関数情報解析部15として機能する。他のプログラムについても同様である。さらに、CPU4は、各プログラムが実行する複数の処理のそれぞれの機能を提供する機能部としても稼働する。計算機及び計算機システムは、これらの機能部を含む装置及びシステムである。
テストケース生成装置1の各機能を実現するプログラム、テーブル等の情報は、HDD7や不揮発性半導体メモリ、SSD等の記憶デバイス、または、ICカード、SDカード、DVD等の計算機読み取り可能な非一時的データ記憶媒体に格納することができる。
図3は、ソースコード記憶部19に格納されているテストケース生成対象のソースコードの一例を示す図である。
ソースコード30は、関数funcA(31)と、関数funcB(32)と、関数funcC(33)と、関数funcD(34)を含み、関数funcB(32)には関数funcD(34)の演算結果が含まれている。
図4は、関数情報記憶部20のデータ構造の一例を示す図である。関数情報記憶部20は、関数IDフィールド20Aと、関数名フィールド20Bと、呼出し関数リストフィールド20Cと、入力値生成順序フィールド20Dと、必要戻り値リストフィールド20Eとを一つのレコードに含む。
関数IDフィールド20Aは、関数を一意に識別するための識別情報を格納する。関数名フィールド20Bは、当該関数の名前を格納する。呼出し関数リストフィールド20Cは、当該関数が関数の処理の中で呼出ししている他の関数全ての名前をリスト形式で格納する。
入力値生成順序フィールド20Dは、入力値生成順序決定部16によって決定された当該関数の入力値生成順序を格納する。必要戻り値リストフィールド20Eは、必要戻り値解析部17によって算出された当該関数を呼出す関数の経路を網羅するために必要となる当該関数の戻り値全てをリスト形式で格納する。
図5は、テストケース情報記憶部21のデータ構造の一例を示す図である。
テストケース情報記憶部21は、テストケースIDフィールド21Aと、関数IDフィールド21Bと、入力値リストフィールド21Cと、出力値フィールド21Dを一つのレコードに含む。
テストケースIDフィールド21Aは、テストケースを一意に識別するための識別情報を格納する。関数IDフィールド21Bは、当該テストケースが対象とする関数の識別情報を格納する。
入力値リストフィールド21Cは、当該テストケースにおける関数の入力値全てを第一引数から順番にリスト形式で格納する。出力値フィールド21Dは、当該テストケースを実行した際の関数の出力値を格納する。
図10は、テストケース生成プログラム13が実行する全体の処理の一例を示すフローチャートである。
まず、ステップS101の関数情報解析処理において、関数情報解析部15がソースコード記憶部19からソースコードを読み込み、ソースコード内の関数定義を解析し、関数の呼出し関係に関する情報を関数情報記憶部20に格納する。
次に、ステップS102の入力値生成順序決定処理において、入力値生成順序決定部16が上記ステップS101の解析で得られた関数間の呼出し関係に基づき、関数のテスト入力値を生成する順序を決定し、関数情報記憶部20に格納する。
次に、ステップS103の必要戻り値解析処理において、必要戻り値解析部17が呼出し側の関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析し、得られた戻り値のリストを関数情報記憶部20に格納する。
次に、ステップS104の入力値生成処理において、テストケース生成部18が上記ステップS102で決定された入力値生成順序に従い、各関数について下位の関数から順番に、被呼出し関数を含む全ての関数内の経路を網羅するためのテスト入力値を生成する。
この際に、テストケース生成部18は、上記ステップS103で得られた必要戻り値リストと、ステップS104の入力値生成の過程で得られる被呼出し関数の入力値及び出力値を用いて入力値生成対象関数の一部を書き換えた入力値生成用関数を生成して記号実行を行う。これにより、生成されるテストケースの網羅性を低下させずに、計算量を削減する効果を得る。
最後に、ステップS105において、テストケース生成部18は、生成された各関数のテスト入力値をテストケースとしてファイルなどに出力し、テストケース生成プログラム13の処理を終了する。
上記処理により、テストケース情報記憶部21には、関数ID毎に処理の経路を網羅するのに必要な入力値リスト21Cと、出力値フィールド21Dが格納される。記号実行部22は、ソースコードに対応する入力値リストフィールド21Cを用いることで、ソースコードの処理の経路を全て網羅据えることが可能となる。
以下、各ステップで行われる処理の詳細について図11、図12、図13、図14のフローチャートを用いて説明する。
図11は、ステップS101の関数情報解析処理の詳細を示すフローチャートである。
まず、ステップS111において、関数情報解析部15が、ソースコード記憶部19に格納されているソースコードを読み込む。
次に、ステップS112において、関数情報解析部15が、ソースコード内のまだ解析していない一つの関数定義を解析し、関数名と関数の処理の中で呼出ししている他の関数全ての名前を取得する。
次に、ステップS113において、関数情報解析部15が、ステップS112で取得した関数名について関数情報記憶部20に新規のデータを登録し、一意に識別可能な関数IDを関数IDフィールド20Aに格納し、ステップS112で取得した関数名を関数名フィールド20Bに格納し、当該関数の処理の中で呼出ししている他の関数全ての名前をリスト形式で呼出しし関数リストフィールド20Cに格納する。
次に、ステップS114において、関数情報解析部15が、ソースコード内の全ての関数定義を解析したか否かを判定し、全ての関数定義を解析していれば関数情報解析処理を終了する。全ての関数定義を解析していなければステップS112に戻り、上記処理を続けてソースコード内のまだ解析していない関数定義を解析する。
例えば、図3のソースコードの例の場合では、ソースコード内にfuncA(31),funcB(32)、funcC(33)、funcD(34)の4つの関数が定義されており、funcA(31)はfuncB(32)、funcC(33)を呼出ししており、funcB(32)はfuncD(34)を呼出ししており、funcC(33)、funcD(34)は他の関数を呼出ししていない。このため、ステップS101の関数情報解析処理終了後の関数名フィールド20Bと、呼出し関数リストフィールド20Cに格納される値は図4に示した関数情報記憶部20のようになる。
上記処理により、ソースコードに含まれる関数のうち、関数内で呼出しされている関数名と、当該関数を呼出し関数の名称が関数情報記憶部20に格納される。
図12は、ステップS102の入力値生成順序決定処理の詳細を示すフローチャートである。
まず、ステップS121において、入力値生成順序決定部16が、関数情報記憶部20の呼出し関数リストフィールド20Cのデータを元に、関数のコールグラフを生成する。
コールグラフとは関数間の呼出し関係を表す有向グラフとして知られているものであり、各関数は頂点として表され、関数Aの頂点から関数Bの頂点へ矢印がある場合に、関数Aが関数Bを呼出ししていることを表す。
例えば、関数情報記憶部20の呼出し関数リストフィールド20Cが図4のような場合、funcA(31)はfuncB(32)、funcC(33)を呼出ししており、さらにfuncB(32)はfuncD(34)を呼出ししているため、コールグラフは図6のようになる。図6は、コールグラフの一例を示す図である。
次に、ステップS122において、入力値生成順序決定部16が、上記ステップS121で生成されたコールグラフの矢印の向きを逆にし、得られた有向グラフに対してトポロジカルソートを実施する。
ここで、トポロジカルソートとは有向グラフに対して、頂点の順番をどの頂点も矢印の先の頂点より前にくるように並べるアルゴリズムであり、依存関係のある作業の順番を決定するための方法として知られている。
最後に、ステップS123において、入力値生成順序決定部16が、ステップS122のトポロジカルソートの結果を各関数の入力値生成順序とし、関数情報記憶部20で対応する入力値生成順序フィールド20Dに格納し、入力値生成順序決定処理を終了する。
図3のソースコードの例の場合では、ステップS102の入力値生成順序決定処理終了後の入力値生成順序フィールド20Dに格納される値は、例えば図4のようになる。
本発明の実施例では、被呼出し関数の入力値と、出力値を用いて呼出しし関数の処理内容を置き換えるため、呼出し関係が下位の関数から先に入力値と、出力値を生成する必要があるが、上述した処理を行うことで、上記要求を満たすように入力値生成順序フィールド20Dを決定することができる。
上記処理によって、被呼出し側関数のうち最下位の関数が入力値生成順序の先頭として設定され、最下位の被呼出し側関数から呼出し側関数へ向けて入力値生成順序が順次設定される。
図13は、ステップS103の必要戻り値解析処理の詳細を示すフローチャートである。
まず、ステップS131において、必要戻り値解析部17が、ソースコード記憶部19に格納されているソースコードを読み込む。
次に、ステップS132において、必要戻り値解析部17が、ソースコード内でまだ解析していない一つの関数fに対して、関数の処理内容にある関数呼出しをダミーの変数に書き換えた戻り値解析用の関数f’を生成する。
例えば、図7は図3のソースコードのfuncB(32)に対して戻り値解析用の関数を生成する例である。funcB(32)の処理の中で、funcD(34)を呼出ししているため、funcD(34)の呼出し式をダミー変数var_funcD(35)に置き換えている。
次に、ステップS133において、必要戻り値解析部17が、記号実行部22を用いて、上記ステップS132で置き換えたダミー変数を記号値として戻り値解析用の関数f’を記号実行し、戻り値解析用の関数f’の経路を網羅するためのダミー変数の入力値群を生成する。
ここで生成されたダミー変数の入力値群は、関数fの経路を網羅するために必要となる被呼出し関数の戻り値となっている。
例えば、図7の例では、記号実行によりfuncB(32)内の経路を網羅するために必要なfuncD(34)の戻り値として1、123が得られている。
次に、ステップS134において、必要戻り値解析部17が、上記ステップS133で生成されたダミー変数の入力値の全てを、関数情報記憶部20内でダミー変数に置き換えた関数呼出しに対応する関数の必要戻り値リストフィールド20Eにリスト形式で格納する。
次に、ステップS135において、必要戻り値解析部17が、ソースコード内の全ての関数定義を解析したか否かを判定し、全ての関数を解析していれば必要戻り値解析処理を終了する。全ての関数定義を解析していなければステップS132に戻り、上記処理を続けてソースコード内のまだ解析していない関数を解析する。
上記処理により、関数内で呼出しされている関数(または関数の呼出し箇所)がダミー変数に置き換えられ、当該ダミー変数を記号値として記号実行部22によって記号実行されて当該ダミー変数の入力値が生成される。そして、ダミー変数の入力値は、関数内で呼出しされている関数の結果を用いる経路を網羅するための必要戻り値として関数情報記憶部20の必要戻り値リストフィールド20Eに格納される。
すなわち、上位関数(呼出し側関数)の下位関数(被呼出し側関数)呼出しで、下位関数の戻り値を算出するために、下位関数の出力値をダミー変数に置き換えてから記号実行部22で記号実行することによって、出力値を得るための入力値を算出することができる。
図14は、ステップS104の入力値生成処理の詳細を示すフローチャートである。
まず、ステップS141において、テストケース生成部18が変数n=1と設定する。
次に、ステップS142において、テストケース生成部18が、関数情報記憶部20を検索し、入力値生成順序フィールド20Dの値がnである関数が存在するか否かを判定する。値がnでの関数が存在する場合にはステップS143に進む(以下、この関数をf_nと呼ぶ)。値がnの関数が存在しない場合には入力値生成処理を終了する。
ステップS143においては、テストケース生成部18が、ソースコード記憶部19に格納されているソースコードを読み込み、ソースコード内の関数f_nを複製した入力値生成用関数f_n’を生成する。
次に、ステップS144において、テストケース生成部18が、関数情報記憶部20の関数f_nに対応するデータの、必要戻り値リストフィールド20Eの値の有無を判定し、もし値が存在すれば、入力値生成用関数f_n’のreturn文の直前に(returnの値==必要戻り値1)、(returnの値==必要戻り値2)、・・・を分岐条件とするif文を挿入する。ただし、それぞれの分岐における処理内容は空文でよい。
例えば、図8は図3のソースコードのfuncD(34)に対して戻り値解析用の関数を生成する例である。関数情報記憶部20のfuncD(34)の必要戻り値リストフィールド20Eには1、123が格納されているため、return z;の直前にz==1、z==123を分岐条件とするif文(36)が挿入される。
この処理を実施することにより、必要戻り値を得るための関数f_nの入力値を、入力値生成用関数f_n’で記号実行を行うことで算出することができるようになる。
次に、ステップS145において、テストケース生成部18が、入力値生成用関数f_n’の処理内容から他の関数の呼出し命令を検索する。テストケース生成部18は、他の関数の呼出し命令がある場合、その関数呼出し箇所を以下の手順でテストケース情報記憶部21に格納されている該当関数の入力値と、出力値に基づいたif文に置き換える。なお、このif文への置き換えを簡略化処理とする。
(1)関数呼出し箇所の直前にダミー変数vを宣言する。
(2)関数呼出しの入力式のリストを抽出する。例えば、関数呼出しがg(x,y)となっている場合、入力式のリストは[x、y]となる。
(3)テストケース情報記憶部21から該当関数のテストケースのデータを全て選択する。
(4)上記(3)で選択したテストケースデータを一つ取り出す。
入力値リストフィールド21Cの値と(2)の引数式リストからif文の分岐条件(入力式1==入力値1 && 入力式2==入力値2 && ・・・ && 入力式N==入力値N)と、出力値フィールド21Dの値から、ダミー変数への代入文v=出力値を生成し、これらを用いてif文を生成する。
例えば、入力式リストが[x、y]、入力値リストフィールド21Cの値が[10、20]、出力値フィールド21Dの値が100の場合、分岐条件は(x==10 && y==20)、代入文はv=100となる。また、if文はif(x==10 && y==20) v=100;となる。
(5)上記(3)で選択したテストケースデータ全てに対して上記(4)を繰り返す。ただし生成した2つ目以降のif文はelse if句として追加していく。
(6)完成したif文を関数呼出し箇所の直前に追加する。
(7)関数呼出し箇所をダミー変数vに置き換える。
例えば、図9は図3のソースコードのfuncB(32)に対して上記の簡略化処理を実施する例である。
テストケース生成部18は、簡略化処理を実施して、funcB(32)の処理の中のfuncD(34)の呼出し箇所をテストケース情報記憶部21に格納されたfuncD(34)のテストケースデータ(123、−10)に基づいてif文(37)に置き換える。
次に、ステップS146において、テストケース生成部18が、記号実行部22を用いて、引数を記号値として入力値生成用関数f_n’を記号実行し、入力値解析用関数f’の経路を網羅するための入力値群を生成する。そして、テストケース生成部18は、生成された入力値(関数の引数が複数ある場合、入力値は複数の引数値の組から成る)の全てを以下の手順でテストケース情報記憶部21に格納する。
(1)テストケース情報記憶部21に新規のレコードを追加し、一意に識別可能なテストケースIDをテストケースIDフィールド21Aに格納する。
(2)関数情報記憶部20から関数f_nに対応するデータの関数IDを取り出し、関数IDフィールド21Bに格納する。
(3)生成された入力値群から一組の入力値を取り出し、リスト形式で入力値リストフィールド21Cに格納する。
(4)生成された入力値全てを格納するまで上記(1)−(3)を繰り返す。
このステップで生成された入力値群は、関数f_nと関数f_n実行時に呼出しされる全ての関数の経路を網羅することができる入力値群となっている。
次に、ステップS147において、テストケース生成部18が、ステップS146で生成された入力値を具体値として関数f_nを実行し、得られた出力値(関数f_nの戻り値)をテストケース情報記憶部21の該当データの出力値フィールド21Dに格納する。
次に、ステップS148において、n=n+1として、ステップS142に戻る。
以上、図10に示したステップS104の入力値生成処理が終了すると、テストケース情報記憶部21に各関数のテストケースとして、入力値と出力値が入力値リストフィールド21Cと、出力値21フィールドDに格納される。
例えば、図3のソースコードの例の場合では、ステップS104の入力値生成処理終了後のテストケース情報記憶部21に格納される値は、図5のようになる。
上記に示した処理を実施することにより、呼出し下位の関数から順番に、経路を網羅するために必要な入力値と出力値の生成が行われ、生成された入力値と出力値を用いて呼出しし上位の関数内の関数呼出し部分をif文に置き換えてから記号実行が実施されるようになる。
これにより、生成されるテストケースの網羅性を確保しつつ、多段の関数呼出しがある場合であっても記号実行を実施する関数の制御フロー(処理)が簡略化され、計算量を削減することができる。
図15は、前記従来例の課題の詳細を説明する図である。図示の例では、関数funcA(31)の中でfuncB(32)が呼出しされる例を示す。
前記従来例では記号実行の際に下位関数(funcB(32))の呼出し箇所を記号実行せずに、単体テストの結果に置き換えることにより経路の組合せ爆発を抑制している。図示の例では、単体テストの結果として、funcB(32)の入力値と出力値はテストケース情報記憶部21jのように20、−100、0が得られた場合を示す。
下位関数の出力値で生成したif文(39)によりfunc(B)を置き換えると、func(B)の結果が100となるif文(40)が存在する場合、当該if文(40)の経路を網羅することができない、という問題が生じる。
すなわち、前記従来例では、用意する単体テストの具体的な入力値によっては、呼出し側関数の経路を網羅するために必要な出力値が得られずに、生成されるテストケースの網羅性が低下するのである。
そこで、本発明の実施例では、上位関数から呼出しされる下位関数をダミー変数に置き換えてから記号実行することで下位関数の入力値を算出し、当該関数の必要戻り値リストフィールド20Eに格納する。
そして、テストケース生成部18は、下位関数の出力値(戻り値)を分岐条件とするif文を置き換え処理によって挿入してから記号実行部22によって入力値を算出し、当該入力値を下位関数へ入力することで出力値を算出する。そして、ダミー変数によって算出した入力値と出力値を加えて、当該下位関数の入力値と出力値をテストケース情報記憶部21に格納する。
このように、呼出しされる関数の戻り値による経路の網羅を行ってから、経路の簡略化(置き換え処理)を行うことで上位関数の網羅性を確保することがきるのである。
以上に説明したように、本発明の実施例では、記号実行の際の計算量を削減しつつ、呼出し側と、被呼出し側について全ての関数の経路を網羅するようなテストケースを生成することができる。
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明を分かりやすく説明するために詳細に記載したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。また、各実施例の構成の一部について、他の構成の追加、削除、又は置換のいずれもが、単独で、又は組み合わせても適用可能である。
また、上記の各構成、機能、処理部、及び処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、及び機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、SSD(Solid State Drive)等の記録装置、または、ICカード、SDカード、DVD等の記録媒体に置くことができる。
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。実際には殆ど全ての構成が相互に接続されていると考えてもよい。
1 テストケース生成装置
4 CPU
5 ROM
6 RAM
7 HDD
8 BUS
9 入力装置
10 表示装置
11 通信I/F
12 CDROMドライブ
12A CDROM
13 テストケース生成プログラム
14 記憶部
15 関数情報解析部
16 入力値生成順序決定部
17 必要戻り値解析部
18 テストケース生成部
19 ソースコード記憶部
20 関数情報記憶部
21 テストケース情報記憶部
22 記号実行部
20A 関数IDフィールド
20B 関数名フィールド
20C 呼出し関数リストフィールド
20D 入力値生成順序フィールド
20E 必要戻り値リストフィールド
21A テストケースIDフィールド
21B 関数IDフィールド
21C 入力値リストフィールド
21D 出力値フィールド

Claims (15)

  1. プロセッサとメモリを有する計算機でソースコードのテストケースを生成するテストケース生成方法であって、
    前記計算機が、前記ソースコードを読み込む第1のステップと、
    前記計算機が、前記ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する第2のステップと、
    前記計算機が、前記被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施する第3のステップと、
    前記計算機が、前記呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成する第4のステップと、
    を含むことを特徴とするテストケース生成方法。
  2. 請求項1に記載のテストケース生成方法であって、
    前記第4のステップは、
    前記呼出し側関数と被呼出し側関数の呼出し関係に基づいて、前記入力値を生成する順序を決定するステップを含むことを特徴とするテストケース生成方法。
  3. 請求項2に記載のテストケース生成方法であって、
    前記第4のステップは、
    前記入力値を生成する順序を、前記被呼出し側関数のうち最下位の関数から前記呼出し側関数へ向けて順次決定することを特徴とするテストケース生成方法。
  4. 請求項1に記載のテストケース生成方法であって、
    前記第2のステップは、
    前記被呼出し側関数の呼出し箇所を仮変数に置き換えるステップと、
    前記仮変数を記号値として記号実行し、前記被呼出し側関数の入力値を生成するステップと、
    を含むことを特徴とするテストケース生成方法。
  5. 請求項1に記載のテストケース生成方法であって、
    前記第3のステップは、
    前記簡略化処理として、前記被呼出し側関数の呼出し箇所を、当該被呼出し側関数の入力値と出力値に基づく条件分岐に置き換え、
    前記第4のステップは、
    前記条件分岐に対して記号実行を実施して入力値を生成することを特徴とするテストケース生成方法。
  6. プロセッサとメモリを有してソースコードのテストケースを生成する計算機であって、
    前記ソースコードを読み込んで、前記ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する関数情報解析部と、
    前記被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施し、前記呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成するテストケース生成部と、
    を有することを特徴とする計算機。
  7. 請求項6に記載の計算機であって、
    前記呼出し側関数と被呼出し側関数の呼出し関係に基づいて、前記入力値を生成する順序を決定する入力値生成順序決定部をさらに有することを特徴とする計算機。
  8. 請求項7に記載の計算機であって、
    前記入力値生成順序決定部は、
    前記入力値を生成する順序を、前記被呼出し側関数のうち最下位の関数から前記呼出し側関数へ向けて順次決定することを特徴とする計算機。
  9. 請求項6に記載の計算機であって、
    前記関数情報解析部は、
    前記被呼出し側関数の呼出し箇所を仮変数に置き換えるステップと、
    前記仮変数を記号値として記号実行し、前記被呼出し側関数の入力値を生成するステップと、
    を含むことを特徴とする計算機。
  10. 請求項6に記載の計算機であって、
    前記テストケース生成部は、
    前記簡略化処理として、前記被呼出し側関数の呼出し箇所を、当該被呼出し側関数の入力値と出力値に基づく条件分岐に置き換え、前記条件分岐に対して記号実行を実施して入力値を生成することを特徴とする計算機。
  11. プロセッサとメモリを有する計算機を制御するためのプログラムであって、
    ソースコードを読み込む第1のステップと、
    前記ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する第2のステップと、
    前記被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施する第3のステップと、
    前記呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成する第4のステップと、
    を前記計算機に実行させるためのプログラム。
  12. 請求項11に記載のプログラムであって、
    前記第4のステップは、
    前記呼出し側関数と被呼出し側関数の呼出し関係に基づいて、前記入力値を生成する順序を決定するステップを含むことを特徴とするプログラム。
  13. 請求項12に記載のプログラムであって、
    前記第4のステップは、
    前記入力値を生成する順序を、前記被呼出し側関数のうち最下位の関数から前記呼出し側関数へ向けて順次決定することを特徴とするプログラム。
  14. 請求項11に記載のプログラムであって、
    前記第2のステップは、
    前記被呼出し側関数の呼出し箇所を仮変数に置き換えるステップと、
    前記仮変数を記号値として記号実行し、前記被呼出し側関数の入力値を生成するステップと、
    を含むことを特徴とするプログラム。
  15. 請求項11に記載のプログラムであって、
    前記第3のステップは、
    前記簡略化処理として、前記被呼出し側関数の呼出し箇所を、当該被呼出し側関数の入力値と出力値に基づく条件分岐に置き換え、
    前記第4のステップは、
    前記条件分岐に対して記号実行を実施して入力値を生成することを特徴とするプログラム。
JP2017039785A 2017-03-02 2017-03-02 テストケース生成方法、計算機及びプログラム Active JP6693898B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2017039785A JP6693898B2 (ja) 2017-03-02 2017-03-02 テストケース生成方法、計算機及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017039785A JP6693898B2 (ja) 2017-03-02 2017-03-02 テストケース生成方法、計算機及びプログラム

Publications (2)

Publication Number Publication Date
JP2018147114A true JP2018147114A (ja) 2018-09-20
JP6693898B2 JP6693898B2 (ja) 2020-05-13

Family

ID=63592177

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017039785A Active JP6693898B2 (ja) 2017-03-02 2017-03-02 テストケース生成方法、計算機及びプログラム

Country Status (1)

Country Link
JP (1) JP6693898B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2020194455A1 (ja) * 2019-03-25 2020-10-01 三菱電機株式会社 テストケース生成装置、テストケース生成方法、およびテストケース生成プログラム

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2020194455A1 (ja) * 2019-03-25 2020-10-01 三菱電機株式会社 テストケース生成装置、テストケース生成方法、およびテストケース生成プログラム
JPWO2020194455A1 (ja) * 2019-03-25 2021-09-13 三菱電機株式会社 テストケース生成装置、テストケース生成方法、およびテストケース生成プログラム
CN113574511A (zh) * 2019-03-25 2021-10-29 三菱电机株式会社 测试用例生成装置、测试用例生成方法和测试用例生成程序

Also Published As

Publication number Publication date
JP6693898B2 (ja) 2020-05-13

Similar Documents

Publication Publication Date Title
US8726255B2 (en) Recompiling with generic to specific replacement
Kwon et al. Mantis: Automatic performance prediction for smartphone applications
JP7218793B2 (ja) プログラムの機能を向上するための制御フローシステム、非一時的可読媒体、および方法
US20110126179A1 (en) Method and System for Dynamic Patching Software Using Source Code
CN112905447B (zh) 一种区块链虚拟机的测试方法和系统
JP6003699B2 (ja) テストデータ生成プログラム、方法及び装置
Bian et al. SPAPE: A semantic-preserving amorphous procedure extraction method for near-miss clones
JP6759851B2 (ja) プログラム生成プログラム、プログラム生成方法、プログラム生成装置及びコンパイルプログラム
JP2008276735A (ja) プログラムコード変換装置及びプログラムコード変換方法
JP6693898B2 (ja) テストケース生成方法、計算機及びプログラム
CN114174983B (zh) 用于高级构造的优化的自动验证的方法和系统
JP2016128941A (ja) 出力判定装置、出力判定方法、出力判定プログラム、及び、静的解析装置
JP7380851B2 (ja) テストスクリプト生成装置、テストスクリプト生成方法及びプログラム
KR102117165B1 (ko) 바이너리 분석을 위한 중간 언어 테스트 방법 및 장치
JP6116983B2 (ja) エントリーポイント抽出装置
JP5578625B2 (ja) プログラム分析装置、プログラム分析方法、及びプログラム
JP5755861B2 (ja) テストケース生成装置、テストケース生成方法およびテストケース生成プログラム
JP2017041196A (ja) スタブ化対象判定装置、方法、及びプログラム
Huong et al. An Automated Stub Method for Unit Testing C/C++ Projects
JP7059827B2 (ja) ソースコード生成装置
US20170344351A1 (en) Information processing apparatus, compiling management method, and recording medium
JP7385536B2 (ja) ソフトウェア開発支援装置及びソフトウェア開発支援方法
Padaryan et al. On the Representation of Results of Binary Code Reverse Engineering
JP5343840B2 (ja) プログラムの解析装置及び解析方法
Letychevskyi et al. Fuzz Testing Technique and its Use in Cybersecurity Tasks

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20190306

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20191225

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20200128

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20200228

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: 20200407

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20200416

R150 Certificate of patent or registration of utility model

Ref document number: 6693898

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150