(57)【要約】      （修正有）【課題】継続的インテグレーションにおけるテストの実行開始を早めるテスト実行制御装置を提供する。【解決手段】テスト実行制御装置３において、判定部３２は、テスト実行対象のソースコード内のインタフェースの更新を検知する。更新部３３は、ソースコードに含まれるモジュールのインタフェースに関するモジュール情報を更新する。選択部３４は、過去にテストケースを実行した際のテスト実行時間に基づいて、複数のテストケースから実行対象のテストケースを選択する。生成部３５は、選択したテストケースを過去に実施した際に呼び出された第１モジュールにおける静的リンク対象である第２モジュールから、更新後のモジュール情報に関連しないソースコードを簡略化したダミーモジュールを生成する。コンパイル部３６は、第１モジュールおよびダミーモジュールをコンパイルする。実行制御部３７は、選択されたテストケースの実行を指示する処理を実行させる。【選択図】図５
2019028913.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
テスト実行対象のソースコード内のインタフェースの更新を検知した場合、前記ソースコードに含まれるモジュールのインタフェースに関する情報を含むモジュール情報を更新し、
複数のテストケースに関する情報を含むテストケース情報を参照し、過去に前記テストケースを実行した際のテスト実行時間に基づいて、前記複数のテストケースから実行対象のテストケースを選択し、
選択した前記テストケースを過去に実施した際に呼び出された第１モジュールにおける静的リンク対象である第２モジュール内のソースコードのうち、更新後の前記モジュール情報に示される前記インタフェースの実装に関連しないコードを簡略化したダミーモジュールを生成し、
前記第１モジュールおよび前記ダミーモジュールのコンパイルを実行し、
選択された前記テストケースの実行を指示する
処理を実行させるテスト実行制御プログラム。
【請求項２】
前記コンピュータに、
テスト実行中に前記ダミーモジュールが呼ばれた場合、保留を示す情報を前記テストケースの実行状態として前記テストケース情報に記録し、
前記テストケース情報に前記テストケースの実行状態として保留を示す情報が記録されている場合、前記ダミーモジュールの生成元の前記第２モジュールをコンパイルし、
再度、選択した前記テストケースの実行を指示する
処理を実行させることを特徴とする請求項１記載のテスト実行制御プログラム。
【請求項３】
前記コンピュータに、
テスト実行対象のソースコードの更新を検知した場合、前記ソースコード内のインタフェースの更新の有無を判定する
処理を実行させることを特徴とする請求項１または２記載のテスト実行制御プログラム。
【請求項４】
前記コンピュータに、
複数のテストケースに関する情報を含むテストケース情報を参照し、前記複数のテストケースのうち、過去に前記テストケースを実行した際のテスト実行時間が長い前記テストケースから順に、実行対象のテストケースを選択する
処理を実行させることを特徴とする請求項１乃至３のうち何れか１項に記載のテスト実行制御プログラム。
【請求項５】
前記コンピュータに、
テスト実行対象のソースコードの更新を検知した場合、いずれかの前記テストケースの前記第１モジュールにおける静的リンク対象である前記第２モジュールの追加の有無を判定し、
前記ソースコードの更新において前記第２モジュールが追加されており、前記いずれかのテストケースが選択された場合、前記第２モジュールのコンパイルを実行する
処理を実行させることを特徴とする請求項１乃至４のうち何れか１項に記載のテスト実行制御プログラム。
【請求項６】
前記コンピュータに、
前記テストケースに対応する前記ダミーモジュールを生成した場合、前記モジュール情報において、前記ダミーモジュールが生成済みであることを示す第１情報を設定し、
前記テストケースに対応する前記第１モジュールをコンパイルした場合、前記モジュール情報において、前記第１モジュールをコンパイル済であることを示す第２情報を設定し、
他のテストケースを選択した場合、前記モジュール情報を参照し、前記他のテストケースに対応する第２モジュールについて、前記第１情報または前記第２情報が設定されている場合、前記他のテストケースに対応する第２モジュールに基づくダミーモジュールを生成しないことを決定する
処理を実行させることを特徴とする請求項１乃至５のうち何れか１項に記載のテスト実行制御プログラム。
【請求項７】
前記コンピュータに、
前記テストケースに対応する前記第１モジュールをコンパイルした場合、前記モジュール情報において、前記第１モジュールをコンパイル済であることを示す第２情報を設定し、
他のテストケースを選択した場合、前記モジュール情報を参照し、前記他のテストケースを過去に実施した際に呼び出された第１モジュールに前記第２情報が設定されている場合、前記第１モジュールのコンパイルを実行しないことを決定する
処理を実行させることを特徴とする請求項１乃至６のうち何れか１項に記載のテスト実行制御プログラム。
【請求項８】
コンピュータが、
テスト実行対象のソースコード内のインタフェースの更新を検知した場合、前記ソースコードに含まれるモジュールのインタフェースに関する情報を含むモジュール情報を更新し、
複数のテストケースに関する情報を含むテストケース情報を参照し、過去に前記テストケースを実行した際のテスト実行時間に基づいて、前記複数のテストケースから実行対象のテストケースを選択し、
選択した前記テストケースを過去に実施した際に呼び出された第１モジュールにおける静的リンク対象である第２モジュール内のソースコードのうち、更新後の前記モジュール情報に示される前記インタフェースの実装に関連しないコードを簡略化したダミーモジュールを生成し、
前記第１モジュールおよび前記ダミーモジュールのコンパイルを実行し、
選択された前記テストケースの実行を指示する
処理を実行することを特徴とするテスト実行制御方法。
【請求項９】
テスト実行対象のソースコード内のインタフェースの更新を検知した場合、前記ソースコードに含まれるモジュールのインタフェースに関する情報を含むモジュール情報を更新する更新部と、
複数のテストケースに関する情報を含むテストケース情報を参照し、過去に前記テストケースを実行した際のテスト実行時間に基づいて、前記複数のテストケースから実行対象のテストケースを選択する選択部と、
選択した前記テストケースを過去に実施した際に呼び出された第１モジュールにおける静的リンク対象である第２モジュール内のソースコードのうち、更新後の前記モジュール情報に示される前記インタフェースの実装に関連しないコードを簡略化したダミーモジュールを生成する生成部と、
前記第１モジュールおよび前記ダミーモジュールのコンパイルを実行するコンパイル部と、
選択された前記テストケースの実行を指示する実行制御部と、
を備えることを特徴とするテスト実行制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、テスト実行制御プログラム、テスト実行制御方法、およびテスト実行制御装置に関する。
【背景技術】
【０００２】
ソフトウェアのコンパイル、パッケージング、テスト実行などを自動化する継続的インテグレーションという開発手法が用いられている。継続的インテグレーションを用いることにより、ソースコードを修正した際の正当性確認や、本番環境への配備を自動で行うことが可能となるため、人為的ミスを削減することができる。
【０００３】
関連する技術として、過去に行われたテストのテストケースについての情報と対象プログラムを解析して得られた依存関係を組み合わせることによりテストを行う技術が提案されている（例えば、特許文献１を参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００８−２０４４０５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
テスト実行対象のソースコードの不具合を検知するため、継続的インテグレーションを早く終わらせることが好ましい。しかし、継続インテグレーションでは、複数のタスクが連続して実行されるため、タスクの数に応じて完了までの時間が長期化する。
【０００６】
例えば、テスト実行対象のソースコードが複数のモジュールを含む場合、テストの実行開始の前に、テストの実行に用いられる全てのモジュールをコンパイルすることが考えられる。この場合、モジュールの数が多くなるに応じて、コンパイルの実行時間が長期化する結果、テストが開始されるまでの時間が長くなる。
【０００７】
１つの側面として、本発明は、継続的インテグレーションにおけるテストの実行開始を早めることを目的とする。
【課題を解決するための手段】
【０００８】
１つの態様では、テスト実行制御プログラムは、コンピュータに、テスト実行対象のソースコード内のインタフェースの更新を検知した場合、前記ソースコードに含まれるモジュールのインタフェースに関する情報を含むモジュール情報を更新し、複数のテストケースに関する情報を含むテストケース情報を参照し、過去に前記テストケースを実行した際のテスト実行時間に基づいて、前記複数のテストケースから実行対象のテストケースを選択し、選択した前記テストケースを過去に実施した際に呼び出された第１モジュールにおける静的リンク対象である第２モジュール内のソースコードのうち、更新後の前記モジュール情報に示される前記インタフェースの実装に関連しないコードを簡略化したダミーモジュールを生成し、前記第１モジュールおよび前記ダミーモジュールのコンパイルを実行し、選択された前記テストケースの実行を指示する処理を実行させる。
【発明の効果】
【０００９】
１つの側面によれば、継続的インテグレーションにおけるテストの実行開始を早めることができる。
【図面の簡単な説明】
【００１０】
【図１】実施形態のシステムの全体構成の一例を示す図である。
【図２】テストケース情報の一例を示す図である。
【図３】ダイナミックコールツリーの一例を示す図である。
【図４】モジュール情報の一例を示す図である。
【図５】テスト実行制御装置の一例を示す図である。
【図６】依存モジュールの一例を示す図である。
【図７】インタフェースのソースコードの一例を示す図である。
【図８】静的リンクモジュールのソースコードの一例を示す図である。
【図９】ダミーモジュールのソースコードの一例を示す図である。
【図１０】第１の実施形態の処理の流れの一例を示すフローチャート（その１）である。
【図１１】第１の実施形態の処理の流れの一例を示すフローチャート（その２）である。
【図１２】第１の実施形態の処理の流れの一例を示すフローチャート（その３）である。
【図１３】第２の実施形態の処理の流れの一例を示すフローチャート（その１）である。
【図１４】第２の実施形態の処理の流れの一例を示すフローチャート（その２）である。
【図１５】第２の実施形態の処理の流れの一例を示すフローチャート（その３）である。
【図１６】比較例における継続的インテグレーション実施結果の一例を示す図である。
【図１７】実施形態における継続的インテグレーション実施結果（ダミーモジュール呼び出しなし）の一例を示す図である。
【図１８】実施形態における継続的インテグレーション実施結果（ダミーモジュール呼び出しあり）の一例を示す図である。
【図１９】図１６〜図１８の実施結果の比較の一例を示す図である。
【図２０】テスト実行制御装置のハードウェア構成の一例を示す図である。
【図２１】テスト実行装置のハードウェア構成の一例を示す図である。
【発明を実施するための形態】
【００１１】
＜実施形態のシステムの全体構成の一例＞
以下、図面を参照して、実施形態について説明する。図１は、実施形態のシステムの全体構成の一例を示す。実施形態のシステムは、第１データベースサーバ１と第２データベースサーバ２とテスト実行制御装置３とテスト実行装置４とを含む。
【００１２】
第１データベースサーバ１は、ソースコード記憶部１１を含む。ソースコード記憶部１１は、テスト実行対象のソースコードを記憶する。
【００１３】
第２データベースサーバ２は、テストケース情報記憶部２１とモジュール情報記憶部２２とを含む。テストケース情報記憶部２１は、ソースコード記憶部１１に記憶されたソースコードに対応するテストケース情報を記憶する。モジュール情報記憶部２２は、ソースコード記憶部１１に記憶されたソースコードに関するモジュール情報を記憶する。テストケース情報およびモジュール情報についての詳細は後述する。
【００１４】
テスト実行制御装置３は、ソースコード記憶部１１からソースコードを取得する。テスト実行制御装置３は、テストケース情報記憶部２１に記憶されたテストケース情報、およびモジュール情報記憶部２２に記憶されたモジュール情報の参照および更新処理を行う。テスト実行制御装置３は、取得したソースコードをコンパイルして実行形式ファイルを生成し、テスト実行装置４に実行形式ファイルを送信する。
【００１５】
テスト実行制御装置３は、コンピュータの一例である。テスト実行制御装置３の処理の詳細は後述する。
【００１６】
テスト実行装置４は、実行形式ファイル記憶部４１とテスト実行部４２とを含む。実行形式ファイル記憶部４１は、テスト実行制御装置３から受信した実行形式ファイルを記憶する。テスト実行部４２は、テスト実行制御装置３からの指示に基づいて、実行形式ファイルを用いてテストを実行する。
【００１７】
なお、テスト実行制御装置３は、実行形式ファイル記憶部４１とテスト実行部４２とを含んでいてもよい。テスト実行制御装置３は、実行形式ファイル記憶部４１とテスト実行部４２とを含むことにより、テスト実行装置４と通信を行なわないため、処理を高速化し、コストを削減することができる。
【００１８】
ソースコード記憶部１１、テストケース情報記憶部２１、およびモジュール情報記憶部２２は、同一のデータベースサーバに記憶されていてもよい。また、テスト実行制御装置３は、ソースコード記憶部１１とテストケース情報記憶部２１とモジュール情報記憶部２２とのうちの少なくとも一つを含んでいてもよい。
【００１９】
図２は、テストケース情報の一例を示す図である。テストケース情報には、過去に実行されたテストケースに関する情報が記録されている。図２に示すように、テストケース情報には、テストケースIdentification（ＩＤ）と依存モジュール名と静的リンクモジュール名と実行時間と実行状態と最新実行日時とが対応づけられている。本実施形態の継続的インテグレーション処理の開始前に、継続インテグレーション処理にて実行される全てのテストケースのテストケースＩＤは記録されているものとする。
【００２０】
テストケースＩＤは、テストケースを識別する識別情報である。
依存モジュールは、対応するテストケースが過去に実行された際に呼び出されたモジュールである。依存モジュールは、例えば、過去のテストの実行履歴のうち、所定回数以上、呼び出されたモジュールであってもよい。依存モジュールは、例えば、最近の１０回のテストの実行履歴のうち、７回以上、呼び出されたモジュールであってもよい。依存モジュールは、第１モジュールの一例である。
【００２１】
また、過去にテストケースを実行した際に１回以上、ダミーモジュールが呼び出された場合、該ダミーモジュールの生成元のモジュールが依存モジュールに設定されてもよい。ダミーモジュールは、対応するモジュールのインタフェースの実装に関連しないコードを簡略化したモジュールである。ダミーモジュールについて、詳細は後述する。
【００２２】
静的リンクモジュールは、対応する依存モジュールにおける静的リンク対象のモジュールである。静的リンクは、プログラムをリンクした時に用いるライブラリを該プログラムに含める方式である。静的リンクモジュールは、過去のテストの実行履歴のうち、所定回数以上、対応する依存モジュールと静的リンク関係であったモジュールであってもよい。例えば、静的リンクモジュールは、最近の１０回のテストの実行履歴のうち、７回以上、対応する依存モジュールと静的リンク関係であったモジュールであってもよい。静的リンクモジュールは、第２モジュールの一例である。
【００２３】
実行時間は、対応するテストケースを過去に実行した際の実行開始から終了までの経過時間である。実行時間は、例えば、過去に対応するテストケースを実行した際の経過時間の平均値であってもよい。実行時間は、例えば、過去に対応するテストケースを実行した際の経過時間のうち、最近の所定回（例えば、５回）の経過時間の平均値であってもよい。
【００２４】
実行状態は、「NotStarted」が初期状態を示す。「Started」は、実施対象選択済みを示す。「Compiled」は、コンパイル完了を示す。「Prepared」は、配備完了を示す。「Finished」は、テスト完了を示す。「Pending」は、テスト実行時にダミーモジュールが呼ばれテストが保留となっていることを示す。「Aborted」は、テスト実行失敗またはテストエラーを示す。
【００２５】
最新実行日時は、対応するテストケースが実行された日時のうち最新の日時を示す。
図３は、ダイナミックコールツリーの一例を示す図である。ダイナミックコールツリーは、テストを実行した際のモジュールの呼び出し関係を示す。図３に示す例では、ClassAがClassBとClassCとを呼び出し、ClassBがClassDを呼び出し、ClassCがClassDとClassEとを呼び出したことを示す。また、ClassFは、テスト実行中に呼び出されなかったことを示す。
【００２６】
テスト実行制御装置３は、例えば、図３に示すようなダイナミックコールツリーを生成し、ダイナミックコールツリーに基づいて、図２に示すテストケース情報の依存モジュールを特定する。図３に示す例では、ClassA、ClassB、ClassC、ClassD、およびClassEが依存モジュールとして設定される。
【００２７】
図４は、モジュール情報の一例を示す図である。モジュール情報には、モジュール名とインタフェース情報とコンパイル済フラグとダミーモジュール生成済フラグとが対応づけられている。インタフェース情報は、対応するモジュールが実装しているインタフェースに関する情報である。図４に示す例では、インタフェース情報は、インタフェースに含まれるメソッド名を示す。
【００２８】
コンパイル済フラグは、対応するモジュールがコンパイル済かを示すフラグである。コンパイル済フラグが「True」である場合、対応するモジュールがコンパイル済であることを示す。コンパイル済フラグが「False」である場合、対応するモジュールがコンパイル済でないことを示す。
【００２９】
ダミーモジュール生成済フラグは、対応するモジュールのダミーモジュールが生成済みかを示すフラグである。ダミーモジュール生成済フラグが「True」である場合、対応するモジュールのダミーモジュールが生成済みであることを示す。ダミーモジュール生成済フラグが「False」である場合、対応するモジュールのダミーモジュールが生成済でないことを示す。
【００３０】
＜テスト実行制御装置の一例＞
図５は、テスト実行制御装置３の一例を示す図である。テスト実行制御装置３は、通信部３１と判定部３２と更新部３３と選択部３４と生成部３５とコンパイル部３６と実行制御部３７と記憶部３８とを含む。
【００３１】
通信部３１は、第１データベースサーバ１から、ソースコードを受信する。また、通信部３１は、第２データベースサーバ２から、テストケース情報およびモジュール情報を受信する。通信部３１は、コンパイルが実行された後に、テスト実行装置４に実行形式ファイルを送信する。
【００３２】
判定部３２は、テスト実行対象のソースコードの更新を検知した場合、ソースコード内のインタフェースの更新の有無を判定する。
【００３３】
更新部３３は、テスト実行対象のソースコード内のインタフェースが更新されたと判定された場合、モジュール情報に含まれるインタフェース情報を更新する。モジュール情報は、ソースコードに含まれるモジュールのインタフェースに関する情報を含む。
【００３４】
更新部３３は、テストケースに対応するダミーモジュールを生成した場合、モジュール情報において、ダミーモジュールが生成済みであることを示す第１情報を設定する。第１情報は、例えば、ダミーモジュール生成済フラグにおける「True」である。
【００３５】
更新部３３は、テストケースに対応するモジュールをコンパイルした場合、モジュール情報において、該モジュールをコンパイル済であることを示す第２情報を設定する。第２情報は、例えば、コンパイル済フラグの「True」である。
【００３６】
更新部３３は、テスト実行中にダミーモジュールが呼ばれた場合、保留を示す情報（例えば、「Pending」）を実行されたテストケースの実行状態としてテストケース情報に記録する。
【００３７】
選択部３４は、複数のテストケースに関する情報を含むテストケース情報を参照し、過去に該テストケースを実行した際のテスト実行時間に基づいて、複数のテストケースから実行対象のテストケースを選択する。選択部３４は、例えば、複数のテストケースのうち、過去に該テストケースを実行した際のテスト実行時間が長いテストケースから順に、テストケースを実行対象として選択する。選択部３４は、例えば、複数のテストケースのうち、テスト実行時間の長さが所定時間以上のテストケースのうちのいずれかを実行対象として選択してもよい。
【００３８】
生成部３５は、選択したテストケースの依存モジュールに対応する静的リンクモジュールのソースコードのうち、更新後のモジュール情報に示されるインタフェースの実装に関連しないコードを簡略化してダミーモジュールを生成する。生成部３５は、例えば、インタフェースの実装に関連するコードを削除し、さらに、ダミーモジュールが呼ばれたことを通知するコードを追加したダミーモジュールを生成する。
【００３９】
生成部３５は、モジュール情報において、選択されたテストケースに対応する静的リンクモジュールについて、ダミーモジュール生成済フラグまたはコンパイル済フラグが「True」に更新されている場合、ダミーモジュールを生成しないことを決定する。
【００４０】
コンパイル部３６は、選択したテストケースの依存モジュールと、生成部３５が生成したダミーモジュールをコンパイルする。コンパイル部３６は、テストケース情報に、選択されたテストケースの実行状態として「Pending」が記録されている場合、ダミーモジュールの生成元の静的リンクモジュールをコンパイルする。コンパイル部３６は、例えば、コンパイラを含む。
【００４１】
コンパイル部３６は、モジュール情報を参照し、選択されたテストケースを過去に実施した際に実行された依存モジュールのコンパイル済フラグが「True」である場合、依存モジュールのコンパイルを実行しないことを決定する。
【００４２】
実行制御部３７は、テスト実行装置４に、選択されたテストケースの実行を指示する。
記憶部３８は、テスト実行制御装置３の制御に用いる各種情報を記憶する。記憶部３８は、例えば、第１データベースサーバ１から受信したソースコード、第２データベースサーバ２から受信したテストケース情報およびモジュール情報を記憶する。
【００４３】
図６は、依存モジュールの一例を示す図である。図６に示す依存モジュールのソースコードは、"Pay"というClassを含んでいる。また、図６に示す依存モジュールのソースコードは、静的リンクとして、"JapanTax"というClassを指定している。
【００４４】
図７は、インタフェースのソースコードの一例を示す図である。図７に示すインタフェースは、"Tax.java"というファイルに記述されており、"double getTaxPrice(double cost);"というメソッドが含まれている。判定部３２は、例えば、図６に示すようなインタフェースを示すソースコードを参照して、インタフェースに更新があるかを判定する。
【００４５】
なお、本実施形態ではプログラム言語としてＪａｖａ（登録商標）を用いているが、実行時にコンパイルが行われる任意の言語（例えば、静的型付け言語）を本実施形態に適用してもよい。
【００４６】
図８は、静的リンクモジュールのソースコードの一例を示す図である。図８に示すソースコードは、図７に示すインタフェースを実装している。図８に示すソースコードは、所定の処理を行い、値を返す処理が記述されている。判定部３２は、例えば、図８に示すようなインタフェースを実装したソースコードを参照して、インタフェースに更新があるかを判定してもよい。
【００４７】
図９は、ダミーモジュールのソースコードの一例を示す図である。図９に示すダミーモジュールのソースコードは、図８に示すソースコードに基づいて生成されたソースコードである。図９に示すソースコードは、図８に記述されている、"double getTaxPrice(double cost);"というメソッド内の処理が記述されていない。また、図８に示すソースコードは、ダミーモジュールが呼ばれたことを通知するコードとして"System.exit(255);"というコードが記述されている。ダミーモジュールが呼ばれたことを通知するコードは、該コードに限られない。テスト実行装置４は、ダミーモジュールが呼ばれたことが通知された場合、テスト実行制御装置３にダミーモジュールが呼ばれたことを示す情報を送信する。
【００４８】
図８および図９に示すように、ダミーモジュールのソースコードは、生成元のモジュールのソースコードから、インタフェースの実装に関連しないコードを簡略化して生成される。従って、ダミーモジュールは、生成元のモジュールよりコンパイルの実行時間が短い。
【００４９】
＜実施形態の処理の流れの一例＞
図１０〜図１２は、第１の実施形態の処理の流れの一例を示すフローチャートである。判定部３２は、テスト実行対象のソースコードの更新があるか判定する（ステップＳ１０１）。判定部３２は、例えば、テストケース情報記憶部２１からテストケース情報を取得し、テストの最新実行日時を参照する。そして、判定部３２は、ソースコード記憶部１１に記憶された、テストの最新実行日時におけるソースコードと、最新のソースコードとを比較し、更新があるかを判定する。
【００５０】
ステップＳ１０１におけるソースコードの更新の検知には、ポーリング方式またはフック形式等が用いられてもよい。判定部３２は、ポーリング方式を用いる場合、定期的にソースコード記憶部１１を参照して、ソースコードの更新の有無を判定する。
【００５１】
フック方式を用いる場合、第１データベースサーバ１は、ソースコードが更新された際に、テスト実行制御装置３に更新を示す情報を送信する。判定部３２は、送信された更新を示す情報により、ソースコードが更新されたことを検知することができる。
ステップＳ１０１でＮＯの場合、処理は、次のステップに進まない。ステップＳ１０１でＹＥＳの場合、判定部３２は、テストケース情報記憶部２１にテストケース情報が存在するか判定する（ステップＳ１０２）。ステップＳ１０２でＮＯの場合、処理は終了する。
【００５２】
判定部３２は、さらに、図示しない管理端末からモジュール配備の指示を受信したかを判定し、ステップＳ１０１でＹＥＳであり、かつ、モジュール配備の指示を受信した場合に、ステップＳ１０２以降の処理に進んでもよい。
【００５３】
ステップＳ１０２でＹＥＳの場合、判定部３２は、ソースコード記憶部１１のソースコードを取得し、インタフェースの更新があるかを判定する（ステップＳ１０３）。すなわち、判定部３２は、ステップＳ１０１で検知したソースコードの更新においてインタフェースの更新が行われているかを判定する。インタフェースの更新は、例えば、インタフェースの追加、変更、または削除である。
【００５４】
ステップＳ１０３でＹＥＳの場合、更新部３３は、インタフェースの更新内容に基づいて、モジュール情報のインタフェース情報を更新する（ステップＳ１０４）。更新部３３は、例えば、インタフェースにメソッドが追加されている場合、追加されたメソッドの名称をモジュール情報に記録する。
【００５５】
ステップＳ１０３でＮＯの場合、またはステップＳ１０４の処理後、更新部３３は、テストケース情報およびモジュール情報を初期化する（ステップＳ１０５）。更新部３３は、例えば、テストケース情報の全てのテストケースの実行状態に「NotStarted」を設定する。さらに、更新部３３は、例えば、モジュール情報の全てのモジュールのコンパイル済フラグおよびダミーモジュール生成済フラグに「False」を設定する。
【００５６】
選択部３４は、テストケース情報を参照し、テストケース毎の実行時間に基づいて、実施対象のテストケースを選択する（ステップＳ１０６）。選択部３４は、例えば、テストケース情報において、実行状態が「NotStarted」であるテストケースのうち、実行時間が最も長いテストケースを実施対象のテストケースとして選択する。そして、選択部３４は、テストケース情報に実行状態が「NotStarted」であるテストケースが存在しない場合、実行状態が「Pending」であるテストケースのうち、実行時間が最も長いテストケースを実施対象のテストケースとして選択する。
【００５７】
更新部３３は、テストケース情報のうち、ステップＳ１０６で選択されたテストケースの実行状態を「started」に設定する（ステップＳ１０７）。
【００５８】
選択部３４は、テストケース情報に選択可能なテストケースがあるか判定する（ステップＳ１０８）。選択可能なテストケースは、例えば、実行状態に「NotStarted」または「Pending」が設定されているテストケースである。ステップＳ１０８でＹＥＳの場合、処理はステップＳ１０６に戻る。ステップＳ１０８でＮＯの場合、処理は、ステップＳ１０９に移行する。
【００５９】
なお、ステップＳ１０７の処理後、ステップＳ１０８以降の処理とステップＳ１０９以降の処理が並行で実行される。すなわち、次のテストケースを選択する処理と、すでに選択されたテストケースに対するコンパイルおよびテスト等の処理が並行で実行される。さらに、例えば、ステップＳ１０６が繰り返し実行されて複数のテストケースが選択された場合、選択された複数のテストケースに関してステップＳ１０９以降の処理が並行で実行される。
【００６０】
「Ａ」以降の処理について、図１１を参照して説明する。生成部３５は、テストケース情報を参照し、選択されたテストケース（実行状態が「started」であるテストケース）の静的リンクモジュールが、ダミーモジュール生成対象であるか判定する（ステップＳ１０９）。
【００６１】
生成部３５は、例えば、モジュール情報において静的リンクモジュールに対応づけられたコンパイル済フラグおよびダミーモジュール生成済フラグが「False」である場合に、該静的リンクモジュールがダミーモジュール生成対象であると判定する。
【００６２】
また、生成部３５は、例えば、モジュール情報において静的リンクモジュールに対応づけられたコンパイル済フラグまたはダミーモジュール生成済フラグが「True」である場合に、該静的リンクモジュールがダミーモジュール生成対象でないと判定する。
【００６３】
上述のように、ステップＳ１０９以降の処理は、複数のテストケースに関して並行で実行されるため、静的リンクモジュールが他のテストケースの依存モジュールと重複する場合、該静的リンクモジュールのコンパイルが行われている可能性がある。また、静的リンクモジュールが他のテストケースの静的リンクモジュールと重複する場合、該静的リンクモジュールのダミーモジュールの生成が行われている可能性がある。
【００６４】
ステップＳ１０９でＹＥＳの場合、生成部３５は、テストケース情報を参照し、選択されたテストケースに対応づけられた依存モジュールの静的リンクモジュールを基にダミーモジュールを生成する（ステップＳ１１０）。
【００６５】
生成部３５は、例えば、静的リンクモジュールのソースコードから、ステップＳ１０４における更新後のモジュール情報に示されるインタフェースの実装に関連しないコードを簡略化してダミーモジュールを生成する。ダミーモジュールは、例えば、呼び出された際にエラーを発生するように生成される。
【００６６】
静的リンクモジュールがコンパイルされていない場合、依存モジュールを実行する際にエラーが発生する。しかし、静的リンクモジュールは、テスト実行中に呼び出されない可能性がある。従って、生成部３５は、静的リンクモジュールのダミーモジュールを生成する。ダミーモジュールは、生成元の静的リンクモジュールよりコード量が少なくコンパイルが早く終わるため、テスト実行制御装置３は、テスト実行開始までの時間を早めることができる。
【００６７】
更新部３３は、生成されたダミーモジュールについて、モジュール情報のダミーモジュール生成済フラグを「True」に更新する（ステップＳ１１１）。更新部３３は、モジュール情報のダミーモジュール生成済フラグを「True」に更新することにより、例えば、他のテストケースで同じダミーモジュールを生成することを防ぐことができる。
【００６８】
コンパイル部３６は、テストケース情報を参照し、選択されたテストケースの依存モジュールがコンパイル対象であるか判定する（ステップＳ１１２）。
【００６９】
コンパイル部３６は、モジュール情報を参照し、テストケースの実行状態が「Started」である場合、コンパイル済フラグが「False」である依存モジュールをコンパイル対象であると判定する。また、コンパイル部３６は、テストケースの実行状態が「Started」である場合、コンパイル済フラグが「True」である依存モジュールをコンパイル対象でないと判定する。
【００７０】
選択されたテストケースの実行状態が「Pending」である場合、コンパイル部３６は、コンパイル済フラグが「False」である静的リンクモジュールをコンパイル対象であると判定する。選択されたテストケースの実行状態が「Pending」である場合、コンパイル部３６は、コンパイル済フラグが「True」である静的リンクモジュールをコンパイル対象でないと判定する。
【００７１】
ステップＳ１１２でＹＥＳの場合、コンパイル部３６は、選択されたテストケースの実行状態が「Pending」であるか判定する（ステップＳ１１３）。例えば、選択されたテストケースの実行状態が「Started」となっている場合、ステップＳ１１３でＮＯとなる。
【００７２】
ステップＳ１１３でＮＯの場合、コンパイル部３６は、選択されたテストケースの依存モジュール、および生成したダミーモジュールのコンパイルを実行する（ステップＳ１１４）。コンパイル部３６は、例えば、テストケース情報において選択されたテストケースに対応づけられている依存モジュール、および生成したダミーモジュールのコンパイルを実行する。
【００７３】
ステップＳ１１３でＹＥＳの場合、コンパイル部３６は、静的リンクモジュールをコンパイルする（ステップＳ１１５）。実行状態が「Pending」である場合、前回のテストにおいてダミーモジュールが呼び出され、テストが完了しなかったことを示している。従って、コンパイル部３６は、ダミーモジュールの生成元のモジュールである静的リンクモジュール自体をコンパイルすることにより、２回目のテストを実行完了とすることできる。
【００７４】
例えば、テストケース情報にPending回数を追加し、Pending回数が所定回数を超えた場合に、コンパイル部３６は、静的リンクモジュールをコンパイルしてもよい。
【００７５】
更新部３３は、モジュール情報のうち、ステップＳ１１４でコンパイルした依存モジュールまたはステップＳ１１５でコンパイルした静的リンクモジュールのコンパイル済フラグを「True」に更新する（ステップＳ１１６）。更新部３３は、モジュール情報のコンパイル済フラグを「True」に更新することにより、他のテストケースに関する処理で同じモジュールをコンパイルすることを防ぐことができる。例えば、他のテストケースと依存モジュールが重複していたとしても、コンパイル済フラグが「True」である場合、ステップＳ１１２でＮＯとなり、コンパイルが実行されないからである。
【００７６】
更新部３３は、テストケース情報のうち、コンパイルが実行されたモジュールに対応するテストケースの実行状態を「Compiled」に更新する（ステップＳ１１７）。
【００７７】
ステップＳ１１２でＮＯの場合またはステップＳ１１７の処理後、処理は、「Ｂ」からステップＳ１１８に移行する。
【００７８】
実行制御部３７は、コンパイルしたモジュールを、テスト実行装置４に配備する（ステップＳ１１８）。配備するモジュールは、ステップＳ１１４またはＳ１１５でコンパイルされたモジュールである。実行制御部３７は、例えば、コンパイルにより生成された実行形式ファイルを、テスト実行装置４に送信し、実行形式ファイル記憶部４１に記憶させることにより、モジュールを配備する。
【００７９】
ステップＳ１１８において、実行状態が「pending」であるテストケースを実行する場合、実行制御部３７は、ダミーモジュールを配備せずに、ステップＳ１１５の処理で生成された静的リンクモジュールの実行形式ファイルを配備する。再度、ダミーモジュールを配備した場合、再度、ダミーモジュールが呼ばれて、テストが正常に終了しないからである。
【００８０】
更新部３３は、テストケース情報のうち、モジュール配備が完了したテストケースの実行状態を「prepared」に更新する（ステップＳ１１９）
実行制御部３７は、実行状態が「prepared」であるテストケースの実行をテスト実行装置４に指示する（ステップＳ１２０）。実行制御部３７は、例えば、テスト実行装置４に、実行状態が「prepared」であるテストケースの識別情報と、テスト実行指示情報とを送信する。
【００８１】
そして、テスト実行装置４のテスト実行部４２は、実行形式ファイル記憶部４１内の実行形式ファイルを用いてテストを実行し、テストの実行結果をテスト実行制御装置３に送信する。テスト実行中にダミーモジュールが呼ばれた場合、エラーが発生することにより、テスト実行部４２は、ダミーモジュールが呼ばれたことを検知する。テスト実行部４２は、例えば、テスト実行中にダミーモジュールが呼ばれた場合、呼ばれたダミーモジュールを識別する情報を、テスト実行制御装置３に送信する。
【００８２】
更新部３３は、呼ばれたダミーモジュールを識別する情報を受信したかに応じて、ダミーモジュールが呼ばれたかを判定する（ステップＳ１２１）。ダミーモジュールが呼ばれたと判定された場合（ステップＳ１２１でＹＥＳ）、更新部３３は、テストケース情報のうち、実行されたテストケースの実行状態を「Pending」に更新する（ステップＳ１２２）。
【００８３】
ダミーモジュールが呼ばれた場合、更新部３３は、実行状態を「Pending」に更新することにより、次回のステップＳ１１３の判定でＹＥＳとなる。そして、ステップＳ１１５の処理において、コンパイル部３６は、ダミーモジュールの生成元のモジュールである静的リンクモジュールをコンパイルする。従って、再度のテストが実行された場合、ダミーモジュールが呼ばれずにテストの実行が完了する。
【００８４】
なお、ダミーモジュールが呼ばれたと判定された場合（ステップＳ１２１でＹＥＳ）、テスト実行制御装置３は、テストを異常終了させてもよい。また、ダミーモジュールが呼ばれたと判定された場合（ステップＳ１２１でＹＥＳ）、テスト実行制御装置３は、全てのモジュールのコンパイルが終了してから、再度テストを行ってもよい。
【００８５】
ダミーモジュールが呼ばれていないと判定された場合（ステップＳ１２１でＮＯ）、更新部３３は、テストケース情報のうち、実行されたテストケースの実行状態を「Finished」に更新する（ステップＳ１２３）。さらに、更新部３３は、テスト結果に基づいて、テストケース情報の依存モジュール、静的リンクモジュール、および処理時間を更新する。
【００８６】
実行制御部３７は、テストケース情報に含まれる全てのテストケースの実行が完了したか判定する（ステップＳ１２４）。実行制御部３７は、例えば、テストケース情報の実行状態が全て「Finished」であれば、全てのテストケースの実行が完了したと判定する。
【００８７】
ステップＳ１２４でＮＯの場合、処理は、「Ｃ」から図１０のステップＳ１０６に移行する。ステップＳ１２４でＹＥＳの場合、実行制御部３７は、正式なモジュール配備を実行する（ステップＳ１２５）。
【００８８】
なお、テストケース情報の実行状態が全て「Finished」であるが、モジュール情報のコンパイル済フラグが「False」であるモジュールが存在する場合、コンパイル部３６は、コンパイル済フラグが「False」であるモジュールをコンパイルする。テストケース情報の実行状態が全て「Finished」であるが、モジュール情報のコンパイル済フラグが「False」であるモジュールが存在する場合、実行制御部３７は、異常終了を示す情報を図示しない管理端末に送信してもよい。実行制御部３７は、テストの実行において、他の異常が発生した場合にも、異常終了を示す情報を図示しない管理端末に送信してもよい。
【００８９】
図１３〜図１５は、第２の実施形態の処理の流れの一例を示すフローチャートである。図１３〜図１５に示すフローチャートは、図１３においてステップＳ１０２ａとステップＳ１０２ｂが追加されている点で、図１０〜図１２に示す第１の実施形態のフローチャートと異なる。以下の説明において、第１の実施形態のフローチャート同じ処理に関しては、説明を省略する。
【００９０】
判定部３２は、ステップＳ１０１で検知したソースコードの更新において、いずれかの依存モジュールに静的リンクが追加されているか判定する（ステップＳ１０２ａ）。ステップＳ１０２ａでＮＯの場合、処理は、ステップＳ１０３に移行する。
【００９１】
ステップＳ１０２ａでＹＥＳの場合、更新部３３は、テストケース情報において、追加された静的リンクモジュール名が依存モジュール欄に記録されていなければ、該静的リンクモジュールを依存モジュール欄に追加する更新を行う（ステップＳ１０２ｂ）。
【００９２】
テストケース情報の依存モジュールに含まれていないモジュールは、前回のテストで呼ばれなかったモジュールである。しかし、新たに静的リンクが追加された場合、今回のテストで呼ばれる可能性が高いからである。
【００９３】
ステップＳ１０２ｂにおいて、追加された静的リンクモジュール名を依存モジュール欄に追加することにより、追加された静的リンクモジュールがステップＳ１１４において依存モジュールとして扱われ、コンパイルが実行される。従って、該静的リンクモジュールに対応するテストケースが選択され、該静的リンクモジュールがテスト中に呼び出されたとしても、テスト実行制御装置３は、テストの実行を完了することができる。
【００９４】
＜継続的インテグレーション実施結果の例＞
図１６は、比較例における継続的インテグレーション実施結果を示す図である。比較例では、ClassA、ClassB、ClassCそれぞれについて、コンパイルおよび配備が実行され、テスト１およびテスト２が実行されたことを示している。比較例では、ダミーモジュールの生成は行われず、全てのモジュールのコンパイルが完了してから、配備およびテストが行われている。比較例では、継続的インテグレーションの開始から終了までの時間は、２９秒である。
【００９５】
図１７は、実施形態における継続的インテグレーション実施結果（ダミーモジュール呼び出しなし）の一例を示す図である。図１７に示す例では、選択部３４は、最初に行うテストケースとしてテスト１を選択し、コンパイル部３６は、テスト１の依存モジュールであるClassAおよびClassBのコンパイルを実行したとする。そして、実行制御部３７は、ClassAおよびClassBの配備完了後、テスト１の実行を指示する。
【００９６】
なお、図１７において、ClassAおよびClassBに静的リンクモジュールが存在する場合、静的リンクモジュールに基づいて生成されたダミーモジュールのコンパイルが行われる。しかし、ダミーモジュールのコンパイル時間は、通常のモジュールと比べて短時間であるため、図１７に示す実施結果では無視している。
【００９７】
図１７に示す例では、継続的インテグレーションの開始から終了までの時間は、２２秒である。図１７に示す例では、ClassCのコンパイルおよび配備を待たずにテスト１の実行を開始しているため、図１６に示す例より継続的インテグレーション全体の処理時間が短縮されている。
【００９８】
以上のように、テスト実行制御装置３は、テストの実行開始が早めることができるので、継続的インテグレーション全体の処理時間を短縮することができる。
【００９９】
図１８は、実施形態における継続的インテグレーション実施結果（ダミーモジュール呼び出しあり）を示す図である。図１８において、テスト１実行開始までの実行結果は、図１７に示す例と同じである。テスト１の実行中、例えば、ダミーモジュールが呼ばれたことによりテスト１の実行が失敗したとする。
【０１００】
テスト１の実行において、呼ばれたダミーモジュールがClassCに基づくダミーモジュールであった場合、ClassCのコンパイルが完了すれば、テスト１を完了することができる。図１８に示す例では、ClassCは、テスト２の依存モジュールであり、テスト１の実行開始前にコンパイルが開始されていたとする。そして、実行制御部３７は、ClassCのコンパイルと配備の完了後、テスト１の２回目の実行（再実行）を開始する。
【０１０１】
図１８に示す例では、継続的インテグレーションの開始から終了までの時間は、２７秒である。実施形態のテスト実行制御装置３は、ダミーモジュールが呼ばれたことによりテストの実行が失敗したとしても、比較例と比べてテストの実行開始を早めることができ、継続的インテグレーション全体の処理時間が短縮することができる。
【０１０２】
図１９は、図１６〜図１８の実施結果の比較を示す図である。図１９（ａ）に示す比較例の実施結果は、図１６の実施結果に対応している。図１９（ｂ）に示す実施形態の例（ダミーモジュール呼び出しなし）の実施結果は、図１７の実施結果に対応している。図１９（ｃ）に示す実施形態の例（ダミーモジュール呼び出しあり）の実施結果は、図１８の実施結果に対応している。
【０１０３】
図１９に示すように、テスト実行制御装置３は、テストの実行開始を早めることができる。また、図１９（ｃ）の例のように、ダミーモジュールが呼ばれたことによりテストの実行が失敗したとしても、ダミーモジュールの生成元のモジュールがテストの実行と並行でコンパイルされている可能性がある。従って、テスト実行制御装置３は、ダミーモジュールが呼ばれたとしても、テストの実行開始を早めることができ、継続的インテグレーション全体の処理時間を短縮することができる。
【０１０４】
＜テスト実行制御装置のハードウェア構成の一例＞
次に、図２０の例を参照して、テスト実行制御装置３のハードウェア構成の一例を説明する。図２０の例に示すように、バス１００に対して、プロセッサ１１１とRandom Access Memory(RAM)１１２とRead Only Memory(ROM)１１３とが接続される。また、該バス１００に対して、補助記憶装置１１４と媒体接続部１１５と通信インタフェース１１６とが接続される。
【０１０５】
プロセッサ１１１はＲＡＭ１１２に展開されたプログラムを実行する。実行されるプログラムとしては、実施形態における処理を行うテスト実行制御プログラムが適用されてもよい。
【０１０６】
ＲＯＭ１１３はＲＡＭ１１２に展開されるプログラムを記憶する不揮発性の記憶装置である。補助記憶装置１１４は、種々の情報を記憶する記憶装置であり、例えばハードディスクドライブや半導体メモリ等を補助記憶装置１１４に適用してもよい。補助記憶装置１１４に実施形態の処理を行うテスト実行制御プログラムが記録されていてもよい。
【０１０７】
媒体接続部１１５は、可搬型記録媒体１１７と接続可能に設けられている。可搬型記録媒体１１７としては、可搬型のメモリや光学式ディスク（例えば、Compact Disc(CD)やDigital Versatile Disc(DVD))、半導体メモリ等を適用してもよい。可搬型記録媒体１１７に実施形態の処理を行うテスト実行制御プログラムが記録されていてもよい。
【０１０８】
図５に示す記憶部３８は、ＲＡＭ１１２や補助記憶装置１１４等により実現されてもよい。図５に示す通信部３１は、通信インタフェース１１６により実現されてもよい。図５に示す判定部３２、更新部３３、選択部３４、生成部３５、コンパイル部３６、および実行制御部３７は、与えられたテスト実行制御プログラムをプロセッサ１１１が実行することにより実現されてもよい。
【０１０９】
ＲＡＭ１１２、ＲＯＭ１１３、補助記憶装置１１４および可搬型記録媒体１１７は、何れもコンピュータ読み取り可能な有形の記憶媒体の一例である。これらの有形な記憶媒体は、信号搬送波のような一時的な媒体ではない。
【０１１０】
＜テスト実行装置のハードウェア構成の一例＞
次に、図２１の例を参照して、テスト実行装置４のハードウェア構成の一例を説明する。図２１の例に示すように、バス２００に対して、プロセッサ２１１とRandom Access Memory(RAM)２１２とRead Only Memory(ROM)２１３とが接続される。また、該バス２００に対して、補助記憶装置２１４と媒体接続部２１５と通信インタフェース２１６とが接続される。
【０１１１】
プロセッサ２１１はＲＡＭ２１２に展開されたプログラムを実行する。実行されるプログラムとしては、実施形態における処理を行うテスト実行制御プログラムが適用されてもよい。
【０１１２】
ＲＯＭ２１３はＲＡＭ２１２に展開されるプログラムを記憶する不揮発性の記憶装置である。補助記憶装置２１４は、種々の情報を記憶する記憶装置であり、例えばハードディスクドライブや半導体メモリ等を補助記憶装置２１４に適用してもよい。補助記憶装置２１４に実施形態の処理を行うテスト実行制御プログラムが記録されていてもよい。
【０１１３】
媒体接続部２１５は、可搬型記録媒体２１７と接続可能に設けられている。可搬型記録媒体２１７としては、可搬型のメモリや光学式ディスク（例えば、Compact Disc(CD)やDigital Versatile Disc(DVD))、半導体メモリ等を適用してもよい。可搬型記録媒体２１７に実施形態の処理を行うテスト実行制御プログラムが記録されていてもよい。
【０１１４】
図１に示す実行形式ファイル記憶部４１は、ＲＡＭ２１２や補助記憶装置２１４等により実現されてもよい。図１に示すテスト実行部４２は、与えられたテスト実行制御プログラムをプロセッサ２１１が実行することにより実現されてもよい。
【０１１５】
ＲＡＭ２１２、ＲＯＭ２１３、補助記憶装置２１４および可搬型記録媒体２１７は、何れもコンピュータ読み取り可能な有形の記憶媒体の一例である。これらの有形な記憶媒体は、信号搬送波のような一時的な媒体ではない。
【０１１６】
＜その他＞
本実施形態は、以上に述べた実施の形態に限定されるものではなく、本実施形態の要旨を逸脱しない範囲内で種々の構成または実施形態を取ることができる。
【符号の説明】
【０１１７】
１    第１データベースサーバ
２    第２データベースサーバ
３    テスト実行制御装置
４    テスト実行装置
１１    ソースコード記憶部
２１    テストケース情報記憶部
２２    モジュール情報記憶部
３１    通信部
３２    判定部
３３    更新部
３４    選択部
３５    生成部
３６    コンパイル部
３７    実行制御部
３８    記憶部
４１    実行形式ファイル記憶部
４２    テスト実行部
１００，２００    バス
１１１，２１１    プロセッサ
１１２，２１２    ＲＡＭ
１１３，２１３    ＲＯＭ
１１４，２１４    補助記憶装置
１１５，２１５    媒体接続部
１１６，２１６    通信インタフェース
１１７，２１７    可搬型記録媒体
【図１】
2019028913.tif 000003
【図２】
2019028913.tif 000004
【図３】
2019028913.tif 000005
【図４】
2019028913.tif 000006
【図５】
2019028913.tif 000007
【図６】
2019028913.tif 000008
【図７】
2019028913.tif 000009
【図８】
2019028913.tif 000010
【図９】
2019028913.tif 000011
【図１０】
2019028913.tif 000012
【図１１】
2019028913.tif 000013
【図１２】
2019028913.tif 000014
【図１３】
2019028913.tif 000015
【図１４】
2019028913.tif 000016
【図１５】
2019028913.tif 000017
【図１６】
2019028913.tif 000018
【図１７】
2019028913.tif 000019
【図１８】
2019028913.tif 000020
【図１９】
2019028913.tif 000021
【図２０】
2019028913.tif 000022
【図２１】
2019028913.tif 000023