(57)【特許請求の範囲】
【請求項１】
複数の状態間の第１遷移を表す第１の状態遷移系の入力を受け付ける第１の入力受付手段と、
複数の状態を定義域とし、前記状態をある値域内の値へ写像する写像関数の入力を受け付ける第２の入力受付手段と、
前記第１の状態遷移系に含まれる前記複数の状態を、前記写像関数によりそれぞれ写像して複数の写像値を取得し、取得された複数の写像値に基づいて前記複数の状態をグループ化するグループ化手段と、
２つの前記グループにおいて一方のグループに含まれる状態から他方のグループに含まれる状態への前記第１遷移が少なくとも１つ存在するときは前記一方のグループから前記他方のグループへの第２遷移を設定することにより、複数の前記グループ間の第２遷移を表す第２の状態遷移系を生成する状態遷移系生成手段と、
前記第２の状態遷移系の前記第２遷移を網羅する遷移パスを生成する遷移パス生成手段と、
生成された遷移パスに含まれる第２遷移を遷移順に特定し、特定された第２遷移の各々について、前記特定された第２遷移に対応する第１遷移の中から、１つ前に特定された第２遷移について選択された第１遷移の遷移先に対し遷移元が一致する第１遷移を順次選択することにより、前記生成された遷移パスを前記第１の状態遷移系上の遷移パスに変換する遷移パス変換部と、
変換された遷移パスを、前記第１の状態遷移系をテストするためのテストケースとして出力する出力手段と、
を備えたテストケース生成装置。
【請求項２】
前記遷移パス変換部は、選択するべき第１遷移が存在しない第２遷移について、その遷移先のグループに含まれる状態のいずれかに対し、前記１つ前に特定された第２遷移について選択された前記第１遷移の遷移先からのパスを生成する
ことを特徴とする請求項１に記載のテストケース生成装置。
【請求項３】
前記遷移パス変換部は、前記パスとして、最短パスを生成することを特徴とする請求項２に記載のテストケース生成装置。
【請求項４】
複数の状態間の第１遷移を表す第１の状態遷移系の入力を受け付ける第１の入力受付ステップと、
複数の状態を定義域とし、前記状態をある値域内の値へ写像する写像関数の入力を受け付ける第２の入力受付ステップと、
前記第１の状態遷移系に含まれる前記複数の状態を、前記写像関数によりそれぞれ写像して複数の写像値を取得し、取得された複数の写像値に基づいて前記複数の状態をグループ化するグループ化ステップと、
２つの前記グループにおいて一方のグループに含まれる状態から他方のグループに含まれる状態への前記第１遷移が少なくとも１つ存在するときは前記一方のグループから前記他方のグループへの第２遷移を設定することにより、複数の前記グループ間の第２遷移を表す第２の状態遷移系を生成する状態遷移系生成ステップと、
前記第２の状態遷移系の前記第２遷移を網羅する遷移パスを生成する遷移パス生成ステップと、
生成された遷移パスに含まれる第２遷移を遷移順に特定し、特定された第２遷移の各々について、前記特定された第２遷移に対応する第１遷移の中から、１つ前に特定された第２遷移について選択された第１遷移の遷移先に対し遷移元が一致する第１遷移を順次選択することにより、前記生成された遷移パスを前記第１の状態遷移系上の遷移パスに変換する遷移パス変換ステップと、
変換された遷移パスを、前記第１の状態遷移系をテストするためのテストケースとして出力する出力ステップと、
を備えたテストケース生成方法。
【請求項５】
前記遷移パス変換ステップは、選択するべき第１遷移が存在しない第２遷移について、その遷移先のグループに含まれる状態のいずれかに対し、前記１つ前に特定された第２遷移について選択された前記第１遷移の遷移先からのパスを生成する
ことを特徴とする請求項４に記載のテストケース生成方法。
【請求項６】
前記遷移パス変換ステップは、前記パスとして、最短パスを生成することを特徴とする請求項５に記載のテストケース生成方法。
【請求項７】
請求項４ないし６のいずれか一項に記載の各ステップをコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、テストケース生成装置およびその生成方法、ならびにテストケース生成のためのプログラムに関し、たとえばプログラムの検証技術に関する。
【背景技術】
【０００２】
状態遷移図を用いたテストケースの設計方法は、系統的なテストケースを作り出す有効な方法として知られている。計算機システムの計算過程を状態遷移系に抽象化すると、網羅的なテストケースは状態または遷移を網羅するパスとなる。状態遷移系は有向グラフと見なせるため、テストケースの生成問題は有向グラフのノードまたはアークを網羅する最短パスの生成問題（巡回セールスマン問題、中国人郵便配達夫問題など）へ帰着することにより各種の近似解法が公知である。
【非特許文献１】Harold W. Thimbleby: "The directed Chinese Postman Problem", In Software - Practice and Experience (SPE), Volume 33, pp.1081-1096, 2003.
【非特許文献２】Harold Abelson and Gerald Jay Sussman with Julie Sussman: "Structure and Interpretation of Computer Programs", MIT Press, 1996.
【発明の開示】
【発明が解決しようとする課題】
【０００３】
現実の計算機システムは内部状態が複雑なため、状態遷移系の抽象度が低ければ状態数が極めて大きくなり、対応するテストケースも極めて大きくなる。一方、状態遷移系の抽象度が高ければ状態数が抑えられて、対応するテストケースも小さくなるが、テストの目的に応じて抽象化を適用した状態遷移系を作成する必要がある。
【０００４】
本発明は、所望の網羅性を保証する効率的なテストケースを自動生成するテストケース生成装置その生成方法ならびにテストケースを生成するためのプログラムを提供する。
【課題を解決するための手段】
【０００５】
本発明の一態様としてのテストケース生成装置は、
複数の状態間の第１遷移を表す第１の状態遷移系の入力を受け付ける第１の入力受付手段と、
複数の状態を定義域とし、前記状態をある値域内の値へ写像する写像関数の入力を受け付ける第２の入力受付手段と、
前記第１の状態遷移系に含まれる前記複数の状態を、前記写像関数によりそれぞれ写像して複数の写像値を取得し、取得された複数の写像値に基づいて前記複数の状態をグループ化するグループ化手段と、
２つの前記グループにおいて一方のグループに含まれる状態から他方のグループに含まれる状態への前記第１遷移が少なくとも１つ存在するときは前記一方のグループから前記他方のグループへの第２遷移を設定することにより、複数の前記グループ間の第２遷移を表す第２の状態遷移系を生成する状態遷移系生成手段と、
前記第２の状態遷移系の前記第２遷移を網羅する遷移パスを生成する遷移パス生成手段と、
生成された遷移パスに含まれる第２遷移を遷移順に特定し、特定された第２遷移の各々について、前記特定された第２遷移に対応する第１遷移の中から、１つ前に特定された第２遷移について選択された第１遷移の遷移先に対し遷移元が一致する第１遷移を順次選択することにより、前記生成された遷移パスを前記第１の状態遷移系上の遷移パスに変換する遷移パス変換部と、
変換された遷移パスを、前記第１の状態遷移系をテストするためのテストケースとして出力する出力手段と、
を備える。
【０００６】
本発明の一態様としてのテストケース生成方法は、
複数の状態間の第１遷移を表す第１の状態遷移系の入力を受け付ける第１の入力受付ステップと、
複数の状態を定義域とし、前記状態をある値域内の値へ写像する写像関数の入力を受け付ける第２の入力受付ステップと、
前記第１の状態遷移系に含まれる前記複数の状態を、前記写像関数によりそれぞれ写像して複数の写像値を取得し、取得された複数の写像値に基づいて前記複数の状態をグループ化するグループ化ステップと、
２つの前記グループにおいて一方のグループに含まれる状態から他方のグループに含まれる状態への前記第１遷移が少なくとも１つ存在するときは前記一方のグループから前記他方のグループへの第２遷移を設定することにより、複数の前記グループ間の第２遷移を表す第２の状態遷移系を生成する状態遷移系生成ステップと、
前記第２の状態遷移系の前記第２遷移を網羅する遷移パスを生成する遷移パス生成ステップと、
生成された遷移パスに含まれる第２遷移を遷移順に特定し、特定された第２遷移の各々について、前記特定された第２遷移に対応する第１遷移の中から、１つ前に特定された第２遷移について選択された第１遷移の遷移先に対し遷移元が一致する第１遷移を順次選択することにより、前記生成された遷移パスを前記第１の状態遷移系上の遷移パスに変換する遷移パス変換ステップと、
変換された遷移パスを、前記第１の状態遷移系をテストするためのテストケースとして出力する出力ステップと、
を備える。
【発明の効果】
【０００７】
本発明により、所望の網羅性を保証する効率的なテストケースを自動生成することができる。
【発明を実施するための最良の形態】
【０００８】
以下、図面を参照しながら、本発明の実施の形態について説明する。
【０００９】
図1は、本発明の実施の形態としてのテストケース生成装置の構成を示すブロック図である。
【００１０】
このテストケース生成装置は、テスト対象となるシステムが取りうる複数の状態間の遷移（第１遷移）を表す状態遷移系（第１の状態遷移系）２１と、複数の状態を定義域としてもち、当該状態をある値域内の値へ写像する状態抽象化写像（写像関数）２２とを入力とし、状態遷移系２１のテストケースとしての遷移パス２６を効率的に生成し、出力するものである。
【００１１】
ここでは、状態遷移系２１として、タスク制御モニタの状態遷移系を例題として解説するが、本実施形態は本例題以外に対しても有効である。ここでタスク制御モニタについて説明する。
【００１２】
＜タスク制御モニタ＞
複数のタスクが存在する情報システムで、タスクの実行状態を制御するモニタ機能を考える。図2に示すように、モニタ上の各タスクは、実行（RUN）状態と実行可能（RDY）状態とスリープ（WAI）状態の三つの状態を有する。
【００１３】
モニタは各タスクに、自発的なCPU譲り渡し（yield）操作と自発的なスリープ状態への遷移（sleep）操作とスリープ状態のタスクの実行可能状態への変更（wakeup）操作の三つのAPI（Application Programming Interface）関数を提供する。これらの関数は実行（RUN）状態のタスクにより呼び出される。
【００１４】
タスク数が三個の場合にタスク制御モニタがとり得る状態と状態間の遷移を表した状態遷移系を図3に示す。図3の状態遷移系は、図8に示す表1の状態と、図9に示す表2の遷移とで記述される有向グラフであり、初期状態は状態s0である。
【００１５】
より詳細に、表1は各状態の識別子（SID:State ID）と内容（ステート）を示しており、表2は各遷移の識別子（TID:Transition ID）と遷移元の状態識別子（SID0）と遷移先の状態識別子（SID1）と遷移の内容（イベント）を示している。ただし表1の写像結果は後述の状態同値関係定義部１１の処理で付加されるものであり、本装置への表1の入力時にはまだ存在しない。
【００１６】
＜テストケースの事例＞
この状態遷移系（図3、表1と表2）で記述されるタスク制御モニタの動作を確認するには、システムの初期状態から各タスクの遷移に対応するAPI関数を順番に呼び出して、遷移先の状態に対応したタスクの切り替えが起きることを確認すれば良い。たとえば、初期状態s0からタスク1が(sleep 1)を呼ぶとタスク2が実行中となり、次にタスク2が(sleep 2)を呼ぶとタスク2が実行中となり、次にタスク3が(yield 3)を呼ぶとタスク3が実行可能となり、という風な手順で動作を確認する。この確認手順は状態遷移系の上の状態s0から出発して状態s5へ至る遷移パスt0→t5→t18に対応する。
【００１７】
システムの動作確認を網羅的かつ最短の手順で実施するには、状態遷移系を有向グラフと見なすと、有向グラフの遷移を網羅する最短の遷移パスを計算して、最短の遷移列に対応する遷移に対応するイベントでシステムを動作させれば良い。
【００１８】
有向グラフの遷移を網羅する最短の遷移列の生成問題は中国人郵便配達夫問題（CPP: Chinese Postman Problem）としてグラフアルゴリズムの分野で公知であり、網羅を保証した遷移列を求める近似アルゴリズム（非特許文献１）が存在する。なお、この場合のアルゴリズムの近似性は、最小の遷移列に近い遷移列を生成するという意味である。
【００１９】
状態遷移系（図3：16状態、42遷移）の遷移を網羅する遷移列を近似アルゴリズム（非特許文献１）で求めた結果を図10の表3に記す。初期状態から始まるこれら4本の遷移列に沿ってシステムを駆動すれば、50回の連続的な遷移で42個の遷移を網羅できる。このような遷移列をシステムのテストケースと呼ぶ。なお、この遷移列は必ず初期状態s0から開始するものとする。遷移列が1本でない理由は、状態s12が遷移先の存在しない状態であり、状態s12に入るとその後の遷移が続かなくなるからである。
【００２０】
＜テストケースの削減＞
ここでシステムの全ての遷移を網羅するテストは、一般にシステムの規模が大きくなるとテストケースのサイズが指数関数的に増大するため現実的でない。実行可能なテストとするため、一定のテスト基準を与えてテストケースのサイズを減らす必要が生ずる。たとえば、例題のタスク制御モニタは16の状態を有するが、これらの状態はタスク識別子の番号の並び替えにより一致する状態を含む。たとえば状態s0と状態s2はタスク識別子の順番を並び替えると一致するが、状態s0と状態s1はタスク識別子の順番を変えても一致しない状態であるなどの区別が考えられる。一定のテスト基準の例として「タスク識別子の番号を並び変えて一致する状態を等価な状態と見なし、等価でない状態間の遷移のみを動作確認する」などが考えられる。
【００２１】
本実施形態では、このような一定のテスト基準を後述の状態抽象化写像２２の形に表現して入力することで、指定したテスト基準を満たす効率的なテストケース（遷移パス）２６を自動的に生成する。
【００２２】
＜状態遷移系と剰余状態遷移系＞
ここで状態遷移系と剰余状態遷移系について説明する。
【００２３】
状態遷移系（第１の状態遷移系）Fは、状態の有限集合S、遷移の有限集合T（⊆S×S）、初期状態s0の組み合わせにより定義する。剰余状態遷移系（第２の状態遷移系）F/〜は、状態遷移系FおよびFの状態に関する同値関係”〜”を与えると定義できる。剰余状態遷移系F/〜の状態は、状態遷移系Fの状態を同値関係”〜”により同値分割（グループ化）した際の同値クラス（グループ）とする。剰余状態遷移系F/〜の遷移は、Fの状態sと状態s'の間に遷移が存在する場合に各状態を含む同値クラスの間にも遷移([s],[s'])が存在するとして同値クラスの間の遷移関係を定める。
状態遷移系：F = ＜S, T, s0＞
状態集合：S
遷移集合：T ⊆ S×S
初期状態：s0 ∈ S
剰余状態遷移系：F/〜 = ＜S/〜,T/〜,[s0]＞
剰余状態：S/〜 = { [s] | s ∈ S }
剰余遷移：T/〜 = { ([s],[s’]) | (s,s’) ∈ T }
【００２４】
関係”〜”は上記の同値関係equivを意味し、同値クラス[s]は状態sを代表元とし同値関係の上で等価な状態を集めた集合とする。
同値クラス： [s] = { s’ ∈ S | equiv(s,s’) = true  }
【００２５】
なお、状態遷移系の各遷移t=(s,s’)∈Tにつき遷移tの前後の状態を参照する関数src(t)=sおよびdst(t)=s’と表記して以下で用いる。
遷移元の状態： dst: T → S
遷移先の状態： src: T → S
【００２６】
＜状態同値関係の定義＞
状態遷移系から剰余遷移系を計算するには状態間の同値関係を定義する必要がある。状態間の同値関係equiv(s,s’)は、同値関係の定義として反射律、対称律、推移律を満たす必要がある。なおＢは真または偽を表すブルーム値（真偽値）の集合を表す。s,s’が同値のとき、equiv(s,s)は真を返す。
同値関係 equiv: S×S → B
反射律：∀s∈S. equiv(s,s)
対称律：∀s∈S.∀s’∈S. equiv(s,s’) ⇒ equiv(s’,s)
推移律：∀s∈S.∀s’∈S. equiv(s,s’)∧equiv(s’,s’’) ⇒ equiv(s,s’’)
【００２７】
＜状態同値関係の構成＞
一般に二つの状態から真偽値を返す関数は必ずしも上記の同値関係の公理を満たさない。剰余遷移系の生成において利用者に同値関係を二状態の述語関数として書かせると同値関係とならない述語関数を記述する可能性があり望ましくない。
【００２８】
そこで、利用者は状態を抽象化する写像mapを記述し、これを状態抽象化写像２２として本装置に入力する。本装置での状態同値関係定義部１１は、状態抽象化写像２２と状態遷移系２１とから、剰余遷移系２４の生成に利用される状態同値関係２３（後述する図11の表4）を定義する。なお、関数equal?は写像mapの値域V上の等号関係とする。
状態写像 map: S → V
同値関係 equiv(s,s’) = equal?(map(s), map(s’))
【００２９】
図5は、状態間の同値関係を定義する手順を示すフローチャートである。この手順に従った処理は状態同値関係定義部１１により行われる。状態遷移系２１から２つの状態s1,s2を取り出し、これらを状態抽象化写像２２に与えてそれぞれ写像値を計算し（Ａ１１）、写像値が一致すれば（Ａ１２のＹＥＳ）s1,s2は同値であると判断し（Ａ１３）、一致しなければ（Ａ１２のＮＯ）s1,s2は同値でないと判断する（Ａ１４）。
【００３０】
例題：タスク制御モニタ
テスト基準から決まるタスク識別子の入れ替えで一致する状態を同一視する状態写像２２の事例を以下に示す。なお、この写像例は公知のプログラミング言語Scheme（非特許文献２）の書式で記述している。
写像例：
(define (len s) 
(map (lambda (v) (length (getval s v))) '(RUN RDY WAI)))
作用例：
s = ((RUN (1)) (RDY (2 3)) (WAI ())) のとき (len s) => (1 2 0)
s = ((RUN ()) (RDY ()) (WAI (1 2 3))) のとき (len s) => (0 0 3)
【００３１】
上記では、図8の表1の状態の内容（ステート）がプログラミング言語Scheme（非特許文献２）のリスト形式で変数sに格納されるとして、各タスクの状態を管理する変数（RUN、RDY、WAI）のリストの長さを返す関数を用いている。なお、関数getvalは変数の名前から対応する値を取得する関数とする。この関数を各状態へ適用した結果を図8の表1の一番右側の列（写像結果あるいは写像値）に示す。この写像による値が一致する状態を同値と見なして同値クラス（グループ）へ分割した結果を図11の表4に示す。同値クラスを代表する状態を状態識別子が最小の状態とすると、同値クラスの代表状態[SID]はs0、s1、s5、s12の4種類となる。
【００３２】
剰余状態遷移系の状態は、状態の同値クラス（以下、状態クラス）となり、剰余状態遷移系の遷移は状態クラス間の遷移となり、２つの状態クラスの含む状態間に遷移関係が存在するとき、当該状態クラス間に遷移関係が存在するとする。
【００３３】
この剰余状態遷移系の生成アルゴリズムを以下に記す。またこのアルゴリズムに対応する処理の流れを図6のフローチャートに示す。このアルゴリズムは、剰余状態遷移系生成部１２により実行される。剰余状態遷移系生成部１２は、状態同値関係23（図11の表4）と、状態遷移系２１とを入力とし、下記のアルゴリズムに従い、剰余状態遷移系２４を生成する。
【００３４】
＜剰余状態遷移系の生成アルゴリズム＞
入力：状態遷移系F、同値関係equiv
出力：剰余状態遷移系F/〜
変数：
SMAP: S → P(S)
TMAP: S×S → P(T)
REPL: S → S
ステップ１：状態の同値分割（図6のフローチャートの符号Ｂ１１）
事前：SMAPが空
事後：SMAPが状態の同値分割結果
SMAP ← φ
for each s ∈ S do
if ∃s' ∈ KEYS(SMAP). equiv(s,s') then
SMAP(s') ← SMAP(s')∪{s}
else
SMAP(s) ← {s}
end if
end do
ステップ２：代表状態の決定（図6のフローチャートの符号Ｂ１２）
事前：SMAPが状態の同値分割
事後：REPLが代表状態の検索表
REPL ← φ
for each s ∈KEYS(SMAP) do
for each s' ∈ SMAP(s) do
REPL(s') ← s
end do
end do
ステップ３：遷移の同値分割（図6のフローチャートの符号Ｂ１３）
事前：TMAPが空、REPLが代表状態の対応表
事後：TMAPが遷移の同値分割結果
for each t ∈ T do
key ← (REPL(src(t)),REPL(dst(t)))
if ∃t' ∈ KEYS(TMAP). key=t' do
TMAP(t') ← TMAP(t')∪{t}
else
TMAP(key) ← {t}
end if
end do
ステップ４：結果出力（図6のフローチャートの符号Ｂ１４）
状態分割SMAPからS/〜、遷移分割TMAPからT/〜を決め、
剰余遷移系F/〜=＜S/〜, T/〜, [s0]＞を出力して停止
【００３５】
例題：タスク制御モニタ
状態同値関係定義部１１において状態の同値クラスへの分割が済めば各状態SIDに対して代表状態[SID]が定まる（図11の表4の一番左の列）。剰余遷移系の状態となる状態クラスは代表状態の識別子でラベルする。
【００３６】
また剰余遷移系の遷移は、遷移表（図12の表5）に示すように各遷移の遷移元と遷移先の状態（SID0とSID1）の所属する状態クラスの代表状態（[SID0]と[SID1]）を求めて、代表状態の組が同じ遷移を同値クラスに分割する（図13の表6）。遷移のクラスの中で識別子TIDが最小の遷移を代表遷移[TID]として遷移クラスの識別に用いる。この例は遷移クラスがt0、t1、t4、t5、t6、t15、t17、t18の8個となる。
【００３７】
図4は、最終的に得られた状態遷移系（4状態、8遷移）を示す。これは図13の表6に相当するものである。この状態遷移系の状態および遷移は、元の状態遷移系の状態および遷移を含む。図4の状態のステートや遷移のイベントとしては、代表状態のステートや代表遷移のイベントを記している。
【００３８】
図6のステップ1（Ｂ１１）終了時点のSMAPは以下の通りとなる。
SMAP(s0) = {s0,s2,s4,s10,s14,s15}
SMAP(s1) = {s1,s3,s6,s7,s9,s13}
SMAP(s5) = {s5,s8,s11}
SMAP(s12) = {s12}
【００３９】
図6のステップ2（Ｂ１２）終了時点のREPLは以下の通りとなる。
REPL(s0) = s0
REPL(s1) = s1
REPL(s2) = s0
... 中略
REPL(s14) = s0
REPL(s15) = s0
【００４０】
図6のステップ3（Ｂ１３）終了時点のTMAPは以下の通りとなる。
TMAP((s0,s0)) = {t1,t3,t8,t34,t39,t41}
TMAP((s0,s1)) = {t0,t2,t7,t33,t38,t40}
... 中略
TMAP((s5,s5)) = {t18,t28,t32}
【００４１】
なお、アルゴリズムの記述において記号φは空集合の意味とし、記号←は右辺の左辺への代入を意味する。KEYSは写像の値域を取得する手順とし、上記のSMAPの例でKEYSの働きを例示するとKEYS(SMAP)={s0,s1,s5,s12}となる。
【００４２】
＜遷移パスの変換方法＞
遷移パス生成部１３は、剰余状態遷移系２４（図4）の遷移を網羅するパス２５（代表状態または代表遷移イベントで表現された代表遷移パス２５）を求める。これにはたとえば公知のアルゴリズム（非特許文献１）を用いることができる。ここでテストとして実行可能な遷移パスは初期状態s0から始まる連続な遷移パスである。連続な遷移パスとは遷移系列の中で、現在の遷移の遷移先の状態と、次の遷移の遷移元の状態とが一致することを意味する。剰余状態遷移系の上で連続な代表遷移パス２５をそのまま状態遷移系の上の遷移パスと見なすと、連続な遷移パスになるとは限らない。したがって、剰余状態遷移系２４を網羅する最短の代表遷移パス２５を生成した後、これが元の状態遷移系上で連続したパスにならないときは、この代表遷移パス２５を手がかりに連続な遷移パスに変換する必要がある。このパス変換の手順を以下に示す。またこの変換手順に対応する処理の流れを図7のフローチャートに示す。この処理は遷移パス変換部１４により行われる。なおこの処理は、元の状態遷移系上で代表遷移パス２５が連続したパスにならないと遷移パス変換部１４が判断したときのみ行うようにしてもよいし、代表遷移パス２５が元の状態遷移系上で連続したパスになるか否かの判断を行うことなく、常に行うようにすることも可能である。
遷移選択 SELECT: T/〜 × S → P(T)
機能： 遷移クラス[t]の中で状態sを始点とする遷移を選択する。
詳細： SELECT([t],s) = { t’ ∈ [t] | src(t’) = s }
状態選択 SOURCE: T/〜 → P(S)
機能： 遷移クラス[t]に含まれる遷移の始点を列挙する。
詳細： SOURCE([t]) = { src(t’) ∈ S | t’ ∈ [t] }
パス生成 SHORTP: S × P(S) → [T]
機能： 状態sから状態集合dstsへ至るパスの中で最短のパスを選択する
詳細： SHORTP(s,dsts) = DIJKSTRA(s,s’)
ただしDIJKSTRAは公知の最短パス計算手順（例：ダイクストラ法）とし
状態s’∈dstsはパス長|DIJKSTRA(s,s’')|が状態s''∈dstsの中で最小とする
【００４３】
＜遷移パスの変換アルゴリズム＞
入力：開始状態s0、代表遷移列tin=([t0],[t1],...)
出力：遷移列tout=(t0’,t1’,...)
手順：
ステップ1：初期化（図7のフローチャートのＣ１１）
s ← 開始状態s0
todo ← 代表遷移列tin
tout ← 空列
ステップ2：遷移選択（図7のフローチャートのＣ１２、Ｃ１３）
next ← SELECT(todoの先頭, s)
if 集合nextが空 then
ステップ3：選択による連結不可（図7のフローチャートのＣ１５）
dsts ← SOURCE(todoの先頭)
path ← SHORTP(s,dsts)
s ← パスpathの最後の状態
tout ← tout + path
else
ステップ4：選択による連結可能（図7のフローチャートのＣ１４）
t ← 遷移集合nextから一つ遷移を選択
s ← dst(t)
todo ← todoの末尾
tout ← tout + t
end if
ステップ5：終了判定（図7のフローチャートのＣ１６）
if リストtodoが空 then
（ステップ6）へ
else
（ステップ2）へ
end if
ステップ6：結果出力
遷移パスtoutを出力して停止
【００４４】
例題：タスク制御モニタ
剰余状態遷移系２４（図4）の遷移を網羅するパスを公知のアルゴリズム（非特許文献１）を用いて遷移パス生成部１３により求めると図14の表7に示す遷移系列（代表遷移パス２５）が得られる。この遷移系列は剰余状態遷移系２４（図4）の上では連結したパスとなるが、元の状態遷移系（図3）の上では連結したパスとなるとは限らない。その場合、そのままでは実行可能なテストケースとならない。
【００４５】
たとえば図14の表7の二本目のパスの代表遷移に沿う遷移系列はt0→t6→t5→t15→t4→t1となるが、遷移先と遷移元の状態が連続的に繋がらない。たとえば状態s1と状態s6は状態クラスが一致するため、剰余状態遷移系（図4）上では同じ状態だが、元の状態遷移系（図3）上で異なる状態である。
【００４６】
遷移パス変換部１４は、代表遷移パス２５が元の状態遷移系（図3）の上では連結したパスにならないときは、代表遷移パス２５を元に、遷移パス変換を行うことにより実行可能な遷移パス２６を得る。具体的には、遷移パス変換部１４は、代表遷移パス２５における遷移クラスの中から上手く遷移を選んで、元の状態遷移系上で状態の遷移が連続的となるようにパスを生成する。遷移の選択だけで状態の遷移を連続的となるパスを生成できない場合は、最短パスの計算アルゴリズムを利用してパスの状態を連続化する（ステップ3（図7のＣ１５））。すなわち、連続的となるパスの生成ができない対象遷移クラスについては、１つ前の遷移クラスについて選択された遷移の遷移先状態から、対象遷移クラスの遷移先の状態クラスに含まれるいずれかの状態へのパスを生成し、生成したパスを採用する。
【００４７】
ここで剰余状態遷移系のパスを入力として元の状態遷移系上で状態が連続に遷移するパスを計算する操作をパス変換（あるいはパス復元）と命名する。パス変換（パス復元）のアルゴリズムは上に図7を用いて記述した通りである。
【００４８】
図14の表7の遷移パスと、初期状態s0とを入力として、パス変換（パス復元）アルゴリズムを適用した結果を図15の表8に記す。表8の遷移パスは初期状態を状態s0とし、図14の表7の遷移クラスから一度ずつ遷移を選んだ遷移パスであり、元の状態遷移系の上で状態が連続的に遷移する実行可能なパスとなる。図15の表8の遷移パスは、最初に設定したテスト基準「タスク識別子を区別しない範囲で全ての状態と状態間の遷移を網羅する」を満たす最小のテストケースとなる。
【００４９】
以上に説明した本実施の形態によれば以下の効果を得ることができる。
【００５０】
テストの目的に応じた抽象度の状態遷移系を作成する必要がなく、また、状態間の同値関係の代わりに状態の抽象化写像を用いることで、同値関係の記述時の誤り（反射律、対称律、推移律を満たさない関係の入力）を防止できる。
【００５１】
また抽象化写像で同値クラスに分割した状態空間を網羅する最短パスを生成するため、所望の網羅率を有する効率的なテストケースを生成できる。
【００５２】
また剰余状態遷移系の遷移パスを元の状態遷移系の遷移パスに自動変換することができる。
【００５３】
なお、以上に説明した本実施形態におけるテストケース生成装置は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、テストケース生成装置における状態同値関係定義部、剰余状態遷移系生成部、遷移パス生成部、遷移パス変換部は、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、テストケース生成装置は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、ＣＤ−ＲＯＭなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。
【図面の簡単な説明】
【００５４】
【図１】本発明の一実施形態としてのテストケース生成装置の構成を示すブロック図。
【図２】タスク制御モニタを説明する図。
【図３】状態遷移系（第１の状態遷移系）を示す図。
【図４】剰余状態遷移系（第２の状態遷移系）を示す図。
【図５】状態同値関係定義手順を説明するフローチャート。
【図６】剰余状態遷移系生成手順を説明するフローチャート。
【図７】遷移パス変換手順を説明するフローチャート。
【図８】図3の状態遷移系に対応する状態表を表1として示す図。
【図９】図3の状態遷移系に対応する遷移表を表2として示す図。
【図１０】図3の状態遷移系における遷移パスを表3として示す図。
【図１１】図3の表1を同値分割した結果を表4（剰余状態遷移系に対応する状態表）として示す図。
【図１２】剰余状態遷移系に対応する遷移表を表5として示す図。
【図１３】図12の遷移表を同値分割した結果を表６として示す図。
【図１４】剰余状態遷移系の代表遷移パスを表７として示す図。
【図１５】代表遷移パスを元に復元した、図3の状態遷移上の遷移パスを表８として示す図。
【符号の説明】
【００５５】
１１：状態同値関係定義部
１２：剰余状態遷移系生成部
１３：遷移パス生成部
１４：遷移パス変換部
２１：状態遷移系
２２：状態抽象化写像
２３：状態同値関係
２４：剰余状態遷移系
２５：代表遷移パス
２６：遷移パス
【図１】
0005107131.tif 000002
【図２】
0005107131.tif 000003
【図３】
0005107131.tif 000004
【図４】
0005107131.tif 000005
【図５】
0005107131.tif 000006
【図６】
0005107131.tif 000007
【図７】
0005107131.tif 000008
【図８】
0005107131.tif 000009
【図９】
0005107131.tif 000010
【図１０】
0005107131.tif 000011
【図１１】
0005107131.tif 000012
【図１２】
0005107131.tif 000013
【図１３】
0005107131.tif 000014
【図１４】
0005107131.tif 000015
【図１５】
0005107131.tif 000016