(57)【要約】【課題】テスト対象のソフトウェアシステムについての知識を利用する。【解決手段】テストケース生成システムは、グループ分け・重み計算部とテストケース生成部を有する。グループ分け・重み計算部は、因子の集合と因子が取り得る値の集合、及び、知識を反映したブロックの集合とブロック間の結線からなる、対象システムのモデルを入力し、結線によるパスを同じくする因子を一つのグループとするようにグループ分けし、グループ分けしたグループ同士の重みを計算して因子グループ間重み表を求める。テストケース生成部は、因子のグループ定義と因子グループ間重み表から、テストケースに含まれる因子の集合に含まれる因子間の値の組合せに対して、因子グループ間重み表の重みの値に従って評価した値の総和を最大にするテストケースを生成する。【選択図】  図１
2014109966.tif 000002
【特許請求の範囲】
【請求項１】
対象システムへの動作条件項目や入力データ項目である因子の集合およびに前記因子が取り得る値の集合から、前記対象システムの動作をテストするためのテストケース集合を生成する、計算機上で動作するテストケース生成システムであって、
前記因子の集合と前記因子が取り得る前記値の集合、及び、ブロックの集合と、前記ブロックの集合に含まれる、ブロックから他のブロック又は前記因子から前記ブロックへの結線からなる、前記対象システムのモデルを入力し、前記結線により構成されるパスを同じくする前記因子を一つのグループとするようにグループ分けしてグループ定義とし、グループ分けしたグループ同士の重みを計算して、前記グループの前記因子から結線された前記ブロックの重みとした因子グループ間重み表を求めるグループ分け・重み計算部、並びに
前記因子の前記グループ定義と前記因子グループ間重み表から、テストケースに含まれる前記因子の集合に含まれる因子間の前記値の組合せに対して、前記因子グループ間重み表の重みの値に従って評価した値の総和を最大にする前記テストケースを生成するテストケース生成部を持つことを特徴とするテストケース生成システム。
【請求項２】
請求項１記載のテストケース生成システムにおいて、前記対象システムの前記モデルには変化のあったブロックの指定に応答して、前記グループ分け・重み計算部は、前記変化のあったブロックへ結線しているブロックと前記変化のあったブロックから結線しているブロックを識別し、前記モデルを構成する前記ブロックの集合に含まれ、識別されなかったブロックの前記重みを小さくして前記因子グループ間重み表を求めることを特徴とするテストケース生成システム。
【請求項３】
請求項１記載のテストケース生成システムにおいて、ユーザによる前記ブロックへの、「過去にバグの多かったところ」、「開発にかかわった人数」、「改造の回数」のパラメータの少なくとも一つの指定に応答して、前記グループ分け・重み計算部は、前記パラメータに基づいて、前記ブロックの前記重みを調整した前記因子グループ間重み表を求めることを特徴とするテストケース生成システム。
【請求項４】
対象システムへの動作条件項目や入力データ項目である因子の集合およびに前記因子が取り得る値の集合から、前記対象システムの動作をテストするためのテストケース集合を生成する、計算機上で動作するテストケース生成システムによるテストケース生成方法であって、
前記テストケース生成システムのグループ分け・重み計算部が、前記因子の集合と前記因子が取り得る前記値の集合、及び、ブロックの集合と、前記ブロックの集合に含まれる、ブロックから他のブロック又は前記因子から前記ブロックへの結線からなる、前記対象システムのモデルを入力し、前記結線により構成されるパスを同じくする前記因子を一つのグループとするようにグループ分けしてグループ定義とし、グループ分けしたグループ同士の重みを計算して、前記グループの前記因子から結線された前記ブロックの重みとした因子グループ間重み表を求め、
前記テストケース生成システムのテストケース生成部は、前記因子の前記グループ定義と前記因子グループ間重み表から、テストケースに含まれる前記因子の集合に含まれる因子間の前記値の組合せに対して、前記因子グループ間重み表の重みの値に従って評価した値の総和を最大にする前記テストケースを生成することを特徴とするテストケース生成方法。
【請求項５】
請求項４記載のテストケース生成方法において、前記対象システムの前記モデルには変化のあったブロックの指定に応答して、前記グループ分け・重み計算部は、前記変化のあったブロックへ結線しているブロックと前記変化のあったブロックから結線しているブロックを識別し、前記モデルを構成する前記ブロックの集合に含まれ、識別されなかったブロックの前記重みを小さくして前記因子グループ間重み表を求めることを特徴とするテストケース生成方法。
【請求項６】
請求項４記載のテストケース生成システムにおいて、ユーザによる前記ブロックへの、「過去にバグの多かったところ」、「開発にかかわった人数」、「改造の回数」のパラメータの少なくとも一つの指定に応答して、前記グループ分け・重み計算部は、前記パラメータに基づいて、前記ブロックの前記重みを調整した前記因子グループ間重み表を求めることを特徴とするテストケース生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの不具合を発見するためのテストケース集合を生成するシステムおよび方法に関する。
【背景技術】
【０００２】
近年、通信機器、医療機器、デジタル家電などいろいろな機器の機能をソフトウェアで実現するようになっている。ソフトウェア開発では人間による誤りが混入することがあるため、出荷するまでに、そのソフトウェアが正しく動作することを確認するテストが必要である。
【０００３】
テストでは許容される入力（テストケース）に対してそのソフトウェアが正しく動作することを確認する必要があり、このような入力の値の組合せは膨大になるため、できるだけ少ない工数でできるだけ多くの不具合の可能性を発見する方法が研究されてきた。
【０００４】
このような手法としては特許文献１で開示されるテストケース生成方法や、さらに限られた工数のなかでテスト内容の優先度を反映したテストケースを生成する非特許文献１で開示される方法がある。
【０００５】
これら２つの文献はどちらもペアワイズ網羅のテストケース生成の考え方によっているので、まず、この考え方を簡単に説明する。図１７は、テストされるソフトウェアシステムを表した図である。ソフトウェアシステムは一般に複数の因子、因子１〜因子nの入力をとり、何らかの処理を実行し、実行結果を出力する。本来、これらの因子が取り得る値の組合せのすべてをテストすることが必要であるが、経験則から、多くの不具合は少ない因子の組合せで発生することがわかっている。図１８は横軸に因子の組合せ数、縦軸に発見される不具合の累計の比率をとった、ペアワイズ網羅のテストケースの考え方を表すグラフである。図１８は特定のシステムについてのものではなく、一般的にこの性質を分かりやすく表現するためのイメージ図である。曲線の立ち上がりはソフトウェアシステムに依存する。この不具合に関する経験則を活用する方法としてペアワイズ網羅のテストケース生成の考え方が利用されている。図１９は因子１〜nを持つテストケースの集合を表している。この表で行は、各因子にそれが取り得る値のどれかを割り当てたものになっている。このテストケースの表で任意の因子iと因子jの２つの列を取り出したとき、これらの二つの因子の値のすべての組合せがテストケース表の中にあれば、このテストケースの表はペアワイズ網羅であるという。このようなペアワイズ網羅のテストケース表は、全部の因子の値の組合せに対してはるかに少ない行数で実現可能なので、効率的に不具合を発見するテストケースとして利用されている。また、因子の値の組合せを２つでなく、一般にｍ個にしたものはｍワイズ網羅のテストケース集合と呼ばれる。
【０００６】
次にこれらの知識のもとに、２つの先行技術文献のそれぞれを説明する。
【０００７】
特許文献１では、従来、網羅的なテストケース集合を減らす方法として直交表によるものがあったが、一般に直交表によるテストケース集合の生成は難しいため、これを解決するためにすべてのペアを含んだテストケース集合の容易な生成方法を述べている。この手法ではテストしたいソフトウェアシステムに対して
（１）システムに影響を与える因子の集合（一般には入力）
（２）各因子に対してその因子が取りえる値の集合
（３）因子間相互関係で調べたい度合い
・因子のペアは必ず網羅する
・３組の因子の組合せは網羅する
などが与えられ、テストケースの集合を上記の因子間の値の組合せを増やすように拡張していき、要求される値の組合せを含むできるだけ少数のテストケースからなるテストケース集合を作成する。
【０００８】
先にペアワイズ網羅のテストケースについて述べたように、一般に、このようにして作成したテストケース集合は少数のテストケースで多くの因子間の値の組合せを網羅するため、効率のよいテストが可能である。しかし、因子が多い場合や、各因子がとりえる値が多い場合は、この方法でもテストケース集合が大きすぎて、ソフトウェアシステムのテスト費用（工数）を圧迫することがある。
【０００９】
非特許文献１では、このようにテストの費用（工数）が限られている場合に、限られた工数でできるだけ重要なテストケースから実施するようにテストケースに優先度をつける。この文献では、利用者は、テストするソフトウェアシステムの因子間の組合せに優先度を表す数値（重み）をつける。テストケースはそのテストケースの重みの大きい順にテストを進めていけば、先頭の方で重要な因子間の組合せのテストが実施される。
【００１０】
これら二つの方法により、比較的少数のテストケースで因子間の値の組合せを網羅し、また、工数が限られているとき、重要な因子間の組合せのテストケースから順にテストすることができる。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】ＵＳ5,542,043号公報
【非特許文献】
【００１２】
【非特許文献１】Renee C. Bryce and Charles J. Colbourn：“Test Prioritization for Pairwise Interaction Coverage”, Proceeding A−MOST ’05 Proceedings of the 1st international workshop on Advances in model−based testing, 2005
【発明の概要】
【発明が解決しようとする課題】
【００１３】
通常、ソフトウェアシステムのテストの計画する人は、テスト対象のソフトウェアシステムについて知識がある場合がある。例えば、そのソフトウェアシステムがどんなサブシステムからなり、各因子はどのサブシステムに強く影響するかなどである。少数のテストケースで効果的なテストを行うために、この知識をテストケースの生成に反映する必要がある。
【課題を解決するための手段】
【００１４】
開示するテストケース生成システムは、計算機上で動作し、グループ分け・重み計算部とテストケース生成部を有し、対象システムへの動作条件項目や入力データ項目である因子の集合およびに因子が取り得る値の集合から、対象システムの動作をテストするためのテストケース集合を生成する。グループ分け・重み計算部は、因子の集合と因子が取り得る値の集合、及び、ブロックの集合と、ブロックの集合に含まれる、ブロックから他のブロック又は因子からブロックへの結線からなる、対象システムのモデルを入力し、結線により構成されるパスを同じくする因子を一つのグループとするようにグループ分けしてグループ定義とし、グループ分けしたグループ同士の重みを計算して、グループの因子から結線されたブロックの重みとした因子グループ間重み表を求める。テストケース生成部は、因子のグループ定義と因子グループ間重み表から、テストケースに含まれる因子の集合に含まれる因子間の値の組合せに対して、因子グループ間重み表の重みの値に従って評価した値の総和を最大にするテストケースを生成する。
【発明の効果】
【００１５】
開示するテストケース生成システムは、因子がシステムのどの部分に影響しているかというシステムモデルから、どのような因子のグループに分かれ、それらのグループ間にどのような重み付けで組み合わせを取らなければならないかという情報をテストケース集合生成に利用でき、少ないテストケース数で信頼性を向上できる。
【図面の簡単な説明】
【００１６】
【図１】テストケース生成システムの構成図である。
【図２】テストケース生成システムが動作する計算機システムの構成図である。
【図３】因子集合とそれらの取り得る値の集合である因子集合データを示す図である。
【図４】システムモデルの例である。
【図５】因子のグループ定義を示す図である。
【図６】因子グループ間重み表を示す図である。
【図７】最適テストケース集合を示す図である。
【図８】システムモデルの簡単な例と因子グループ間重み表を示す図である。
【図９】システムモデルの複雑な例を示す図である。
【図１０】システムモデルにおける変更の影響範囲を表す図である。
【図１１】因子のグループ分け・重み計算部の処理フロー図である。
【図１２】因子のグループ分けの処理フロー図である。
【図１３】グループ間の重み計算の処理フロー図である。
【図１４】グループ間の重み計算の他の処理フロー図である。
【図１５】テストケース生成部の処理フロー図である。
【図１６】システムモデルの各ブロックの重みを変更する処理フロー図である。
【図１７】テストされるソフトウェアシステムを表す図である。
【図１８】ペアワイズ網羅のテストケースの考え方を表すグラフである。
【図１９】ペアワイズ網羅のテストケースの集合を表す図である。
【図２０】テストケース生成部の処理の概略を説明する図である。
【発明を実施するための形態】
【００１７】
図を使って本発明の実施形態を詳細に説明する。ここでは４つの実施例を説明する。
【００１８】
実施例１と実施例２は、テストケース生成にテスト対象のシステム構成の知識を利用する。実施例１で基本的なテストケース生成システムの構成と働きを説明し、実施例２では因子のグループ分けと重み計算の方法の別の方法を説明する。
【００１９】
実施例３は、テスト対象のソフトウェアシステムが、既存のテスト対象の改造である場合である。
【００２０】
実施例４は、テスト対象のソフトウェアシステムに関するユーザの知識を利用する例である。
【実施例１】
【００２１】
図１に、本実施例のテストケース生成システムの構成を示す。テストケース生成システムは、入出力装置や記憶装置を備えた計算機上に構築され、動作する。本実施例は、因子集合とそれらが取り得る値集合である因子集合データ1001およびシステムモデル1002を利用者がテストケース生成システムに入力する。システムモデル1002は、テストするソフトウェアシステム（以下、対象システム）をモデル化したものであり、一つ以上のブロックとそのブロックの重み、ブロック間の関係を表すものであり、後述する。因子集合データ1001は、システムモデル1002への動作条件項目や入力データ項目の集合と各項目（因子）が取り得る値の集合である。
【００２２】
入力したシステムモデル1002を参照して、グループ分け・重み計算部1003が入力した因子集合をグループ分けして因子のグループ定義1004を求め、さらに定義した因子グループ間重み表1005を求める。これら２つのデータからテストケース生成部1006が、後述する処理により、グループ定義1004と因子グループ間重み表1005から評価値の和を最大にする最適テストケース集合1007を求める。
【００２３】
図２に、テストケース生成システム2001が動作する計算機システムの構成図を示す。テストケース生成システム2001は、CPU2002、記憶装置2003、ディスク装置などの補助記憶装置2004、キーボード、マウスなどの入力装置2004、およびディスプレイやプリンタなどの出力装置2005を有する。
【００２４】
CPU2002は、グループ分け・重み計算部1003およびテストケース生成部1006の処理を実行する。補助記憶装置2004は、因子集合データ1001、システムモデル1002、因子のグループ定義1004、因子グループ間重み表 1005、および最適テストケース集合1007を記憶し、これらはCPU2002による処理の実行に伴い、必要に応じて記憶装置2003との間でロード（読み出し）、ストア（格納）される。因子集合データ1001及びシステムモデル1002は、入力装置2004から入力され、補助記憶装置2004に格納される。最適テストケース集合1007は、格納されている補助記憶装置2004から読み出され、出力装置2005により出力される。
【００２５】
図３に、入力装置2005から入力され、補助記憶装置2004に格納された、因子集合とそれらが取り得る値集合である因子集合データ1001を示す。因子集合データ1001は、対象システムが入力する因子（動作条件項目や入力データ項目）の集合とそれぞれの因子が取り得る値の集合である。対象システムが関係する因子として典型的なものは、対象システムに入力するパラメータがある。また、例えば、その対象システムが動作する場所の気温をセンサで読み取って動作する対象システムなら、気温も動作条件項目としての因子である。因子集合データ1001は、図３に示すように、因子3001とその因子が取り得る値の集合（領域）3002を含む。因子3001には因子名が入力され、値の集合3002には、その因子が取り得る値が１つ以上入力される。
【００２６】
図４に、入力装置2005から入力され、補助記憶装置2004に格納されるシステムモデル1002の例を示す。システムモデル1002は図４に示すように１個以上のブロック4001を含む。ブロック4001は、たとえば、対象システムが一つのプログラムからなるような小規模システムの場合には、いわゆるプログラムモジュールが対応し、対象システムが多くのプログラムが連携して動作するような大規模システムの場合には、一つ一つのプログラムが対応する。
【００２７】
各ブロック4001には、他のブロックまたは因子FA1,…, FAn, FB1, …, FBm, FC1, …, FCk から結線されている。結線には、矢印で示す方向がある。また、各ブロックには、入力装置2005からのシステムモデル1002の入力としてブロック名BLOCK−A, BLOCK−B, … などと共に、重み w_a, w_b, … が入力される。図４では、重みをブロック内のカッコの中に表している。重みは、そのブロックへの結線間の組合せについて相対的な重要さを表す。
【００２８】
図５に、グループ分け・重み計算部1003が、システムモデル1002を参照して、因子集合データ1001をグループ分けした因子のグループ定義 1004を示す。グループ定義1004は、グループの名前5001とそれぞれのグループがどの因子の集合を含むかを表す因子5002からなる。図５では、グループAは因子FA1, …, Fanを含むことを表す。
【００２９】
図６に、グループ分け・重み計算部1003が、因子のグループ定義1004に基づいて求めた、因子グループ間重み表1005を示す。因子グループ間重み表1005は各因子グループ間の値の組合せの重み（どのような重みで必要とするか）を表している。因子グループがk個ある場合はk×kの行列で、因子グループの名前（6001、6002）が記述されている。この行列は、２つの因子グループの間の値の組合せの重みなので、三角行列になるため、対角線から下の0の要素には「−」を入れてある。
【００３０】
図７に、テストケース生成部1006が処理結果として生成する最適テストケース集合1007を示す。図７においてテストケース表7001がテストケース集合である。テストケース表7001の各行は、テストケース番号＃と各因子が取り得る値のいずれかを表している。最適テストケース集合1007には、テストケース生成部1006がテストケース表7001の各テストケースの評価値を計算するための評価表7002がある。評価値を計算するために、テストケース表7001の１行の中にある二つの因子の値の組合せを、因子名とその値の対で評価表7002に入れる。また、テストケース生成部1006は、二つの因子の値の組合せを評価表7002に入れるとき、すでに存在する値の組合せを二重に入れない。このようにしてすべて評価表7002に入れ終わったら、テストケース生成部1006は、因子の値の各組み合わせの評価値Eを計算する。
【００３１】
評価表7002の１行に示す組合せレコード rに対して、その二つの因子をFac1, Fac2 とし、それぞれの因子Fに対してそれが属するグループをGr(F)、二つのグループG1, G2 の間の重みをweight(G1, G2)とするとき、その組合せレコードrの評価値を、
E(r) ＝ weight(Gr(Fac1(r)), Gr(Fac2(r)))
とする。また、テストケース全体の評価値Eは、これをすべてのレコードについて加えたものであり、
E ＝ Σ E(r) 
ただし、r は評価表7002の１行に示す組合せレコードである。本実施例では、テストケース数が限定されたときに、テストケース生成部1006が、この評価値Eを最大にするようなテストケース集合を生成する。
【００３２】
ここでは、分かりやすいようにテストケース表7001の評価値を計算するための評価表7002を示したが、実際には補助記憶装置2004にデータとして格納せずに、テストケース生成部1006による処理結果としてのテストケース全体の評価値Eを利用することもできる。
【００３３】
図８は、システムモデル1002と因子グループ間重み表1005の例である。図８（a）に示すシステムモデル1002は、図４に示すシステムモデルの一部である。ここでは、この簡単なシステムモデル1002を使って、因子のグループ分け・重み計算部1003の処理を説明する。より複雑なシステムモデルに対する因子のグループ分け・重み計算部1003の処理は、ここで述べる処理の拡張である。
【００３４】
図８（a）に示すシステムモデル1002は、３つのブロックを含み、ブロック BLOCK_A に結線されている因子の集合 FA1, …, FAn とブロック BLOCK_B に結線されている因子の集合 FB1, …, FBm があり、さらにBLOCK_A と BLOCK_B の出力がBLOCK_Dの入力となっている（結線されている）。
【００３５】
この場合、同じ条件で処理される因子に分けると、BLOCK_A に結線されている因子の集合 FA1, …, FAnとBLOCK_B に結線されている因子の集合 FB1, …, FBmの２つのグループに分けられる。これら因子の集合の２つのグループを次式で表す。
G1： FA1, …, FAn
G2： FB1, …, FBm
それぞれのブロックに付けた重み w_a, w_b, w_d を、それぞれのブロックへの入力の間の関係をどれくらい重視するかという数値とする場合（ブロックへの入力に対する、そのブロックの処理の重要性（たとえば処理の複雑さ）を重要視する場合）、グループ分け・重み計算部1003は、図８（ｂ）に示すグループ間重み表を得る。また、ブロックに到達するまでに通ったブロックの重みも算入する場合（ブロックへの入力に対する、そのブロックの処理の重要性だけでなく、入力の重要性（たとえば、そのブロックが予定している値域を外れた入力に対する異常処理）も重要視する場合）、グループ分け・重み計算部1003は、図８（ｃ）に示すグループ間重み付け表を得る。図８（ｂ）、図８（ｃ）のグループ間重み付け表を得る各処理については後述する。
【００３６】
図８（a）に示す単純なシステムモデルの場合を、一般の複雑なシステムモデルの場合に拡張する。図９に、図８（a）より複雑なシステムモデルの例を示している。このシステムモデルは、図４のシステムモデルにブロック9001の BLOCK_F を追加したものである。図４のシステムモデルの場合、因子のグループ分け・重み計算部1003は、同じブロックに入力される因子の集合として、
G1： FA1, …, FAn
G2： FB1, …, FBm
G3： FC1, …, FCk
に因子の集合をグループ分けするが、図９のシステムモデルの場合、グループ分け・重み計算部1003は、グループG1のFA1, …, GAnを、さらにグループ分けし、
G1A：FA1
G1B：FA2, …, FAn
G2：FB1, …, FBm
G3：FC1, …, FCk
とする。
【００３７】
図１１に、因子のグループ分け・重み計算部1003の処理フロー（PAD図）を示す。この処理フローは、因子のグループ分け（S11001）を行い、次にグループ間の重み付け（S11002）を行う。次に図１２と図１３を用いて、これらの処理を詳しく述べる。
【００３８】
図１２に、因子のグループ分けの処理フロー（PAD図）を示す。この処理では各因子に対して、どのブロックにどの経路で到達しているかをすべて列挙し、その経路の集合が同じものを１つのグループとする。すべての因子Fについて、処理S12002を繰り返す（S12001）。システムモデルへの入力のFから有向な結線を辿った最長のパスの集合Paths(F)を求める（S12002）。Paths(F) は  F→ブロック→・・・→ブロックの形のパスの集合である。
【００３９】
次に、因子の集合を、Paths(F)が等しい因子の集合を一つの因子グループに分解する。因子グループをG1, ..., Gmとし、Gi に属する因子Fの集合をfactors(Gi)とする。また、F∈factors(Gi)に対してPaths(F)はすべて同じなので、それをPaths(Gi)と表す（S12003）。最後に、{G1, ..., Gm}が、グループ分け・重み計算部1003によるグループ分けの結果であり、それぞれのグループGiに属する因子をfactors(Gi)とする（S12004）。
【００４０】
図１３に、グループ分け・重み計算部1003によるグループ間の重み計算の処理フロー（PAD図）を示す。ここでのグループ分け・重み計算部1003によるグループ間の重み計算の処理は、それぞれのブロックに付けた重みを、それぞれのブロックへの入力の間の関係をどれくらい重視するかという数値とする場合の処理であり、図８（ｂ）に示したようなグループ間重み付け表を得る処理である。
【００４１】
まず、２つの因子グループの因子が入力されるブロックの重みweight(Gi, Gj)をその２つの因子グループ間の重みとする（S13001）。以下の一連の処理でweight(Gi, Gj)にこの２つのグループGiとGjの間の重みが計算され、設定されていくようにする。それには、すべての因子グループGi, Gj (i<j)のペアに対して、処理S13003以下の処理を繰り返す（S13002）。因子グループGi, Gj (i<j)間の重みweight(Gi, Gj)＝0 に初期化する（S13003）。そして、因子グループGi に対応するパスの集合Paths(Gi) と因子グループGj に対応するパスの集合Paths(Gj) に対して、S13005以下の処理を繰り返す（S13004）。Paths(Gi)とPaths(Gj)が入力されるブロックをCとする（S13005）。weight(Gi, Gj) に ブロックC の重みを加える（S13006）。このweight(Gi, Gj) を因子グループGi と因子グループGjの間の重みとする。
テストケース数が限定されたときに、テストケース生成部1006が、この評価値Eを最大にするようなテストケース集合を生成する  次に、テストケース数が限定されたときに、各テストケースの評価値の和を最大にするテストケース集合を生成するテストケース生成部1006の処理を説明する。ここでは、遺伝的アルゴリズムによって、テストケース数の上限Nが与えられたとき、評価値を最大にするようにテストケース集合を生成する。
【００４２】
図１５に、テストケース生成部1006の処理フロー（PAD図）を示す。テストケース生成部1006は、評価値の和を最大にするテストケース集合を生成する。図１５を用いた説明の前に、図２０を用いて、テストケース生成部1006の処理の概略を直感的に説明し、次に図１５を用いて処理のフロー（PAD図）を説明する。
【００４３】
テストケース生成部1006の処理は、遺伝的アルゴリズムを利用したものである。図２０に示すように、処理20001により、テストケース集合の集まり（個体群）20002をランダムに生成する。生成した個体群20002にＭ個の個体（テストケース集合）7001が含まれ、各個体（テストケース集合）7001にはＮ個のテストケースが含まれる。
【００４４】
次に、進化手続き20003で、個体群20002から２つの個体（テストケース集合）7001を取り出し、この2つの個体7001から新たな個体（テストケース集合）7001を２つ生成する。２つの個体（テストケース集合）Ａ、Ｂを基に２つの個体（テストケース集合）Ｃ、Ｄを生成する例を示す。
【００４５】
個体Ａの1〜k（k＜Ｎ）番目のテストケース（図２０のＡ1）と個体Ｂのk＋1〜Ｎ番目のテストケース（図２０のＢ2）とを組み合わせたテストケース集合を個体Ｃとし、個体Ｂの1〜k番目のテストケース（図２０のＢ1）と個体Ａのk＋1〜Ｎ番目のテストケース（図２０のＡ2）とを組み合わせたテストケース集合を個体Ｄとする。それら（上例の個体（テストケース集合）Ｃ、Ｄ）を突然変異（後述）させ、元の個体群20002に含む。
【００４６】
さらに、個体群20002に含まれるＭ＋2個の個体（テストケース集合）からテストケース集合の評価値の小さいものを２つ捨てるという処理を繰り返す。これにより、次第に評価値の大きなテストケース集合だけが個体群20002に残るようになり、所定の世代数（上述の処理の繰り返し回数）だけこの処理を繰り返すか、または、評価値が十分に高い個体（テストケース集合）ができるまで、この処理を繰り返す。このアルゴリズムは生物進化のアナロジーから個体群を次第に評価値の高い個体の集合に進化させていくことから遺伝的アルゴリズムと呼ばれる。
【００４７】
図２０の上述の説明を補足する。初期個体群を生成する手続き20001では、テストケース集合の中に入る最大テストケース数をNとし、個体群の中の個体数をMとするとき、例えば、それぞれの個体は各因子に対して、その因子が取り得る値をランダムに割り当ててN個の行からなるテストケース集合をM個作ればよい。
【００４８】
進化手続き20003は個体群20002からそれぞれのテストケース集合の評価値eの大きさに応じた確率で2個のテストケース集合を選び出すようにする。ここで常に評価値の大きいものだけ取り出すようにすると、進化しなくなることがあるので、確率的に取り出すようにする。次にこれらを手続き20004で交差（上述の入れ替え）させて２つの子供の個体を生成する。これには例えば、それぞれの親の個体でN個の行（テストケース）があるので、ランダムに1からN−1までの数kを生成し、1からkまでとk＋1からNまでの行に分け、これらを図２０のように交換して子供を作成する。最後に手続き20005で、これらの子供の個体をある低い確率で突然変異させる。突然変異は、それらの個体の行をランダムに選び、また、選んだ行の、ランダムに選んだ因子の値をその因子が取り得る値の集合からランダムに選び直す。
【００４９】
このようにして新たな個体を２つ生成したあと、これを元の個体群2002に返す。しかし、追加するたけでは個体数がどんどん多くなってしまうので、評価値eの低い個体を２つ選んで捨てて、個体数をMに保つ。個体を捨てるときは一般には評価値の低いものを捨てるが、一番小さなものだけを捨てていては進化が止まる場合があることが知られているため、下の方の2割程度に位置する個体を捨てる。
【００５０】
図２０を用いて直感的にわかるように説明した処理を、図１５のフロー（PAD図）を用いて、評価値の和を最大にするテストケース生成の処理フローとして詳細に説明する。N をテストケース数の上限、M を遺伝的アルゴリズムでの１世代の個体数とする（S15001）。また、遺伝的アルゴリズムの個体群が変数GROUPに格納されているとする。N 個のテストケースからなる個体が M個存在する初期個体群 GROUP を生成する（S15002）。GROUPに属するテストケースの集合PSET、それぞれについて重みを加味した評価値e(PSET)を計算して対応させる（S15003）。PSETが、図２０を用いて説明した遺伝的アルゴリズムの個体に対応する。次に、予め決められた世代数または評価値が十分に高いよいテストケース集合が見つかるまでの、所定の繰り返し回数、処理S15005以下の処理を繰り返す（S15004）。GROUP内のPSETについて、評価値 e(PSET) に従って、親となるテストケース集合を２つ選択し、それらを PSET1, PSET2 とする（S15005）。この選び方は、図２０を用いた遺伝的アルゴリズムの説明で述べたように、個体となるテストケース集合の評価値e(PSET)に応じた確率で選ぶ。次に、PSET1 と PSET2 を交差させて、子供のテストケース集合CSET1, CSET2とする（S15006）。ある確率で図２０ので説明したようにランダムに） CSET1 と CSET2 を突然変異させる（S15007）。GROUP にCSET1 と CSET2を含み、GROUP＝GROUP ∪ {CSET1, CSET2} とする（S15008）。GROUP から評価値e(PSET)の低い2つ個体を消去する（S15009）。所定の繰り返し数の処理の結果として残ったGROUP から最も評価値e(PSET)が良いテストケースを取り出す（S15010）。
【００５１】
これらによりシステムモデル1002を用いて、因子のグループ分けとグループ間に重みを付け、テストケースで実現されるペアの重みの和を最大にするテストケース集合を求めることができる。
【実施例２】
【００５２】
実施例２として、実施例１の変形例としてのグループ分け・重み計算部1003によるグループ間の重み計算の処理を説明する。ここでのグループ分け・重み計算部1003によるグループ間の重み計算の処理は、ブロックに到達するまでに通ったブロックの重みを算入する場合の処理であり、図８（ｃ）に示したようなグループ間重み付け表を得る処理である。
【００５３】
図１４に、グループ分け・重み計算部1003によるグループ間の重み計算の処理フロー（PAD図）を示す。重みweight(Gi, Gj)をその２つのグループ間の重みとする（S14001）。すべての因子グループGi, Gj (i<j)のペアに対して、処理14003以下の処理を繰り返す（S14002）。因子グループGi, Gj (i<j)間の重みweight(Gi, Gj)＝0に初期化（S14003）し、以下の一連の処理でGiとGjの間の重みを追加していく。因子グループGj に対応するパスの集合Paths(Gi) と因子グループGj に対応するパスの集合Paths(Gj) に対して、S14005以下の処理を繰り返す（S14004）。Paths(Gi)とPaths(Gj)が入力されるブロックをCとする（S14005）。ブロックCに至る Paths(Gi)が通過するブロックを（BL1, ..., BLs,C）、ブロックCに至る Paths(Gj)が通過するブロックを（CL1, ..., CLt,C）とする（S14006）。最後に、処理14007で、weight(Gi, Gj) にブロックCに至るまでに Paths(Gi)が通過する各ブロックの重みの積w(BL1)×...×w(BLs)とブロックCに至るまでに Paths(Gj)が通過する各ブロックの重みの積w(CL1)×...×w(CLt)とブロックCの重みとしてシステムモデルに入力された w(C)、すなわちw(BL1)×...×w(BLs)×w(CL1)×...×w(CLt)×w(C)を求め、weight(Gi, Gj)に加える（S14007）。このweight(Gi, Gj) を因子グループGi と因子グループGjの間の重みとする。
【実施例３】
【００５４】
実施例３は、従来のソフトウェアシステムを改造した新しいシステムを対象システムとする場合のテストケース集合の生成方法を述べる。すなわち、実施例３は、実施例１のシステムモデル1002を補助記憶装置2004に構築する場合の変形例である。従来のソフトウェアシステムを改造した、対象システムのシステムモデルにおいて変更（改造）したブロックにマークを付ける。たとえば、対象システムのシステムモデルのブロックの定義中にマークとしてフラグを立てる。
【００５５】
図１６に、システムモデルの一部を変更したときの各ブロックの重みを変更する処理フロー（PAD図）を示す。変更のマークのついたブロックから結線を逆に（有向矢印の逆方向に）辿り、通過または到達するブロックにマークをつける（S16001）。変更のマークのついたブロックから結線を（有向矢印の方向に）辿り、通過または到達するブロックにマークをつける（S16002）。マークのついていないブロックの重みを非常に小さい値に変更する（S16003）。
【００５６】
図１０を用いて、図１６の処理フローの説明を補足する。ここでは、ブロックBLOCK−Dが変更されたとする。ブロックBLOCK−Dから結線を逆に辿り、ブロックBLOCK−AおよびBLOCK−Bにマーク（三角）を付ける。次にブロックBLOCK−Dから有向矢印の方向に辿り、ブロックBLOCK−Eにマーク（円）をつける。変更されたすべてのブロックに関して、同様にマークを付ける。そして、マークが付けられていないブロックの重みを極端に小さくする。例えば、他のブロックの1/100とか、あるいは0にする。従来のソフトウェアシステムのシステムモデルを、改造（変更）に対応させて変更して対象システムのシステムモデルとして利用するので、システムモデルの変更入力時に、マークが付けられていないブロックの重みを変更する。このようにしてブロックの重みを変更した後で、実施例１で述べたようにテストケース集合を作成すれば、変更されたブロックにかかわるブロックに重みをつけた（変更されないブロックにかかわらないブロックの重みを小さくした）テストケース集合を生成できる。
【実施例４】
【００５７】
本実施例では、システムモデルにおいてブロックの重みを「過去にバグの多かったところ」、「開発にかかわった人数」、「改造の回数」のパラメータの一部あるいは全部を使って設定する。
【００５８】
まず、これらの値が入れられるようにシステムモデル1002を拡張する。それには図４において各ブロック4001に、「過去にバグの多かったところ」、「開発にかかわった人数」、「改造の回数」の値を記憶することができるように拡張すればよい。次にこれらの値をテストケース生成に反映させる。反映させる１つの方法としては、各ブロックの重み w_a, w_b, … をこれらのパラメータの値で増減させる。そのような式としては、BLをブロック、w(BL)をその重み、p(BL) を上記のパラメータの値で、標準を1.0 として正規化する。このとき、
w(BL) を p(BL)*w(BL)
に変えてやることで、これらの従来の不具合の頻出する度合いをテストケース集合の生成に反映させることができる。
【００５９】
以上説明した実施形態によれば、因子が対象システムのどの部分に影響しているかというシステムモデルから、どのような因子のグループに分かれ、それらのグループ間にどのような重み付けで組み合わせを取らなければならないかという情報をテストケース集合生成に利用でき、少ないテストケース数で信頼性を向上するという利点がある。
【００６０】
また、改造（変更）による開発の場合に、システムモデルのどこが変化したかという情報から、再テストすべき箇所を同定し、それをテストケース集合生成に利用することができ、少ないテストケース数で信頼性を向上するという利点がある。
【００６１】
また、システムモデルにおいて、不具合発生に関係の深い「過去にバグの多かったところ」、「開発にかかわった人数」、「改造の回数」のパラメータをテストケース集合生成に利用することができ、少ない個数のテストケース数で信頼性を向上するという利点がある。
【符号の説明】
【００６２】
1001：因子集合データ、1002：システムモデル、1003：グループ分け・重み計算部、1004：因子グループ定義、1005：因子グループ間重み表、1006：テストケース生成部、1007：最適テストケース集合。
【図１】
2014109966.tif 000003
【図２】
2014109966.tif 000004
【図３】
2014109966.tif 000005
【図４】
2014109966.tif 000006
【図５】
2014109966.tif 000007
【図６】
2014109966.tif 000008
【図７】
2014109966.tif 000009
【図８】
2014109966.tif 000010
【図９】
2014109966.tif 000011
【図１０】
2014109966.tif 000012
【図１１】
2014109966.tif 000013
【図１２】
2014109966.tif 000014
【図１３】
2014109966.tif 000015
【図１４】
2014109966.tif 000016
【図１５】
2014109966.tif 000017
【図１６】
2014109966.tif 000018
【図１７】
2014109966.tif 000019
【図１８】
2014109966.tif 000020
【図１９】
2014109966.tif 000021
【図２０】
2014109966.tif 000022