(57)【要約】      （修正有）【課題】プログラムの変更によって影響を受ける他のプログラムのテストケースを特定できる技術を提供する。【解決手段】本テストデータ抽出方法は、第１プログラム及び第２プログラムの各々について、シンボリック実行を行い、パス条件及び出力項目の値域を含むテストデータを生成し、変更後の第１プログラムについてシンボリック実行を行い、出力項目の値域を特定し、変更前の第１プログラムについての出力項目の値域である第１値域と、変更後の第１プログラムについての出力項目の値域である第２値域とを用いて、値域が変化した部分を表す式を計算し、第２プログラムについてのテストデータに含まれるパス条件が、値域が変化した出力項目を含むという第１条件、及び、第２プログラムについてのテストデータに含まれるパス条件と値域が変化した部分を表す式との論理積に解が存在するという第２条件が満たされるか判定する処理を含む。【選択図】図６
2015090616.tif 000002
【特許請求の範囲】
【請求項１】
第１のプログラム及び第２のプログラムの各々について、シンボリック実行を行い、プログラム内のパスを特定するための条件であるパス条件及び前記シンボリック実行によって出力される項目の値域を含むテストデータを生成し、
変更後の前記第１のプログラムについてシンボリック実行を行い、当該シンボリック実行によって出力される項目の値域を特定し、
変更前の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第１の値域と、変更後の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第２の値域とを用いて、値域が変化した部分を表す式を計算し、
前記第２のプログラムについてのテストデータに含まれるパス条件が、値域が変化した項目を含むという第１の条件、及び、前記第２のプログラムについてのテストデータに含まれるパス条件と前記値域が変化した部分を表す式との論理積に解が存在するという第２の条件が満たされるか判定する
処理をコンピュータに実行させるためのテストデータ抽出プログラム。
【請求項２】
前記判定する処理が、
前記第２のプログラムについてのテストデータにおける、前記シンボリック実行によって出力される項目が、空ではないという第３の条件がさらに満たされるか判定する
処理を含む請求項１記載のテストデータ抽出プログラム。
【請求項３】
前記値域が変化した部分を表す式を計算する処理が、
前記第１の値域と前記第２の値域の否定との論理積と、前記第１の値域の否定と前記第２の値域との論理積との論理和を計算する処理
を含む請求項１又は２記載のテストデータ抽出プログラム。
【請求項４】
前記シンボリック実行によって出力される項目の値域は、前記シンボリック実行において当該項目について得られる１又は複数の値域の和集合である
ことを特徴とする請求項１乃至３のいずれか１つ記載のテストデータ抽出プログラム。
【請求項５】
第１のプログラム及び第２のプログラムの各々について、シンボリック実行を行い、プログラム内のパスを特定するための条件であるパス条件及び前記シンボリック実行によって出力される項目の値域を含むテストデータを生成し、
変更後の前記第１のプログラムについてシンボリック実行を行い、当該シンボリック実行によって出力される項目の値域を特定し、
変更前の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第１の値域と、変更後の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第２の値域とを用いて、値域が変化した部分を表す式を計算し、
前記第２のプログラムについてのテストデータに含まれるパス条件が、値域が変化した項目を含むという第１の条件、及び、前記第２のプログラムについてのテストデータに含まれるパス条件と前記値域が変化した部分を表す式との論理積に解が存在するという第２の条件が満たされるか判定する
処理をコンピュータが実行するテストデータ抽出方法。
【請求項６】
第１のプログラム及び第２のプログラムの各々について、シンボリック実行を行い、プログラム内のパスを特定するための条件であるパス条件及び前記シンボリック実行によって出力される項目の値域を含むテストデータを生成すると共に、変更後の前記第１のプログラムについてシンボリック実行を行い、当該シンボリック実行によって出力される項目の値域を特定するシンボリック実行部と、
変更前の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第１の値域と、変更後の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第２の値域とを用いて、値域が変化した部分を表す式を計算する計算部と、
前記第２のプログラムについてのテストデータに含まれるパス条件が、値域が変化した項目を含むという第１の条件、及び、前記第２のプログラムについてのテストデータに含まれるパス条件と前記値域が変化した部分を表す式との論理積に解が存在するという第２の条件が満たされるか判定する判定部と、
を有するテストデータ抽出装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、レグレッションテストに関する。
【背景技術】
【０００２】
レグレッションテストとは、プログラムに変更を施した際に、その変更が及ぼす影響を特定するテストのことである。１つのプログラムに変更を施した場合には、他のプログラムにまで変更の影響が及ぶ場合が有る。例えば、変更を施したプログラムの出力結果を用いて処理を行う他のプログラムが有る場合には、そのプログラムが変更の影響を受けることがある。
【０００３】
レグレッションテストに関して、以下のような技術が知られている。具体的には、プログラムを解析することにより、そのプログラム内のデータ項目のうちプログラム変更の影響を受けるデータ項目を特定し、そのデータ項目を参照する他のプログラムを抽出する。
【０００４】
また、プログラムのテストケースを実行した際に実行トレースを登録し、登録した実行トレースに基づき、影響を受けるテストケースを抽出する技術が知られている。
【０００５】
しかし、上記の技術を利用すると、動作に影響が無いプログラム或いはテストケースまで抽出されてしまうことがある。このような場合、本来であればテストを行わなくてもよいプログラム或いはテストケースについて再度テストを実行するという、無駄な工数が発生する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００７−１３３８００号公報
【非特許文献】
【０００７】
【非特許文献１】Gary A. Kildall, "A Unified Approach to Global Program Optimization", ACM Symposium on Principles of Programming Languages, 1973, pages 194-206.
【発明の概要】
【発明が解決しようとする課題】
【０００８】
従って、本発明の目的は、１つの側面では、プログラムの変更によって影響を受ける他のプログラムのテストケースを特定するための技術を提供することである。
【課題を解決するための手段】
【０００９】
本発明に係るテストデータ抽出方法は、第１のプログラム及び第２のプログラムの各々について、シンボリック実行を行い、プログラム内のパスを特定するための条件であるパス条件及びシンボリック実行によって出力される項目の値域を含むテストデータを生成し、変更後の第１のプログラムについてシンボリック実行を行い、当該シンボリック実行によって出力される項目の値域を特定し、変更前の第１のプログラムについてのシンボリック実行により出力される項目の値域である第１の値域と、変更後の第１のプログラムについてのシンボリック実行により出力される項目の値域である第２の値域とを用いて、値域が変化した部分を表す式を計算し、第２のプログラムについてのテストデータに含まれるパス条件が、値域が変化した項目を含むという第１の条件、及び、第２のプログラムについてのテストデータに含まれるパス条件と値域が変化した部分を表す式との論理積に解が存在するという第２の条件が満たされるか判定する処理を含む。
【発明の効果】
【００１０】
１つの側面では、プログラムの変更によって影響を受ける他のプログラムのテストケースを特定できるようになる。
【図面の簡単な説明】
【００１１】
【図１】図１は、本実施の形態の概要を説明するための図である。
【図２】図２は、本実施の形態の概要を説明するための図である。
【図３】図３は、本実施の形態の概要を説明するための図である。
【図４】図４は、本実施の形態の概要を説明するための図である。
【図５】図５は、本実施の形態の概要を説明するための図である。
【図６】図６は、情報処理装置の機能ブロック図である。
【図７】図７は、シンボリック実行においてシンボル化される項目を示す図である。
【図８】図８は、プログラム格納部に格納されているプログラムによる処理について説明するための図である。
【図９】図９は、予め実行する処理の処理フローを示す図である。
【図１０】図１０は、テストケース格納部に格納されるテストケースの一例を示す図である。
【図１１】図１１は、テストケース格納部に格納されるテストケースの一例を示す図である。
【図１２】図１２は、テストケース格納部に格納されるテストケースの一例を示す図である。
【図１３】図１３は、各出力項目の値域の和集合を求める処理の処理フローを示す図である。
【図１４】図１４は、演算データ格納部に格納されるデータの一例を示す図である。
【図１５】図１５は、各出力項目の値域の和集合を求める処理の処理フローを示す図である。
【図１６】図１６は、演算データ格納部に格納されるデータの一例を示す図である。
【図１７】図１７は、値域データ格納部に格納されているデータの一例を示す図である。
【図１８】図１８は、演算データ格納部に格納されるデータの一例を示す図である。
【図１９】図１９は、値域データ格納部に格納されているデータの一例を示す図である。
【図２０】図２０は、演算データ格納部に格納されるデータの一例を示す図である。
【図２１】図２１は、値域データ格納部に格納されているデータの一例を示す図である。
【図２２】図２２は、変更後のプログラムを示す図である。
【図２３】図２３は、テストケース格納部に格納されるテストケースの一例を示す図である。
【図２４】図２４は、値域データ格納部に格納されているデータの一例を示す図である。
【図２５】図２５は、差分演算部が実行する処理の処理フローを示す図である。
【図２６】図２６は、差分演算部が実行する処理を説明するための図である。
【図２７】図２７は、差分演算部が実行する処理を説明するための図である。
【図２８】図２８は、影響テストケース特定部が実行する処理の処理フローを示す図である。
【図２９】図２９は、影響テストケース格納部に格納されるデータの一例を示す図である。
【図３０】図３０は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１２】
図１乃至図５を用いて、本実施の形態の概要について説明する。本実施の形態においては、或るプログラムを変更した場合に、他のプログラムのテストケースのうち影響を受けるテストケースを特定するため、以下のような処理を実行する。
【００１３】
まず、事前の処理として、図１に示す処理が行われる。具体的には、関連する複数のプログラムの各々について、シンボリック実行を行う。図１においては、プログラム１と、プログラム２と、プログラム３とについてシンボリック実行を行っている。そして、各プログラムについてテストケースを生成する。テストケースには、プログラム内のパスを特定するための条件であるパス条件と、プログラムの実行の結果として出力される項目（以下、出力項目と呼ぶ）の値域とが含まれる。図１の例では、各プログラムについて２つのテストケースが生成される。但し、プログラム３における、パス条件が「ｘ！＝１００」であるテストケースのように、テストケースに含まれる出力項目が空である（すなわち、出力項目が無い）場合がある。そして、各プログラムの各テストケースについて、出力項目の値域の和集合を求める。例えばプログラム１については、出力項目ａについて、「ａ＝１」と「ａ＝０」との和集合「ａ＝１ｏｒ０」を求め、出力項目ｂについて、「ｂ＝０」と「ｂ＝０」との和集合「ｂ＝０」を求める。
【００１４】
なお、シンボリック実行については、例えば、玉井哲雄、福永光一、「記号実行システム」、情報処理、pp18-28、1982/01/15などに詳しく述べられているので、そちらを参照されたい。
【００１５】
ここで、プログラム１に変更が施されたとする。すると、図２に示すように、プログラム１について、図１を用いて説明した処理を再度実行する。そして、プログラム１の出力項目ａ及び出力項目ｂについて、値域の和集合を求める。この例では、ａについては「ａ＝−１ｏｒ０」であり、ｂについては「ｂ＝０」である。
【００１６】
そして、図３に示すように、プログラム１について、変更前における、出力項目の値域の和集合と、変更後における、出力項目の値域の和集合とを比較する。本例では、出力項目ａ及び出力項目ｂの各々について、値域の和集合を比較し、変化があった領域を求める。出力項目ｂについては、変更前後で値域の和集合に変化は無いが、出力項目ａについては、変更前後で値域の和集合に変化がある。具体的には、変更前においては「ａ＝１」が値域の和集合に含まれていたが変更後には含まれておらず、変更後においては「ａ＝−１」が値域の和集合に含まれているが変更前には含まれていない。したがって、変更前後における値域の変化部分は「ａ＝１ｏｒａ＝−１」と表すことができる。
【００１７】
プログラム１を変更したことにより、関連するプログラム２及びプログラム３が影響を受ける可能性がある。そこで、プログラム２及びプログラム３について、影響を受けるテストケースを特定する。まず、図４に示すように、プログラム２及びプログラム３について、パス条件を抽出する。図４の例では、プログラム２について、「ａ＞１」及び「ａ＜＝１」が抽出され、プログラム３について、「ｘ＝１００」及び「ｘ！＝１００」が抽出される。
【００１８】
そして、図５に示すように、プログラム２及びプログラム３について抽出されたパス条件に、値域が変化した出力項目（出力項目ａ）が含まれるか判定する。本例では、「ａ＞１」及び「ａ＜＝１」には出力項目ａが含まれ、「ｘ＝１００」及び「ｘ！＝１００」には出力項目ａが含まれない。そこで、「ａ＞１」及び「ａ＜＝１」についてさらなる判定を行う。具体的には、パス条件と出力項目ａの値域の変化を表す式とをａｎｄ（すなわち論理積）で結合し、解が有るか判定する。「ａ＜＝１  ａｎｄ  （ａ＝１ｏｒａ＝−１）」には、ａ＝１という解が有り、「ａ＞１  ａｎｄ  （ａ＝１ｏｒａ＝−１）」には、解が無い。そこで、「ａ＜＝１」についてさらなる判定を行う。具体的には、「ａ＜＝１」というパス条件についてのテストケース（図５におけるテストケース５０）に、出力項目が有るか（すなわち、何らかの出力が有るか）判定する。本例では、ｃ及びｄという出力項目が有る。よって、テストケース５０は、プログラム１に施した変更に影響を受けるテストケース（以下、影響テストケースと呼ぶ）である。
【００１９】
プログラム内には複数のパスが存在する場合があり、変更の影響が全てのパスのテストケースに及ぶとは限らない。そこで、図１乃至図５に示したようにすれば、プログラムのテストケースのうち、他のプログラムに施した変更に影響を受けるテストケースを特定できるようになる。これにより、再度テストを実行すべきテストケースを少なくすることができるので、プログラム変更時における工数を削減できるようになる。
【００２０】
以下では、本実施の形態の詳細な内容について説明する。
【００２１】
図６に、本実施の形態における情報処理装置１の機能ブロック図を示す。情報処理装置１は、プログラム格納部１０１と、変更後プログラム格納部１０２と、シンボリック実行部１０３と、入力項目格納部１０４と、採番テーブル格納部１０５と、メンバテーブル格納部１０６と、テストケース格納部１０７と、値域特定部１０８と、演算データ格納部１０９と、値域データ格納部１１０と、差分演算部１１１と、差分データ格納部１１２と、影響テストケース特定部１１３と、影響テストケース格納部１１４とを含む。
【００２２】
プログラム格納部１０１には、本実施の形態における処理の対象になる、関連する複数のプログラムが格納される。変更後プログラム格納部１０２には、プログラム格納部１０１に格納されているプログラムのうち、変更されたプログラムが格納される。
【００２３】
シンボリック実行部１０３は、プログラム格納部１０１に格納されているプログラムについて、入力項目格納部１０４に格納されているデータ、採番テーブル格納部１０５に格納されているデータ、及びメンバテーブル格納部１０６に格納されているデータを用いてシンボリック実行を行う。そして、シンボリック実行部１０３は、シンボリック実行の結果（本実施の形態においては、テストケース）をテストケース格納部１０７に格納する。同様に、シンボリック実行部１０３は、変更後プログラム格納部１０２に格納されている、変更後のプログラムについて、入力項目格納部１０４に格納されているデータ、採番テーブル格納部１０５に格納されているデータ、及びメンバテーブル格納部１０６に格納されているデータを用いてシンボリック実行を行う。そして、シンボリック実行部１０３は、シンボリック実行の結果をテストケース格納部１０７に格納する。
【００２４】
値域特定部１０８は、テストケース格納部１０７に格納されているデータ及び演算データ格納部１０９に格納されているデータを用いて処理を行い、処理結果を値域データ格納部１１０に格納する。差分演算部１１１は、値域データ格納部１１０に格納されているデータを用いて処理を行い、処理結果を差分データ格納部１１２に格納する。影響テストケース特定部１１３は、差分データ格納部１１２に格納されているデータを用いて処理を行い、処理結果を影響テストケース格納部１１４に格納する。
【００２５】
図７に、シンボリック実行においてシンボル化される項目を示す。入力項目格納部１０４には、ユーザから入力された入力項目である、ユーザ名（ｎａｍｅ）及びランク（ｒａｎｋ）が格納されるが、これらの入力項目がシンボリック実行においてシンボル化される。また、採番テーブル格納部１０５に格納される採番テーブルには、現在の番号という項目（ｃｕｒｒｅｎｔＩｄ）が格納されるが、この項目もシンボル化される。メンバテーブル格納部１０６に格納されるメンバテーブルにおいては、シンボル化される項目は無い。
【００２６】
図８を用いて、プログラム格納部１０１に格納されているプログラムによる処理について説明する。本実施の形態においては、図８に示したプログラム「ｃｒｅａｔｅＭｅｍｂｅｒ」、プログラム「ｃａｌｃｕｌａｔｅＤｉｓｃｏｕｎｔ」及びプログラム「ｓｅｎｄＭａｉｌ」がプログラム格納部１０１に格納される。プログラム「ｃｒｅａｔｅＭｅｍｂｅｒ」は、「ｒａｎｋ」が１又は２である場合にメンバテーブルにメンバの情報を追加するプログラムである。プログラム「ｃａｌｃｕｌａｔｅＤｉｓｃｏｕｎｔ」は、メンバテーブルに格納されたメンバの情報を参照し、「ｒａｎｋ」に紐付く割引率によって計算を行うプログラムである。プログラム「ｓｅｎｄＭａｉｌ」は、メンバテーブルに格納されたメンバの情報を参照し、「ｒａｎｋ」が２以上であればメールを送信するプログラムである。このように、プログラム「ｃａｌｃｕｌａｔｅＤｉｓｃｏｕｎｔ」及びプログラム「ｓｅｎｄＭａｉｌ」は、プログラム「ｃｒｅａｔｅＭｅｍｂｅｒ」の出力項目を使用して処理を行う。
【００２７】
次に、図９乃至図２９を用いて、情報処理装置１の動作について説明する。
【００２８】
まず、図９乃至図２１を用いて、予め実行する処理について説明する。なお、本処理を実行する段階では、変更後プログラム格納部１０２には変更後のプログラムは格納されていない。
【００２９】
シンボリック実行部１０３は、プログラム格納部１０１に格納されているプログラムの中から、未処理のプログラムを１つ特定する（図９：ステップＳ１）。シンボリック実行部１０３は、特定されたプログラムについてシンボリック実行を行い（ステップＳ３）、シンボリック実行の結果（本実施の形態においては、テストケース）をテストケース格納部１０７に格納する。
【００３０】
シンボリック実行部１０３は、プログラム格納部１０１に未処理のプログラムが有るか判断する（ステップＳ５）。未処理のプログラムが有る場合（ステップＳ５：Ｙｅｓルート）、未処理のプログラムについて処理するため、ステップＳ１の処理に戻る。一方、未処理のプログラムが無い場合（ステップＳ５：Ｎｏルート）、処理を終了する。
【００３１】
以上のような処理を実行すれば、各プログラムについてテストケースを用意することができる。
【００３２】
図１０乃至図１２に、テストケース格納部１０７に格納されるテストケースの一例を示す。図１０は、プログラム「ｃｒｅａｔｅＭｅｍｂｅｒ」についてのテストケースであり、図１１は、プログラム「ｃａｌｃｕｌａｔｅＤｉｓｃｏｕｎｔ」についてテストケースであり、図１２は、プログラム「ｓｅｎｄＭａｉｌ」についてのテストケースである。各テストケースには、テストケースの番号と、プログラム名と、パス条件と、出力項目の値域とが含まれる。なお、番号が３であるテストケース及び番号が２２であるテストケースのように、出力項目の値域を含まない場合もある。また、番号が２０であるテストケースのように、別のプログラム或いは関数の呼び出しを出力項目として取り扱う場合もある。
【００３３】
次に、図１３乃至図２１を用いて、各出力項目の値域の和集合を求める処理について説明する。本処理は、各プログラムについて行われる。
【００３４】
まず、値域特定部１０８は、テストケース格納部１０７から未処理のテストケースを１つ特定する（図１３：Ｓ１１）。そして、値域特定部１０８は、特定されたテストケースからデータ（ここでは、プログラム名、出力項目、出力項目の値域、及びパス条件）を抽出し、演算データ格納部１０９に格納する（ステップＳ１３）。
【００３５】
図１４に、演算データ格納部１０９に格納されるデータの一例を示す。図１４の例では、プログラム名と、出力項目と、出力項目の値域と、パス条件とが格納される。ステップＳ１３の処理の時点では、「パス条件代入後の値域」の欄には何も格納されない。
【００３６】
図１３の説明に戻り、値域特定部１０８は、テストケース格納部１０７に未処理のテストケースが有るか判断する（ステップＳ１５）。未処理のテストケースが有る場合（ステップＳ１５：Ｙｅｓルート）、未処理のテストケースについて処理するため、ステップＳ１１の処理に戻る。一方、未処理のテストケースが無い場合（ステップＳ１５：Ｎｏルート）、値域特定部１０８は、演算データ格納部１０９から未処理の行を１つ特定する（ステップＳ１７）。
【００３７】
値域特定部１０８は、特定された行について、出力項目の値域にパス条件を代入し、結果を同じ行における「パス条件代入後の値域」の欄に格納する（ステップＳ１９）。
【００３８】
値域特定部１０８は、未処理の行が有るか判断する（ステップＳ２１）。未処理の行が有る場合（ステップＳ２１：Ｙｅｓルート）、未処理の行について処理するため、ステップＳ１７の処理に戻る。一方、未処理の行が無い場合（ステップＳ２１：Ｎｏルート）、処理は端子Ａを介して図１５のステップＳ２３の処理に移行する。
【００３９】
図１６に、未処理の行が無くなった時点における演算データ格納部１０９に格納されるデータの一例を示す。図１６の例では、図１４と比較すると、「パス条件代入後の値域」の欄にデータが格納されている。１、２、３、４、７及び８行目の「パス条件代入後の値域」の欄に格納されるデータは、パス条件が代入されたにもかかわらず、出力項目の値域の欄に格納されるデータと差異が無い。これは、出力項目の値域に、「Ｓｙｍ＿ｒａｎｋ」が含まれていないためである。これに対して、５及び６行目における出力項目の値域には、「Ｓｙｍ＿ｒａｎｋ」が含まれているため、「出力項目の値域」と「パス条件代入後の出力項目の値域」とが異なっている。
【００４０】
次に、図１５の端子Ａ以降の処理について説明する。値域特定部１０８は、演算データ格納部１０９から未処理の行を１つ特定する（図１５：ステップＳ２３）。
【００４１】
値域特定部１０８は、値域データ格納部１１０において、特定された行の出力項目を含む行を探索する（ステップＳ２５）。値域特定部１０８は、行が検出されたか判断する（ステップＳ２７）。行が検出されない場合（ステップＳ２７：Ｎｏルート）、値域特定部１０８は、ステップＳ２３において特定された行のデータ（ここでは、プログラム名、出力項目、及び出力項目の値域）を値域データ格納部１１０に格納する（ステップＳ２９）。
【００４２】
図１７に、値域データ格納部１１０に格納されているデータの一例を示す。図１７の例では、プログラム名と、出力項目と、値域の和集合とが格納される。なお、ステップＳ２７のＮｏルートを経由する場合、値域の和集合に格納されるデータは、出力項目の値域である。
【００４３】
一方、行が検出された場合（ステップＳ２７：Ｙｅｓルート）、値域特定部１０８は、ステップＳ２７において検出された行の和集合が、ステップＳ２３において特定された行におけるパス条件代入後の値域を含むか判定する（ステップＳ３１）。特定された行におけるパス条件代入後の値域を含む場合（ステップＳ３３：Ｙｅｓルート）、新たに値域を追加しなくてもよいので、ステップＳ３７の処理に移行する。特定された行におけるパス条件代入後の値域を含まない場合（ステップＳ３３：Ｎｏルート）、値域特定部１０８は、検出された行の和集合と、特定された行におけるパス条件代入後の値域とを、論理和（ＯＲ）で接続する（ステップＳ３５）。そしてステップＳ３７の処理に移行する。
【００４４】
値域特定部１０８は、演算データ格納部１０９に未処理の行が有るか判断する（ステップＳ３７）。未処理の行が有る場合（ステップＳ３７：Ｙｅｓルート）、未処理の行について処理するため、ステップＳ２３の処理に戻る。一方、未処理の行が無い場合（ステップＳ３７：Ｎｏルート）、処理を終了する。
【００４５】
以上のような処理を行うことで、テストケース毎の値域を、出力項目毎に整理することができる。そして、プログラムに変更が施された際に、整理されたデータを利用して処理を行うことができるようになる。
【００４６】
同様に、プログラム「ｃｒｅａｔｅＤｉｓｃｏｕｎｔ」のテストケースについて、上で述べた処理によって、図１８に示すデータが演算データ格納部１０９に格納されたとする。すると、値域データ格納部１１０には、図１９に示すデータが格納される。
【００４７】
また、プログラム「ｓｅｎｄＭａｉｌ」のテストケースについて、上で述べた処理によって、図２０に示すデータが演算データ格納部１０９に格納されたとする。すると、値域データ格納部１１０には、図２１に示すデータが格納される。
【００４８】
ここで、図８に示したプログラム「ｃｒｅａｔｅＭｅｍｂｅｒ」の２行目にコードが追加され、図２２に示すように変更されたとする。図２２においては、変更により新たに追加された部分に下線が付されている。この変更により、「ｒａｎｋ」が１又は２ではない場合だけでなく、「ｒａｎｋ」が０ではない場合も例外として取り扱われる。
【００４９】
図２２に示したプログラムが、変更後プログラム格納部１０２に格納されると、シンボリック実行部１０３は、変更後のプログラム「ｃｒｅａｔｅＭｅｍｂｅｒ」について再度シンボリック実行を行う。すると、図２３に示すようなテストケースが生成され、テストケース格納部１０７に格納される。図２３に示した、番号が３であるテストケースは、図１０には無かったテストケースである。図２３に示した、番号が４であるテストケースは、図１０に示した、番号が３であるテストケースに相当するが、パス条件に「＆＆Ｓｙｍ＿ｒａｎｋ！＝０」が新たに追加されている。また、図２３に示したテストケースについて、値域特定部１０８が処理を行うと、図２４に示すように値域の和集合が求められ、値域データ格納部１１０に格納される。
【００５０】
次に、図２５乃至図２９を用いて、影響テストケースを特定する処理について説明する。まず、図２５乃至図２７を用いて、差分演算部１１１が実行する処理について説明する。
【００５１】
まず、差分演算部１１１は、値域データ格納部１１０に格納されている、プログラムの変更前後における値域の和集合を比較し、値域の和集合が変化した出力項目を特定する（図２５：ステップＳ４１）。例えば、図１７に示した和集合と、図２４に示した和集合とを比較すると、出力項目「メンバテーブル．ｒａｎｋ」が特定される。そして、差分演算部１１１は、ステップＳ４１において特定された出力項目の中から未処理の出力項目を１つ選択する（ステップＳ４３）。
【００５２】
差分演算部１１１は、ステップＳ４３において選択された出力項目について、変更前の和集合と変更後の和集合の否定との論理積を計算する（ステップＳ４５）。ステップＳ４５の処理について、図２６を用いて説明する。図２６においては、変更前における各出力項目の値域の和集合２６１と、変更後における各出力項目の値域の和集合２６２とが示されている。選択された出力項目が「メンバテーブル．ｒａｎｋ」である場合、変更前の和集合２６３として「ｒａｎｋ＝１  ｏｒ  ｒａｎｋ＝２」が抽出され（図を見やすくするため、「メンバテーブル．」の部分を省略している）、変更後の和集合の否定２６４として「ｎｏｔ（ｒａｎｋ＝１  ｏｒ  ｒａｎｋ＝２  ｏｒ  ｒａｎｋ＝０）」が抽出される。そして、両者の論理積である、「（ｒａｎｋ＝１  ｏｒ  ｒａｎｋ＝２）  ａｎｄ  ｎｏｔ（ｒａｎｋ＝１  ｏｒ  ｒａｎｋ＝２  ｏｒ  ｒａｎｋ＝０）」が計算される。
【００５３】
差分演算部１１１は、ステップＳ４３において選択された出力項目について、変更前の和集合の否定と変更後の和集合との論理積を計算する（ステップＳ４７）。ステップＳ４７の処理についても、図２６を用いて説明する。ステップＳ４７においては、変更前の和集合の否定２６５として「ｎｏｔ（ｒａｎｋ＝１  ｏｒ  ｒａｎｋ＝２）」が抽出され、変更後の和集合２６６として「ｒａｎｋ＝１  ｏｒ  ｒａｎｋ＝２  ｏｒ  ｒａｎｋ＝０」が抽出される。そして、両者の論理積である、「ｎｏｔ（ｒａｎｋ＝１  ｏｒ  ｒａｎｋ＝２）  ａｎｄ  （ｒａｎｋ＝１  ｏｒ  ｒａｎｋ＝２  ｏｒ  ｒａｎｋ＝０）」が計算される。
【００５４】
差分演算部１１１は、計算された２つの論理積の論理和を簡約化することで、出力項目の値域の変化部分を表す式を計算し、差分データ格納部１１２に格納する（ステップＳ４９）。図２６においては、計算された２つの論理積の論理和２６７が示されている。そして、論理和２６７を簡約化することで、出力項目の値域の変化部分を表す式２６８（メンバテーブル．ｒａｎｋ＝０）が求められる。さらに図２７を用いて、ステップＳ４５乃至Ｓ４９の処理を説明する。図２７においては、斜線が付された楕円が、値域を表している。ステップＳ４５乃至Ｓ４９の処理によれば、図２７に示すように、変更前にのみ存在する値域及び変更後にのみ存在する値域（２つの楕円が重なっていない部分）が特定される。
【００５５】
差分演算部１１１は、未処理の出力項目が有るか判断する（ステップＳ５１）。未処理の出力項目が有る場合（ステップＳ５１：Ｙｅｓルート）、未処理の出力項目について処理するため、ステップＳ４３の処理に戻る。一方、未処理の出力項目が無い場合（ステップＳ５１：Ｎｏルート）、処理を終了する。
【００５６】
このように、プログラムの変更による出力項目の値域の変化部分を表す式を算出しておくことで、影響テストケース特定部１１３の処理に利用できるようになる。
【００５７】
そして、影響テストケース特定部１１３は、以下のような処理を実行する。図２８及び図２９を用いて、影響テストケース特定部１１３が実行する処理について説明する。
【００５８】
まず、影響テストケース特定部１１３は、差分データ格納部１１２に格納されている、出力項目の値域の変化部分を表す式のうち、未処理の式を１つ特定する（図２８：ステップＳ６１）。そして、影響テストケース特定部１１３は、特定された式に含まれる出力項目を、シンボル項目に置き換える（ステップＳ６３）。出力項目の値域の変化部分を表す式が、例えば「メンバテーブル．ｒａｎｋ」である場合には、出力項目をシンボル項目に置き換えることで、「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ＝０」という式を生成する。
【００５９】
影響テストケース特定部１１３は、テストケース格納部１０７に格納されている、他のプログラム（ここでは、プログラム「ｃａｌｃｕｌａｔｅＤｉｓｃｏｕｎｔ」及びプログラム「ｓｅｎｄＭａｉｌ」）についてのテストケースの中から、未処理のテストケースを１つ特定する（ステップＳ６５）。
【００６０】
影響テストケース特定部１１３は、特定されたテストケースのパス条件の中に、ステップＳ６３において置き換えを行ったシンボル項目（上の例では、Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ）が有るか判定する（ステップＳ６７）。シンボル項目が無い場合（ステップＳ６９：Ｎｏルート）、プログラム「ｃｒｅａｔｅＭｅｍｂｅｒ」に施した変更の影響を受けないので、ステップＳ８１の処理に移行する。
【００６１】
シンボル項目が有る場合（ステップＳ６９：Ｙｅｓルート）、影響テストケース特定部１１３は、ステップＳ６１において特定された式と、ステップＳ６５において特定されたテストケースのパス条件との論理積を求め、解が存在するか判定する（ステップＳ７１）。解が存在しない場合（ステップＳ７３：Ｎｏルート）、プログラム「ｃｒｅａｔｅＭｅｍｂｅｒ」に施した変更の影響を受けないので、ステップＳ８１の処理に移行する。
【００６２】
解が存在する場合（ステップＳ７３：Ｙｅｓルート）、影響テストケース特定部１１３は、ステップＳ６５において特定されたテストケースの出力項目が空である（すなわち、出力項目が無い）か判定する（ステップＳ７５）。空である場合（ステップ７７：Ｙｅｓルート）、ステップＳ８１の処理に移行する。
【００６３】
空ではない場合（ステップＳ７７：Ｎｏルート）、影響テストケース特定部１１３は、ステップＳ６５において特定されたテストケースを影響テストケース格納部１１４に格納する（ステップＳ７９）。
【００６４】
影響テストケース特定部１１３は、未処理のテストケースが有るか判断する（ステップＳ８１）。未処理のテストケースが有る場合（ステップＳ８１：Ｙｅｓルート）、未処理のテストケースについて処理するため、ステップＳ６５の処理に戻る。
【００６５】
一方、未処理のテストケースが無い場合（ステップＳ８１：Ｎｏルート）、影響テストケース特定部１１３は、未処理の式が有るか判断する（ステップＳ８３）。未処理の式が有る場合（ステップＳ８３：Ｙｅｓルート）、未処理の式について処理するため、ステップＳ６１の処理に戻り、未処理の式が無い場合（ステップＳ８３：Ｎｏルート）、処理を終了する。
【００６６】
例えば、図１１に示したプログラム「ｃａｌｃｕｌａｔｅＤｉｓｃｏｕｎｔ」についてのテストケース及び図１２に示したプログラム「ｓｅｎｄＭａｉｌ」についてのテストケースの中から、プログラム「ｃｒｅａｔｅＭｅｍｂｅｒ」の変更に影響を受けるテストケースを特定することを考える。
【００６７】
番号が１０であるテストケースのパス条件には「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ」が有り、また「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ＝０」と番号が１０であるテストケースのパス条件との論理積の解が存在し、且つ出力項目が空ではない。よって、番号が１０であるテストケースは、影響を受けるテストケースであると判定される。
【００６８】
番号が１１であるテストケースのパス条件には「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ」が無いので、番号が１１であるテストケースは、影響を受けるテストケースではないと判定される。
【００６９】
番号が１２であるテストケースのパス条件には「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ」が有り、また「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ＝０」と番号が１２であるテストケースのパス条件との論理積の解が存在し、且つ出力項目が空ではない。よって、番号が１２であるテストケースは、影響を受けるテストケースであると判定される。
【００７０】
番号が２０であるテストケースのパス条件には「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ」が有るが、「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ＝０」と番号が２０であるテストケースのパス条件との論理積の解が存在しない。よって、番号が２０であるテストケースは、影響を受けるテストケースではないと判定される。
【００７１】
番号が２１であるテストケースのパス条件には「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ」が無いので、番号が２１であるテストケースは、影響を受けるテストケースではないと判定される。
【００７２】
番号が２２であるテストケースのパス条件には「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ」が有り、また「Ｓｙｍ＿ｍｅｍｂｅｒ．ｒａｎｋ＝０」と番号が２２であるテストケースのパス条件との論理積の解が存在するが、出力項目が空である。よって、番号が２２であるテストケースは、影響を受けるテストケースではないと判定される。
【００７３】
すると、最終的には、図２９に示すようなデータが影響テストケース格納部１１４に格納される。本実施の形態で示した例の場合には、影響を受けるテストケースは２つである。
【００７４】
以上のように、本実施の形態においては、出力項目の値域の変化を抽出しているので、他のプログラムのテストケースのうち、変更の影響が及ぶテストケースを特定できるようになる。これにより、再度テストを実行すべきテストケースを少なくすることができるので、プログラム変更時における工数を削減できるようになる。
【００７５】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置１の機能ブロック構成は実際のプログラムモジュール構成に一致しない場合もある。
【００７６】
また、上で説明した各テーブルの構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【００７７】
なお、上で述べた情報処理装置１は、コンピュータ装置であって、図３０に示すように、メモリ２５０１とＣＰＵ（Central Processing Unit）２５０３とハードディスク・ドライブ（ＨＤＤ：Hard Disk Drive）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーション・プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本発明の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【００７８】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【００７９】
本実施の形態に係るテストデータ抽出方法は、（Ａ）第１のプログラム及び第２のプログラムの各々について、シンボリック実行を行い、プログラム内のパスを特定するための条件であるパス条件及びシンボリック実行によって出力される項目の値域を含むテストデータを生成し、（Ｂ）変更後の第１のプログラムについてシンボリック実行を行い、当該シンボリック実行によって出力される項目の値域を特定し、（Ｃ）変更前の第１のプログラムについてのシンボリック実行により出力される項目の値域である第１の値域と、変更後の第１のプログラムについてのシンボリック実行により出力される項目の値域である第２の値域とを用いて、値域が変化した部分を表す式を計算し、（Ｄ）第２のプログラムについてのテストデータに含まれるパス条件が、値域が変化した項目を含むという第１の条件、及び、第２のプログラムについてのテストデータに含まれるパス条件と値域が変化した部分を表す式との論理積に解が存在するという第２の条件が満たされるか判定する処理を含む。
【００８０】
プログラム内には複数のパスが存在する場合があり、変更の影響が全てのパスのテストデータに及ぶとは限らない。そこで、上で述べたようにすれば、プログラムのテストデータのうち、他のプログラムに施した変更に影響を受けるテストデータを特定できるようになる。これにより、再度テストを実行すべきテストデータを少なくすることができるので、プログラム変更時における工数を削減できるようになる。
【００８１】
また、上で述べた判定する処理において、（ｄ１）第２のプログラムについてのテストデータにおける、シンボリック実行によって出力される項目が、空ではないという第３の条件がさらに満たされるか判定してもよい。そもそも出力される項目が無ければ、出力される項目の値を利用する処理等が無いので、再度のテストを実行しなくてもよい。
【００８２】
また、上で述べた値域が変化した部分を表す式を計算する処理において、（ｃ１）第１の値域と第２の値域の否定との論理積と、第１の値域の否定と第２の値域との論理積との論理和を計算してもよい。このようにすれば、変更前のみに存在する値域及び変更後のみに存在する値域を表す式を計算できるようになる。
【００８３】
また、シンボリック実行によって出力される項目の値域は、シンボリック実行において当該項目について得られる１又は複数の値域の和集合であってもよい。このようにすれば、出力される項目の値域を適切に特定できるようになる。
【００８４】
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【００８５】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【００８６】
（付記１）
第１のプログラム及び第２のプログラムの各々について、シンボリック実行を行い、プログラム内のパスを特定するための条件であるパス条件及び前記シンボリック実行によって出力される項目の値域を含むテストデータを生成し、
変更後の前記第１のプログラムについてシンボリック実行を行い、当該シンボリック実行によって出力される項目の値域を特定し、
変更前の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第１の値域と、変更後の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第２の値域とを用いて、値域が変化した部分を表す式を計算し、
前記第２のプログラムについてのテストデータに含まれるパス条件が、値域が変化した項目を含むという第１の条件、及び、前記第２のプログラムについてのテストデータに含まれるパス条件と前記値域が変化した部分を表す式との論理積に解が存在するという第２の条件が満たされるか判定する
処理をコンピュータに実行させるためのテストデータ抽出プログラム。
【００８７】
（付記２）
前記判定する処理が、
前記第２のプログラムについてのテストデータにおける、前記シンボリック実行によって出力される項目が、空ではないという第３の条件がさらに満たされるか判定する
処理を含む付記１記載のテストデータ抽出プログラム。
【００８８】
（付記３）
前記値域が変化した部分を表す式を計算する処理が、
前記第１の値域と前記第２の値域の否定との論理積と、前記第１の値域の否定と前記第２の値域との論理積との論理和を計算する処理
を含む付記１又は２記載のテストデータ抽出プログラム。
【００８９】
（付記４）
前記シンボリック実行によって出力される項目の値域は、前記シンボリック実行において当該項目について得られる１又は複数の値域の和集合である
ことを特徴とする付記１乃至３のいずれか１つ記載のテストデータ抽出プログラム。
【００９０】
（付記５）
第１のプログラム及び第２のプログラムの各々について、シンボリック実行を行い、プログラム内のパスを特定するための条件であるパス条件及び前記シンボリック実行によって出力される項目の値域を含むテストデータを生成し、
変更後の前記第１のプログラムについてシンボリック実行を行い、当該シンボリック実行によって出力される項目の値域を特定し、
変更前の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第１の値域と、変更後の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第２の値域とを用いて、値域が変化した部分を表す式を計算し、
前記第２のプログラムについてのテストデータに含まれるパス条件が、値域が変化した項目を含むという第１の条件、及び、前記第２のプログラムについてのテストデータに含まれるパス条件と前記値域が変化した部分を表す式との論理積に解が存在するという第２の条件が満たされるか判定する
処理をコンピュータが実行するテストデータ抽出方法。
【００９１】
（付記６）
第１のプログラム及び第２のプログラムの各々について、シンボリック実行を行い、プログラム内のパスを特定するための条件であるパス条件及び前記シンボリック実行によって出力される項目の値域を含むテストデータを生成すると共に、変更後の前記第１のプログラムについてシンボリック実行を行い、当該シンボリック実行によって出力される項目の値域を特定するシンボリック実行部と、
変更前の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第１の値域と、変更後の前記第１のプログラムについてのシンボリック実行により出力される項目の値域である第２の値域とを用いて、値域が変化した部分を表す式を計算する計算部と、
前記第２のプログラムについてのテストデータに含まれるパス条件が、値域が変化した項目を含むという第１の条件、及び、前記第２のプログラムについてのテストデータに含まれるパス条件と前記値域が変化した部分を表す式との論理積に解が存在するという第２の条件が満たされるか判定する判定部と、
を有するテストデータ抽出装置。
【符号の説明】
【００９２】
１  情報処理装置    １０１  プログラム格納部
１０２  変更後プログラム格納部    １０３  シンボリック実行部
１０４  入力項目格納部    １０５  採番テーブル格納部
１０６  メンバテーブル格納部    １０７  テストケース格納部
１０８  値域特定部    １０９  演算データ格納部
１１０  値域データ格納部    １１１  差分演算部
１１２  差分データ格納部    １１３  影響テストケース特定部
１１４  影響テストケース格納部
【図１】
2015090616.tif 000003
【図２】
2015090616.tif 000004
【図３】
2015090616.tif 000005
【図４】
2015090616.tif 000006
【図５】
2015090616.tif 000007
【図６】
2015090616.tif 000008
【図７】
2015090616.tif 000009
【図８】
2015090616.tif 000010
【図９】
2015090616.tif 000011
【図１０】
2015090616.tif 000012
【図１１】
2015090616.tif 000013
【図１２】
2015090616.tif 000014
【図１３】
2015090616.tif 000015
【図１４】
2015090616.tif 000016
【図１５】
2015090616.tif 000017
【図１６】
2015090616.tif 000018
【図１７】
2015090616.tif 000019
【図１８】
2015090616.tif 000020
【図１９】
2015090616.tif 000021
【図２０】
2015090616.tif 000022
【図２１】
2015090616.tif 000023
【図２２】
2015090616.tif 000024
【図２３】
2015090616.tif 000025
【図２４】
2015090616.tif 000026
【図２５】
2015090616.tif 000027
【図２６】
2015090616.tif 000028
【図２７】
2015090616.tif 000029
【図２８】
2015090616.tif 000030
【図２９】
2015090616.tif 000031
【図３０】
2015090616.tif 000032