次に、本発明を実施するための形態を、以下の実施例に基づき図面を参照しつつ説明していく。本実施例のテストケース関係抽出装置はコンピュータシステムの運用におけるソフトウェアのテスト技術に関するものである。
(ハードウェア構成)
本実施例のテストケース関係抽出装置は、例えばサーバコンピュータやクライアントコンピュータなどのコンピュータにより実現される。図1はテストケース関係抽出装置の一例のハードウェア構成図である。なお、テストケース関係抽出プログラムがインストールされているコンピュータ10はテストケース関係抽出装置の一例である。
ここでは、テストケース関係抽出プログラムがインストールされているコンピュータ10のハードウェア構成を説明する。コンピュータ10はテストケース関係抽出装置と同様の機能を有するテストケース関係抽出プログラムを実行する。
図1のコンピュータ10は、入力装置21、表示装置22、コンピュータ本体23を有している。コンピュータ本体23はバス37で相互に接続された主記憶装置31、演算処理装置32、インターフェース装置33、記録媒体読取装置34及び補助記憶装置35を有する。また、バス37には入力装置21及び表示装置22が接続されている。
バス37で相互に接続されている入力装置21、表示装置22、主記憶装置31、演算処理装置32、インターフェース装置33、記録媒体読取装置34及び補助記憶装置35は、演算処理装置32による管理下で相互にデータの送受を行うことができる。演算処理装置32は、コンピュータ10全体の動作制御を司る中央処理装置である。
インターフェース装置33はネットワーク等からのデータを受信し、データの内容を演算処理装置32に渡す。インターフェース装置33は演算処理装置32からの指示に応じてネットワーク等にデータを送信する。
補助記憶装置35には、テストケース関係抽出装置と同様の機能をコンピュータ10に発揮させるプログラムの一部として、少なくともテストケース関係抽出装置における処理をコンピュータ10に実行させるテストケース関係抽出プログラムが記憶されている。
そして、演算処理装置32がテストケース関係抽出プログラムを補助記憶装置35から読み出して実行することで、コンピュータ10はテストケース関係抽出装置として機能するようになる。テストケース関係抽出プログラムは演算処理装置32とアクセス可能な主記憶装置31に格納されていても良い。
入力装置21は演算処理装置32の管理下でデータの入力を受付ける。テストケース関係抽出プログラムはコンピュータ10が読み取り可能な記録媒体36に記録しておくことができる。
記録媒体36には、磁気記録媒体、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記録媒体には、HDD、フレキシブルディスク(FD)、磁気テープ(MT)などがある。光ディスクには、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc − Read Only Memory)、CD−R(Recordable)/RW(ReWritable)などがある。また、光磁気記録媒体には、MO(Magneto − Optical disk)などがある。
テストケース関係抽出プログラムを流通させる場合には、例えば、テストケース関係抽出プログラムが記録されたDVD、CD−ROMなどの可搬型の記録媒体36を販売することが考えられる。
テストケース関係抽出プログラムを実行するコンピュータ10は、例えば記録媒体読取装置34がテストケース関係抽出プログラムを記録した記録媒体36から、テストケース関係抽出プログラムを読み出す。演算処理装置32は、読み出されたテストケース関係抽出プログラムを主記憶装置31若しくは補助記憶装置35に格納する。そして、コンピュータ10は自己の記憶装置である主記憶装置31若しくは補助記憶装置35からテストケース関係抽出プログラムを読み取り、テストケース関係抽出プログラムに従った処理を実行する。
(ブロック構成)
図2は本実施例のテストケース関係抽出装置の一例の機能ブロック図である。図2のテストケース関係抽出装置50は、テスト要素定義部51、関数実行回数計測部52、関数実行回数比較部53、トレース照合部54、テストケース間の構造定義部55、アプリケーションのテストケース別のトレース資産保存部61、テスト要素情報保存部62、テスト要素設定情報保存部63、関数実行回数保存部64、関数実行回数比較結果保存部65、トレース比較結果保存部66、テストケース間の関係情報保存部67を有する。
テスト要素定義部51はテストケース別のトレース情報及びテスト要素設定情報(例えば関数名、メソッド名)を入力としてトレース情報を分割し、テスト要素を出力する。関数実行回数計測部52は複数のトレース情報のテスト要素を入力として、各テスト要素内の関数(又はメソッド)の実行(呼出)回数を計測する。
関数実行回数比較部53は計測した各テスト要素内の関数の実行回数を比較したことによるテスト要素間の比較結果情報(一致/不一致)を出力する。トレース照合部54は複数のトレース情報のテスト要素を入力として、トレース情報を比較したことによるテスト要素間の比較結果情報(一致/不一致)を出力する。具体的に、トレース照合部54は関数実行回数比較部53により一致すると判断されたテスト要素に対し、トレース情報を比較したことによるテスト要素間の比較結果情報を出力する。テストケース間の構造定義部55は、テスト要素、テスト要素を含むテストケース、テスト要素間の比較結果情報を入力として、テストケース間の関係情報を出力する。
アプリケーションのテストケース別のトレース資産保存部61は、テストケース別にトレース情報を保存している。テスト要素情報保存部62はトレース情報を分割したテスト要素を保存している。また、テスト要素情報保存部62はテスト要素及びテストケースの関係情報を保存している。テスト要素設定情報保存部63はトレース情報をテスト要素に分割するためのテスト要素設定情報(キーワード)を保存している。関数実行回数保存部64は各テスト要素内の関数(又はメソッド)別の実行(呼出)回数を保存している。
関数実行回数比較結果保存部65は各関数別の実行回数を比較した結果によるテスト要素間の一致又は不一致を示す比較結果情報を保存する。トレース比較結果保存部66は関数実行回数比較部53により一致すると判断されたテスト要素に対し、トレース情報を比較したことによるテスト要素間の一致又は不一致を示す比較結果情報を保存する。テストケース間の関係情報保存部67はテストケース間の関係情報を保存する。
図3は本実施例のテストケース関係抽出装置の処理手順を表した一例のフローチャートである。ステップS1、S2に進み、テスト要素定義部51はアプリケーションのテストケース別のトレース資産保存部61から取得したテストケース別のトレース情報を分割してテスト要素を定義する。テスト要素定義部51は、全てのテスト要素を定義するまでステップS1、S2の処理を繰り返す。
ステップS3、S4に進み、関数実行回数計測部52は、テスト要素内の関数(又はメソッド)の実行回数を計測する。以下ではテスト要素内の関数別の実行回数を計測する例を説明する。関数実行回数計測部52は全てのテスト要素内の関数別の実行回数を計測するまでステップS3、S4の処理を繰り返す。
ステップS5、S6に進み、関数実行回数比較部53は計測した各テスト要素内の関数の実行回数をテスト要素間で比較する。関数の実行回数が一致した場合、トレース照合部54はステップS7に進み、関数の実行回数が一致したテスト要素のトレース情報を比較する。関数の実行回数が一致したテスト要素のトレース情報が一致した場合、トレース照合部54はステップS10に進み、同一のテスト要素として分類する。
なお、ステップS6において関数の実行回数が一致しなかった場合、及び、ステップS8においてトレース情報が一致しなかった場合、ステップS9に進み、トレース照合部54は異なるテスト要素として分類する。テストケース間の構造定義部55は、ステップS9又はS10に続いてステップS11に進み、テストケース間の関係(構造)情報を定義する。
以下では、本実施例のテストケース関係抽出装置50の詳細について説明する。統合テストはプログラムテストを包含する可能性がある。したがって、テストケース関係抽出装置50はテストケース別のトレース情報をテスト要素という単位に分割する。テスト要素への分割は、指定した関数名やメソッド名などのテスト要素設定情報を利用してトレース情報を分割することにより行う。テストケース間の関係(包含関係)の調査は、テスト要素内の関数別の実行回数、トレース情報を、テスト要素間で比較することで実現する。
図4はテスト要素定義部の入出力情報を示した一例の構成図である。テスト要素定義部51は、アプリケーションのテストケース別のトレース資産保存部61に保存されているテストケース別のトレース情報及びテスト要素設定情報保存部63に保存されているテスト要素設定情報(例えば関数名)を入力される。テスト要素定義部51は入力情報として得たテスト要素設定情報をキーワードとしてトレース情報を分割し、テスト要素としてテスト要素情報保存部に出力する。
本実施例のテストケース関係抽出装置50では、プログラムを実行したときのトレース情報を利用するため、あらかじめトレース情報を出力しておく必要がある。トレース情報はプログラムを実行した文の記録が含まれるものとし、その中で、特に、実行した関数名の文を含む必要がある。トレース情報はアプリケーションのテストケース別のトレース資産保存部61にファイルの形式で保存される。
図5は、テスト要素定義部の処理手順を示した一例のフローチャートである。テスト要素定義部51では、テスト要素設定情報保存部63にテスト要素設定情報として保存されているキーワードの一例である関数名を元に、アプリケーションのテストケース別のトレース資産保存部61にファイルの形式で保存されているトレース情報(トレースファイル)を複数のファイルに分割する。
ステップS21に進み、テスト要素定義部51はテスト要素としてトレース情報を分割するためのキーワードの一例として、関数名をテスト要素設定情報保存部63から取得する。ステップS22に進み、テスト要素定義部51はアプリケーションのテストケース別のトレース資産保存部61に保存されているトレースファイルを順に一行ずつ読み込む。
ステップS23に進み、テスト要素定義部51は読み込んだ行に関数の呼び出しが含まれていれば、読み込んだ行に記述されている関数名を取得する。テスト要素定義部51はステップS24に進み、読み込んだ行に記述されている関数名と、テスト要素設定情報保存部63から取得した関数名との比較を行う。
テスト要素定義部51は読み込んだ行に記述されている関数名が、テスト要素設定情報保存部63から取得した関数名と一致すれば、ステップS25に進み、テスト要素の切れ目としてトレースファイルを分割し、ステップS26に進む。テスト要素定義部51は分割した時点までのトレース情報をテスト要素として定義する。
なお、ステップS24において、読み込んだ行が関数の呼び出し終了文、条件文、代入文などの関数の呼び出しを行っている文以外の文であると判定した場合、テスト要素定義部51は、ステップS26に進む。このように、テスト要素定義部51は関数呼び出しを行っていない行をそのままテスト要素に出力する。
そして、ステップS26に進み、テスト要素定義部51はアプリケーションのテストケース別のトレース資産保存部61に保存されているトレースファイルの全ての行を読み込んだか否かを判定する。アプリケーションのテストケース別のトレース資産保存部61に保存されているトレースファイルの全ての行を読み込み終えていなければ、テスト要素定義部51はステップS22に戻る。アプリケーションのテストケース別のトレース資産保存部61に保存されているトレースファイルの全ての行を読み込み終えていれば、テスト要素定義部51は図5に示したフローチャートの処理を終了する。
図6は関数実行回数計測部の入出力情報を示した一例の構成図である。関数実行回数計測部52は、テスト要素情報保存部62に保存されている、トレース情報を分割して作成したテスト要素を入力される。関数実行回数計測部52は、各テスト要素内の関数別の実行回数を計測し、各テスト要素内の関数別の実行回数を、関数実行回数保存部64に出力する。
図7は関数実行回数計測部の処理手順を示した一例のフローチャートである。ステップS31に進み、関数実行回数計測部52はテスト要素の内部で実行している関数名を取得する。ステップS32に進み、関数実行回数計測部52はテスト要素の内部で実行している関数の実行回数を関数別に計測し、各テスト要素内の関数別の実行回数を関数実行回数保存部64に保存する。ステップS33に進み、関数実行回数計測部52はテスト要素情報保存部62に保存されている全てのテスト要素の関数の実行回数を関数別に計測し終えたか否かを判定する。
テスト要素情報保存部62に保存されている全てのテスト要素の関数の実行回数を関数別に計測し終えていなければ、関数実行回数計測部52はステップS31に戻る。テスト要素情報保存部62に保存されている全てのテスト要素の関数の実行回数を関数別に計測し終えていれば、関数実行回数計測部52は、図7に示したフローチャートの処理を終了する。
図8は関数実行回数比較部の入出力情報を示した一例の構成図である。関数実行回数比較部53は、関数実行回数保存部64に保存されている各テスト要素内の関数別の実行回数を入力される。関数実行回数比較部53は各テスト要素内の関数別の実行回数を比較したことによるテスト要素間の一致又は不一致を示す比較結果情報を関数実行回数比較結果保存部65に出力する。関数実行回数比較部53は各テスト要素内の関数別の実行回数を比較したことにより、テスト要素間の関係を構築するものである。
図9は関数実行回数比較部の処理手順を示した一例のフローチャートである。ステップS41に進み、関数実行回数比較部53は取得したテスト要素内の全ての関数の実行回数をテスト要素毎に加算する。ステップS42に進み、関数実行回数比較部53はテスト要素を2つ取得する。ステップS43に進み、関数実行回数比較部53は取得した2つのテスト要素について、ステップS41で加算したテスト要素毎の関数の実行回数が一致するか否かを判定する。
ステップS41で加算したテスト要素毎の関数の実行回数が一致すれば、関数実行回数比較部53はステップS44に進み、テスト要素内の関数別の実行回数を取得する。関数実行回数比較部53はステップS45に進み、同じ関数名に対応する実行回数をテスト要素間で比較する。ステップS46に進み、関数実行回数比較部53は取得した2つのテスト要素について、関数別で全ての実行回数が一致するか否かを判定する。
取得した2つのテスト要素について、関数別で全ての実行回数が一致すれば、関数実行回数比較部53はステップS47に進み、取得した2つのテスト要素が同じとして対応付けを行い、同一のテスト要素として分類する。関数実行回数比較部53はテスト要素間の一致を示す比較結果情報を関数実行回数比較結果保存部65に出力する。
また、取得した2つのテスト要素について、一方のテスト要素にのみ存在する関数が存在する、一つでも関数の実行回数が一致しないなど、関数名と、その関数名に対応する実行回数とが一致しないものがあった場合、ステップS48に進み、関数実行回数比較部53は取得した2つのテスト要素が異なるとして対応付けを行わず、異なるテスト要素として分類する。関数実行回数比較部53はテスト要素間の不一致を示す比較結果情報を関数実行回数比較結果保存部65に出力する。
ステップS47、S48に続いてステップS49に進み、関数実行回数比較部53はステップS42で全てのテスト要素に対する全ての組み合わせを取得し終えたか否かを判定する。全てのテスト要素に対する全ての組み合わせを取得し終えていなければ、関数実行回数比較部53はステップS42に戻る。
なお、ステップS43において、ステップS41で加算したテスト要素毎の関数の実行回数が一致しなければ、関数実行回数比較部53は2つのテスト要素が異なるとして対応付けを行わず、異なるテスト要素として分類し、ステップS42に戻る。なお、ステップS49において、全てのテスト要素に対する全ての組み合わせを取得し終えていないと判定すれば、関数実行回数比較部53は図9に示したフローチャートの処理を終了する。
図10はトレース照合部の入出力情報を示した一例の構成図である。トレース照合部54は、テスト要素情報保存部62に保存されているテスト要素及び関数実行回数比較結果保存部65に保存されている関数別の実行回数を比較した結果によるテスト要素間の一致又は不一致の比較結果情報を入力される。トレース照合部54は関数別の実行回数が一致したテスト要素のトレース情報を比較し、トレース情報を比較したことによるテスト要素間の一致又は不一致の比較結果情報をトレース比較結果保存部66に出力する。
図11はトレース照合部の処理手順を示した一例のフローチャートである。トレース照合部54は関数実行回数比較結果保存部65に保存されている比較結果情報により一致すると判断されたテスト要素に対して、関数の実行回数以外の観点で一致しているかどうかを確認する。
ステップS51に進み、トレース照合部54は関数別の実行回数の比較結果から一致すると判断したテスト要素をテスト要素情報保存部62から取得する。ステップS52に進み、トレース照合部54はステップS51で取得したテスト要素から2つのテスト要素を取得する。ステップS53に進み、トレース照合部54は取得した2つのテスト要素について、そのテスト要素の内容の記述を関数名以外の実行文のトレース情報を含めて文字列として比較して、関数の実行以外の実行文の順序、引数の値などを含めて一致するか否かを判定する。
取得した2つのテスト要素について、関数の実行以外の実行文の順序、引数の値などを含めて一致すれば、トレース照合部54はステップS54に進み、取得した2つのテスト要素が完全に同じ処理を行っているとして判断する。トレース照合部54は取得した2つのテスト要素が完全に同じ処理を行っているとして判断すると、同一のテスト要素として分類する。トレース照合部54はテスト要素間の一致の比較結果情報をトレース比較結果保存部66に出力する。
取得した2つのテスト要素について、関数の実行以外の実行文の順序、引数の値などを含めて一致しなければ、トレース照合部54はステップS55に進み、例え関数別の実行回数が同じであったとしても、取得した2つのテスト要素が別の処理を行っていると判断する。トレース照合部54は取得した2つのテスト要素が別の処理を行っていると判断すると、異なるテスト要素として分類する。トレース照合部54はテスト要素間の一致の比較結果情報を不一致に修正してトレース比較結果保存部66に出力する。
また、ステップS54、S55に続いてステップS56に進み、トレース照合部54はステップS52で全てのテスト要素に対する全ての組み合わせを取得し終えたか否かを判定する。全てのテスト要素に対する全ての組み合わせを取得し終えていなければ、関数実行回数比較部53はステップS52に戻る。全てのテスト要素に対する全ての組み合わせを取得し終えていれば、関数実行回数比較部53は図11に示したフローチャートの処理を終了する。
図12はテストケース間の構造定義部の入出力情報を示した一例の構成図である。テストケース間の構造定義部55は、テスト要素情報保存部62に保存されているテスト要素と、テスト要素及びテストケースの関係情報とを入力される。また、テストケース間の構造定義部55はトレース比較結果保存部66に保存されているトレース情報を比較したことによるテスト要素間の一致又は不一致の比較結果情報を入力される。
テストケース間の構造定義部55はテスト要素、テスト要素及びテストケースの関係情報、テスト要素間の一致又は不一致の比較結果情報からテストケース間の関係情報をテストケース間の関係情報保存部67に出力する。
図13は、テストケース間の構造定義部の処理手順を示した一例のフローチャートである。ステップS61に進み、テストケース間の構造定義部55はテスト要素間の比較結果情報に従い、一致と判断されたテスト要素を取得する。
ステップS62に進み、テストケース間の構造定義部55はステップS61で取得したテスト要素及びテストケースの関係情報から、ステップS61で取得したテスト要素が所属するテストケース名を取得する。ステップS63に進み、テストケース間の構造定義部55はステップS62で取得したテストケース名のうち選択していないテストケース名の中で、最も少ないテスト要素を保持するテストケースを基準として取得する。
ステップS64に進み、テストケース間の構造定義部55は対象のテストケースが基準のテストケースのテスト要素を全て含むか否かを判定する。対象のテストケースが基準のテストケースのテスト要素を全て含んでいると判定すると、テストケース間の構造定義部55はステップS65に進み、基準のテストケースが、対象のテストケースに含まれると判断して、テストケースの関係(包含関係)情報を定義する。
対象のテストケースが基準のテストケースのテスト要素を全て含んでいる訳ではないと判定すると、テストケース間の構造定義部55はステップS66に進み、基準のテストケースが、対象のテストケースに含まれないと判断して、テストケースの関係(関係無し)情報を定義する。
ステップS67に進み、テストケース間の構造定義部55はステップS62で取得したテストケース名を全て選択したか否かを判定する。テストケース間の構造定義部55はステップS62で取得したテストケース名を全て選択し終えていなければ、ステップS62に戻る。
テストケース間の構造定義部55はステップS62で取得したテストケース名を全て選択し終えていれば、ステップS68に進み、テストケース間の関係情報を定義し、テストケース間の関係情報保存部67に出力する。
なお、テストケース関係抽出装置50は、テスト要素定義部51、関数実行回数計測部52、関数実行回数比較部53の部分で、関数の実行回数の比較によるテストケース間の関係情報を構築するものであってもよい。
以下では、プログラムのトレース情報から実際にテストケース間の関係情報を抽出する実施例を説明する。本実施例では、プログラムを実行したときのトレース情報を対象にテストケース間の関係情報を構築する。
図14は、トレース情報の一例の構成図である。トレース情報はテストケースで実行した文の情報が時系列で取得でき、そのときの変数の値が記録できるものとする。関数の呼び出し情報を取得するので、トレース情報は、関数の呼び出し情報を抽出できるものを対象とする。
次にテスト要素定義部51はテスト要素を定義する。テスト要素定義部51はテスト要素設定情報保存部63から、トレース情報を分割するためのキーワードの一例としての関数名を取得する。図15はトレース情報を分割するためのキーワードの一例の構成図である。図15に示すように、ここでは「Method1」、「Method2」、「doGet」、「doFilter」の四種類のキーワードを取得する。
次に、テスト要素定義部51はテストケース別のトレース情報をアプリケーションのテストケース別のトレース資産保存部61から読み込む。テスト要素定義部51はテストケース名「test1」のトレース情報の一行目で「Method1」という関数を実行する(関数の呼び出し)文を取得する。関数を実行する文である場合、テスト要素定義部51は関数名を取得し、その関数名がトレース情報を分割するためのキーワードと一致するかを確認する。
このとき「Method1」は、テスト要素設定情報保存部63に保存しているトレース情報を分割するためのキーワードの一つと一致する。したがって、テスト要素定義部51は本来ならトレース情報の分割を行うが、この場合に限って最初の関数を実行する文(関数の実行文)なので、このまま対象のトレース情報を一つ目のテスト要素として定義する。
テスト要素定義部51は、トレース情報の次の行を読み込むと、「a=1」という代入文であるため、関数の実行文ではないと判定する。したがって、テスト要素定義部51は何も処理を行わず、次の行に進む。
テスト要素定義部51は、トレース情報の次の行を読み込むと、「print a」という出力文であるため、同様に関数の実行文ではないと判定する。したがって、テスト要素定義部51はトレース情報の分割を行わず、次の行を読み込む。
テスト要素定義部51は、トレース情報の次の行を読み込むと、「if(a==1)」という条件文であるため、同様に関数の実行文ではないと判定する。したがって、テスト要素定義部51はトレース情報の分割を行わず、次の行へ進む。
テスト要素定義部51は、トレース情報の次の行を読み込むと、「print a」という出力文であるため、関数の実行文ではないので、トレース情報の分割は行わない。テスト要素定義部51は、トレース情報の次の行を読み込むと、「Method1」という関数の終了を示す実行文である。テスト要素定義部51は関数の実行文(実行開始文)に対してトレース情報の分割を行うので、関数の終了を示す実行文(関数の終了文)に対しては、トレース情報の分割を行わない。
テスト要素定義部51は、トレース情報の次の行を読み込むと、「Method4」という関数の実行文である。関数の開始を示す実行文であるため、テスト要素定義部51は関数名を取得し、その関数名がトレース情報を分割するためのキーワードのいずれでもないのでトレース情報の分割は行わない。
テスト要素定義部51はトレース情報の次の行を読み込むと、「Method4」という関数の終了文であるため、トレース情報の分割を行わない。テスト要素定義部51はトレース情報の次の行を読み込むと、「Method2」という関数の実行文である。関数の開始を示す実行文であるため、テスト要素定義部51は関数名を取得し、その関数名がトレース情報を分割するためのキーワードと一致するかを確認する。「Method2」は、トレース情報を分割するためのキーワードと一致する。したがって、テスト要素定義部51はトレース情報の分割を行う。
テスト要素定義部51は、これまでに取得してきた文のファイルを一つのテスト要素としてまとめる。テスト要素定義部51は「Method2」という関数の実行文の行から別のテスト要素として新たにファイルを定義し、トレース情報を取得する。
テスト要素定義部51は、トレース情報の次の行を読み込むと、「Method3」という関数の実行文である。関数の開始を示す実行文であるため、テスト要素定義部51は関数名を取得し、その関数名がトレース情報を分割するためのキーワードのいずれでもないのでトレース情報の分割は行わない。テスト要素定義部51はトレース情報の次の行を読み込むと、「Method3」という関数の終了文であるため、トレース情報の分割を行わない。
テスト要素定義部51は、トレース情報の次の行を読み込むと、「Method3」という関数の実行文である。関数の開始を示す実行文であるため、テスト要素定義部51は関数名を取得し、その関数名がトレース情報を分割するためのキーワードのいずれでもないのでトレース情報の分割は行わない。テスト要素定義部51はトレース情報の次の行を読み込むと、「Method3」という関数の終了文であるため、トレース情報の分割を行わない。
テスト要素定義部51は、トレース情報の最後の行を読み込むと、「Method2」という関数の終了を示す実行文である。テスト要素定義部51は関数の実行文に対してトレース情報の分割を行うので、関数の終了文に対しては、トレース情報の分割を行わない。
以上で、テスト要素定義部51は、対象の一つのテストケースに対して、二つのテスト要素を定義した処理を終了する。テスト要素定義部51は上記の処理を各テストケースに対して実施し、全てのテストケースに対してテスト要素を作成する。また、テスト要素定義部51は、どのテストケースから作成したテスト要素か、ということを取得できるようにテスト要素及びテストケースの関係情報を作成する。
図16はテスト要素情報保存部に保存されている情報の一例の構成図である。図14に示したテストケース別のトレース情報を図15に示したテスト要素設定情報を元に分割すると、図16(A)に示すようなテスト要素となる。また、テスト要素及びテストケースの関係情報は図16(B)に示すようになる。
図16は「test1」というテストケースから「test1-1」「test1-2」という二つのテスト要素を作成したことを表している。同様に、図16はテストケース「test2」「test3」に対してもテスト要素を定義している。
テストケース「test2」では1行目で関数の実行文「Method2」を読み込む。関数の実行文「Method2」はトレース情報を分割するためのキーワードの一つと一致するので本来ならトレース情報の分割を行うが、この場合に限って最初の関数の実行文なので、このまま対象のトレース情報を一つ目のテスト要素として定義する。次に「Method3」という関数の呼び出しが二回あるが、いずれもトレース情報を分割するためのキーワードと一致しないため、トレース情報の分割は行わない。次に「Method1」という関数の呼び出しがあり、トレース情報を分割するためのキーワードの一つと一致するので、トレース情報の分割を行い、テスト要素として定義する。その後、「Method4」という関数の呼び出しがあるが、トレース情報を分割するためのキーワードと一致しないため、トレース情報の分割は行わない。
以上のように、図16はテストケース「test2」から「test2-1」「test2-2」という二つのテスト要素を作成したことを表している。また、テストケース「test3」に対しても同様にテスト要素を作成すると、関数の実行文「Method1」のみが、トレース情報を分割するためのキーワードの一つと一致するため、「test3」という一つのテスト要素が作成される。
図17は関数実行回数保存部に保存されている情報の一例の構成図である。関数実行回数計測部52は図16(A)に示したテスト要素別のトレース情報を読み込む。関数実行回数計測部52はテスト要素「test1-1」の一行目から「Method1」という関数の実行文を取得する。関数実行回数計測部52は、関数の実行文から関数名「Method1」を取得し、テスト要素「test1-1」の「Method1」という関数の実行回数を一回加算するように関数実行回数保存部64に保存する。
次の行は「a=1」という代入文であるため、関数の実行文ではない。したがって、関数実行回数計測部52は何も処理を行わず、次の行に進む。次の行は「print a」という出力文であるため、同様に関数の実行文ではない。したがって、関数実行回数計測部52は関数の実行回数を数えず、次の行を読み込む。次の行は「if(a==1)」という条件文であるため、関数の実行文ではない。したがって、関数実行回数計測部52は関数の実行回数を数えず、次の行へ進む。次の行も「print a」という出力文であるため、関数の実行文ではない。したがって、関数実行回数計測部52は関数の実行回数を数えず、次の行を読み込む。
次の行は「Method1」という関数の終了文である。関数の実行文に対して関数の実行回数を記録するため、関数の終了文に対しては、関数の実行回数の加算を行わない。次の行は「Method4」という関数の実行文である。したがって、関数実行回数計測部52はテスト要素「test1-1」の「Method4」という関数の実行回数を一回加算するように関数実行回数保存部64に保存する。
以上のように、図17では関数実行回数計測部52がテスト要素「test1-1」内の関数別の実行回数として、関数「Method1」の実行回数が一回、関数「Method4」の実行回数が一回という情報を関数実行回数保存部64に保存する。関数実行回数計測部52は上記の処理を全てのテスト要素に対して実施し、各テスト要素内の関数別の実行回数を取得する。
テスト要素「test1-2」では関数「Method2」の実行回数が一回、関数「Method3」の実行回数が二回という情報を取得する。テスト要素「test2-1」では関数「Method2」の実行回数が一回、関数「Method3」の実行回数が二回という情報を取得する。テスト要素「test2-2」では関数「Method1」の実行回数が一回、関数「Method4」の実行回数が一回という情報を取得する。テスト要素「test3」では関数「Method1」の実行回数が一回、関数「Method4」の実行回数が一回という情報を取得する。
図18は関数実行回数比較結果保存部に保存されている情報の一例の構成図である。関数実行回数比較部53は各テスト要素内の関数別の実行回数を関数実行回数保存部64から取得して、テスト要素間で比較する。関数実行回数比較部53は、最初に全ての関数の実行回数をテスト要素毎に加算する。
例えばテスト要素「test1-1」では関数「Method1」が一回、関数「Method4」が一回なので、関数の実行回数の加算結果として二回が取得される。テスト要素「test1-1」では関数「Method2」が一回、関数「Method3」が二回なので、関数の実行回数の加算結果として三回が取得される。テスト要素「test2-1」では関数「Method2」が一回、関数「Method3」が二回なので、関数の実行回数の加算結果として三回が取得される。
また、テスト要素「test2-2」では関数「Method1」が一回、関数「Method4」が一回なので、関数の実行回数の加算結果として二回が取得される。テスト要素「test3」では関数「Method1」が一回、関数「Method4」が一回なので、関数の実行回数の加算結果として二回が取得される。
関数実行回数比較部53はテスト要素「test1-1」の関数の実行回数を基準に、他のテスト要素を比較対象として関数の実行回数と比較する。テスト要素「test1-2」を比較対象とすると、関数実行回数比較部53はテスト要素「test1-1」の関数の実行回数の加算結果が二回であり、テスト要素「test1-2」の関数の実行回数の加算結果である三回と一致しないため、異なるテスト要素として分類する。
次にテスト要素「test2-1」を比較対象とすると、関数実行回数比較部53はテスト要素「test1-1」の関数の実行回数の加算結果が二回であり、テスト要素「test2-1」の関数の実行回数の加算結果である三回と一致しないため、異なるテスト要素として分類する。
次にテスト要素「test2-2」を比較対象とすると、関数実行回数比較部53はテスト要素「test1-1」の関数の実行回数の加算結果が二回であり、テスト要素「test2-2」の関数の実行回数の加算結果である二回と一致するため、同一のテスト要素として分類する。
次にテスト要素「test3」を比較対象とすると、関数実行回数比較部53はテスト要素「test1-1」の関数の実行回数の加算結果が二回であり、テスト要素「test3」の関数の実行回数の加算結果である二回と一致するため、同一のテスト要素として分類する。
次に、関数実行回数比較部53は関数の実行回数の加算結果が一致したテスト要素について、個々の関数の実行回数を比較する。テスト要素「test1-1」は関数「Method1」が一回である。テスト要素「test2-2」も同様に関数「Method1」が一回である。また、テスト要素「test1-1」は関数「Method4」が一回である。テスト要素「test2-2」も同様に関数「Method4」が一回である。
したがって、テスト要素「test1-1」とテスト要素「test2-2」とは、関数の実行回数の加算結果だけでなく、個々の関数の実行回数も一致するため、同一のテスト要素として関連付けされる。
同様に、テスト要素「test1-1」とテスト要素「test3」とは、関数の実行回数の加算結果だけでなく、個々の関数の実行回数も一致するため、同一のテスト要素として関連付けされる。結果として、テスト要素「test1-1」、「test2-2」、「test3」の三つは全て同一のテスト要素として関連付けされる。
関数実行回数比較部53はテスト要素「test1-1」に対して、関数の実行回数の加算結果が一致した他のテスト要素との個々の関数の実行回数の比較を全て終了したら、次にテスト要素「test1-2」を基準に、関数の実行回数の加算結果が一致した他のテスト要素を対象として個々の関数の実行回数の比較を実施する。
テスト要素「test1-2」は関数「Method2」が一回である。テスト要素「test2-1」も同様に関数「Method2」が一回である。また、テスト要素「test1-2」は関数「Method3」が二回である。テスト要素「test2-1」も同様に関数「Method3」が二回である。
したがって、テスト要素「test1-2」とテスト要素「test2-1」とは、関数の実行回数の加算結果だけでなく、個々の関数の実行回数も一致するため、同一のテスト要素として関連付けされる。
図19はトレース比較結果保存部に保存されている情報の一例の構成図である。関数実行回数比較部53で同一のテスト要素として関連付けされたテスト要素に対し、トレース照合部54は詳細なトレース情報を比較することで、実際に同じ処理を行っているかどうかを確認する。
トレース照合部54は、テスト要素情報保存部62に保存されているトレース情報を取得し、関数実行回数比較部53で同一のテスト要素として関連付けされたテスト要素についてトレース情報の中身を比較する。
まず、トレース照合部54はテスト要素「test1-1」、「test2-2」、「test3」の三つが同一のテスト要素として関連付けされているため、トレース情報の比較を行う。トレース照合部54はテスト要素「test1-1」を基準に比較を行う。まず、トレース照合部54はテスト要素「test1-1」とテスト要素「test2-2」とを比較する。テスト要素「test1-1」には関数の実行文以外に、代入文(a=1)、条件文(if(a==1))、出力文(print a)が存在している。テスト要素「test2-2」には関数の実行文のみが存在している。したがって、テスト要素「test1-1」、「test2-2」は、関数別の実行回数が同じではあるがトレース情報が異なる。同一のテスト要素として関連付けされていたテスト要素「test1-1」、「test2-2」は関連が無いもの(異なるテスト要素)として修正される。同様に、トレース照合部54はテスト要素「test1-1」、「test3」も関数別の実行回数が同じではあるがトレース情報が異なるので、関連が無いものとして修正する。
一方、同一のテスト要素として関連付けされていたテスト要素「test2-2」、「test3」はトレース情報が一致するので、同一のテスト要素として関連付けを有効とする。同一のテスト要素として関連付けされているテスト要素「test1-2」、「test2-1」に対しても同様にトレース照合部54はトレース情報の比較を行う。テスト要素「test1-2」、「test2-1」とはトレース情報が一致するので、同一のテスト要素として関連付けを有効とする。
また、図20はテストケース間の関係情報保存部に保存されている情報の一例の構成図である。テストケース間の構造定義部55は同一のテスト要素として関連付けを有効とされたテスト要素間の関係情報(テスト要素間の比較結果情報)から、テストケース間の関係情報を構築する。
テストケース間の構造定義部55は、最もテスト要素数が少ないテストケースを基準に調査を行う。例えば図16に示したテストケースの例では、最もテスト要素数が少ないテストケース「test3」を基準に調査を行う。
テストケース「test3」はテスト要素「test3」を含む。したがって、テストケース間の構造定義部55はテスト要素「test3」と同じテスト要素を含む他のテストケースが存在した場合、テストケース「test3」が他のテストケースに含まれると判断できる。図16に示したテストケースの例ではテスト要素「test3」がテスト要素「test2-2」と一致するため、テストケース「test3」がテスト要素「test2-1」を含むテストケース「test2」に含まれるとしてテストケース間の関係(包含関係)情報を定義できる。
次に、テストケース間の構造定義部55は、二つのテスト要素を含むテストケースであるテストケース「test1」、「test2」を基準に順番に調査を行う。テストケース「test1」はテスト要素「test1-1」、「test1-2」の両方を含む。したがって、テストケース間の構造定義部55はテスト要素「test1-1」、「test1-2」の両方を含む他のテストケースが存在した場合、テストケース「test1」が他のテストケースに含まれると判断できる。図16に示したテストケースの例ではテスト要素「test1-1」と一致するテスト要素がなく、テスト要素「test1-1」を含む他のテストケースがない。テストケース間の構造定義部55はテストケース「test1」を含む他のテストケースが存在しないため、新たなテストケース間の関係(包含関係)情報を定義できない。
また、テストケース「test2」はテスト要素「test2-1」、「test2-2」の両方を含む。したがって、テストケース間の構造定義部55はテスト要素「test2-1」、「test2-2」の両方を含む他のテストケースが存在した場合、テストケース「test2」が他のテストケースに含まれると判断できる。
例えば図16に示したテストケースの例では、テスト要素「test2-1」と一致するテスト要素「test1-2」がテストケース「test1」に含まれるが、テスト要素「test2-2」と一致するテスト要素「test3」がテストケース「test1」ではなくテストケース「tset3」に含まれているため、テスト要素「test2-1」、「test2-2」の両方を含む他のテストケースが存在しない。したがって、テストケース間の構造定義部55はテストケース「test2」を含む他のテストケースが存在しないため、新たなテストケース間の関係(包含関係)情報を定義できない。
テストケース間の構造定義部55はテストケース「test3」がテストケース「test2」に含まれるというテストケース間の関係情報を最終的な出力とする。図20は最終的な出力形式の例として、テストケース「test2」とテストケース「test3」との間の関係情報を矢印で示している。図20ではテストケース「test2」がテストケース「test3」を包含することを表している。
以上、本実施例のテストケース関係抽出装置50は、保守工程など、コンピュータシステムが一度構築されていて、開発時のテストケースが多く存在していて、整理が出来ていないときに有効である。テストケース間の関係情報を構築することで、本実施例では必要最低限のテストケースのみを実行することで全てのテストケースを実行することと同じ効果が得られる。
従来、同じソース箇所に対して、複数回実行される繰り返しを区別して行われていたテストケースの違いを取得するためには、全てのテストケースに対して、トレース情報を比較する必要があった。
一方、本実施例では一つのテストケースをテスト要素に分割し、その中で、ソースの実行の有無を示すカバレッジ情報ではわからない、関数(メソッド)の実行回数を記録することで、テスト要素の区別が効率化でき、テストケースの構造化ができる。同時に関数の実行回数だけの比較では、処理の実行順序が異なる場合等に見落としが発生する。本実施例ではトレース情報の比較作業も合わせて実施するが、比較する対象を関数の実行回数が一致したテスト要素に限定することで、作業工数を大幅に削減できる。
本発明は、以下に記載する付記のような構成が考えられる。
(付記1)
コンピュータが、
テストケース別のトレース情報を分割したテスト要素内の関数の実行回数を比較するステップと、
前記関数の実行回数を比較した結果、前記関数の実行回数が一致する前記テスト要素間でトレース情報を比較するステップと、
前記トレース情報を比較した結果、前記トレース情報が一致するテスト要素に基づいて前記テスト要素を含む前記テストケース間の関係を定義するステップと
を実行すること
を特徴とするテストケース関係抽出方法。
(付記2)
前記テストケース別のトレース情報を、テスト要素設定情報を利用して分割して前記テスト要素を定義するステップを更に実行すること
を特徴とする付記1記載のテストケース関係抽出方法。
(付記3)
前記テスト要素内の関数の実行回数を、前記関数別に計測するステップを更に実行することを特徴とし、
前記テストケース別のトレース情報を分割したテスト要素内の関数の実行回数を比較するステップは、前記テスト要素内の関数の実行回数を加算した加算結果が一致した前記テスト要素について、更に、前記テスト要素内の関数別の実行回数を比較すること
を特徴とする付記2記載のテストケース関係抽出方法。
(付記4)
前記テスト要素設定情報は、前記トレース情報を分割するためのキーワードであることを特徴とする付記2又は3記載のテストケース関係抽出方法。
(付記5)
テストケース別のトレース情報を分割したテスト要素内の関数の実行回数を比較する実行回数比較手段と、
前記関数の実行回数を比較した結果、前記関数の実行回数が一致する前記テスト要素間でトレース情報を比較するトレース比較手段と、
前記トレース情報を比較した結果、前記トレース情報が一致するテスト要素に基づいて前記テスト要素を含む前記テストケース間の関係を定義する定義手段と
を有すること
を特徴とするテストケース関係抽出装置。
(付記6)
コンピュータに、
テストケース別のトレース情報を分割したテスト要素内の関数の実行回数を比較するステップと、
前記関数の実行回数を比較した結果、前記関数の実行回数が一致する前記テスト要素間でトレース情報を比較するステップと、
前記トレース情報を比較した結果、前記トレース情報が一致するテスト要素に基づいて前記テスト要素を含む前記テストケース間の関係を定義するステップと
を実行させることを特徴とするテストケース関係抽出プログラム。
なお、本実施例におけるテストケース関係抽出プログラムは、パッケージソフトの他、WEBサービス等によっても提供可能である。なお、特許請求の範囲に記載した実行回数比較手段は関数実行回数比較部53に相当し、トレース比較手段はトレース照合部54に相当し、定義手段はテストケース間の構造定義部55に相当する。