JP7331681B2 - テスト実行プログラム、テスト実行方法、およびテスト実行装置 - Google Patents

テスト実行プログラム、テスト実行方法、およびテスト実行装置 Download PDF

Info

Publication number
JP7331681B2
JP7331681B2 JP2019228133A JP2019228133A JP7331681B2 JP 7331681 B2 JP7331681 B2 JP 7331681B2 JP 2019228133 A JP2019228133 A JP 2019228133A JP 2019228133 A JP2019228133 A JP 2019228133A JP 7331681 B2 JP7331681 B2 JP 7331681B2
Authority
JP
Japan
Prior art keywords
test
code
statement
test execution
group
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2019228133A
Other languages
English (en)
Other versions
JP2021096685A (ja
Inventor
訓広 野田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2019228133A priority Critical patent/JP7331681B2/ja
Publication of JP2021096685A publication Critical patent/JP2021096685A/ja
Application granted granted Critical
Publication of JP7331681B2 publication Critical patent/JP7331681B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Description

本発明は、テスト実行プログラム、テスト実行方法、およびテスト実行装置に関する。
従来、ソフトウェアの開発者は、ソフトウェアを実現するソースコード内から、ソフトウェアに意図しない挙動を起こさせるバグの原因となる箇所を探し、バグの原因となる箇所を修正する。ここで、ソースコード内から、バグの原因となる箇所を絞り込み易くし、開発者の作業負担の低減化を図るための、バグ局所化(Fault Localization)と呼ばれる技術がある。
この技術の一種としては、例えば、SBFL(Spectrum-Based Fault Localization)と呼ばれるものがある。SBFLは、ソースコードに対して複数のテストを実行し、それぞれのテストの実行結果の妥当性と、それぞれのテストで実行されたソースコード内の命令文を記録したログ情報とに基づいて、命令文ごとに、バグの原因である可能性の高さを示す疑惑値(Suspiciousness Score)を算出する。そして、SBFLは、開発者が、算出された疑惑値を参照可能にし、バグの原因となる箇所を絞り込み易くする。
先行技術としては、例えば、テストケースごとに分析対象のプログラムのテストを実行し、テストケースごとのテスト結果および分析対象のプログラムの各行の実行回数を記録し、分析対象のプログラムの各行と実行回数との組ごとにリスクを算出するものがある。リスクは、分析対象のプログラムの行の、バグの原因である可能性の高さを示す。また、例えば、ロードされたJavaプログラムの中に動作情報を出力するための監視命令を挿入した監視用Javaプログラムを生成し、監視用Javaプログラムを実行して動作情報を取得し、動作情報を分析して分析結果を表示する技術がある。ここで、Javaは、登録商標である。
特開2014-182451号公報 特開2010-033543号公報
しかしながら、従来技術では、ソースコード内のバグの原因となる箇所を発見することが難しい場合がある。例えば、SBFLは、命令文ごとに、バグの原因である可能性の高さを示す疑惑値を算出するにあたり、ノイズとなる情報を除去することができず、疑惑値を算出する精度が悪いため、開発者は、疑惑値を参照しても、バグの原因となる箇所を発見することが難しい。
1つの側面では、本発明は、バグ局所化にあたりノイズとなる情報を切り分け可能にすることを目的とする。
1つの実施態様によれば、テスト対象コードと、前記テスト対象コードに対するテストを実行するテスト実行コードとを取得し、取得した前記テスト対象コードと、取得した前記テスト実行コードとをテキスト解析した結果に基づいて、前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定し、前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする情報を記録するテスト実行プログラム、テスト実行方法、およびテスト実行装置が提案される。
一態様によれば、バグ局所化にあたりノイズとなる情報を切り分け可能になる。
図1は、実施の形態にかかるテスト実行方法の一実施例を示す説明図である。 図2は、バグ発見システム200の一例を示す説明図である。 図3は、テスト実行装置100のハードウェア構成例を示すブロック図である。 図4は、テスト実行装置100の機能的構成例を示すブロック図である。 図5は、テスト実行装置100の具体的な機能的構成例を示すブロック図である。 図6は、テスト対象ロジックを特定する流れを示す説明図である。 図7は、カバレッジ情報を記録する流れを示す説明図である。 図8は、本体プログラム810とテストプログラム800との一例を示す説明図である。 図9は、テスト対象ロジックを特定する一例を示す説明図(その1)である。 図10は、テスト対象ロジックを特定する一例を示す説明図(その2)である。 図11は、テスト対象ロジックを特定する一例を示す説明図(その3)である。 図12は、テスト対象ロジックを特定する一例を示す説明図(その4)である。 図13は、テスト対象ロジックを特定する一例を示す説明図(その5)である。 図14は、カバレッジ情報を記録する一例を示す説明図(その1)である。 図15は、カバレッジ情報を記録する一例を示す説明図(その2)である。 図16は、カバレッジ情報を記録する一例を示す説明図(その3)である。 図17は、カバレッジ情報を記録する一例を示す説明図(その4)である。 図18は、カバレッジ情報を記録する一例を示す説明図(その5)である。 図19は、カバレッジ情報を記録する一例を示す説明図(その6)である。 図20は、ランキング表2200を生成する一例を示す説明図(その1)である。 図21は、ランキング表2200を生成する一例を示す説明図(その2)である。 図22は、ランキング表2200を生成する一例を示す説明図(その3)である。 図23は、全体処理手順の一例を示すフローチャートである。 図24は、特定処理手順の一例を示すフローチャートである。 図25は、記録処理手順の一例を示すフローチャートである。
以下に、図面を参照して、本発明にかかるテスト実行プログラム、テスト実行方法、およびテスト実行装置の実施の形態を詳細に説明する。
(実施の形態にかかるテスト実行方法の一実施例)
図1は、実施の形態にかかるテスト実行方法の一実施例を示す説明図である。テスト実行装置100は、バグ局所化を実現し、ソースコード内から、バグの原因となる箇所を絞り込み易くし、開発者の作業負担の低減化を図ることができるコンピュータである。テスト実行装置100は、例えば、サーバやPC(Personal Computer)などである。
従来では、バグ局所化を実現する際には、SBFLが用いられる傾向がある。SBFLは、ソースコード内のそれぞれの命令文に対応付けて、当該命令文の実行時に通知を出力する新たな命令文を、ソースコード内に書き込んでおく。SBFLは、ソースコード内の命令文群をテスト実行用に呼び出す複数のテスト実行コードを実行することにより、ソースコードに対し、複数のテストを実行する。テストは、ソースコードの処理内容の妥当性を判定することを目的とし、具体的には、ソースコード内のいずれかの命令文群の処理内容の妥当性を判定することを目的とする。テスト実行用とは、テストを実行し、処理内容の妥当性を判定するために、命令文群を呼び出すことを意味する。SBFLは、それぞれのテストの実行結果の妥当性を判定し、また、出力される通知に基づいて、それぞれのテストで実行されたソースコード内の命令文を記録したログ情報を生成する。
SBFLは、それぞれのテストの実行結果の妥当性と、それぞれのテストで実行されたソースコード内の命令文を記録したログ情報とに基づいて、命令文ごとに、バグの原因である可能性の高さを示す疑惑値を算出する。SBFLは、開発者が、算出された疑惑値を参照可能にし、または、算出された疑惑値が高い順に、ソースコード内の命令文を参照可能にし、バグの原因となる命令文を絞り込み易くする。また、所定の演算装置が、算出された疑惑値が高い順に、ソースコード内の命令文に対して、所定のルールによる自動変換を試行し、バグの原因となる命令文がなくなるか否かを検査することにより、バグの原因となる命令文を自動修正するようにしてもよい。
しかしながら、SBFLは、命令文ごとに、バグの原因である可能性の高さを示す疑惑値を算出するにあたり、ノイズとなる情報を除去することができないため、疑惑値を算出する精度が悪いという問題がある。例えば、テスト実行コードは、ソースコード内の命令文群をテスト実行用に呼び出す他に、テスト準備用またはテスト検証用などに呼び出す場合がある。テスト準備用とは、テストを実行する前準備を実施するために、命令文群を呼び出すことを意味する。前準備は、例えば、変数の設定や初期化などである。テスト検証用とは、テストを実行した後処理を実施するために、命令文群を呼び出すことを意味する。後処理は、例えば、テストの実行内容が妥当であるか否かを確認することである。このため、SBFLは、ログ情報に、テスト実行用に命令文群を呼び出したことに応じて実行された命令文と、テスト準備用またはテスト検証用などに命令文群を呼び出したことに応じて実行された命令文とを、識別不能に記録してしまう。従って、SBFLは、ログ情報から、ノイズとなる情報を除去することができない。
結果として、SBFLは、バグの原因となる命令文以外については、相対的に高い疑惑値を算出してしまい、バグの原因となる命令文については、相対的に低い疑惑値を算出してしまうことがある。例えば、バグの原因となる命令文の疑惑値が、上位から11番目になってしまう場合が考えられる。ここで、開発者が、疑惑値が高い順に命令文を検査するとすれば、バグの原因となる命令文を検査する前に、実際には検査不要な10つの命令文について検査しなければならず、作業負担の増大化を招く。具体的には、開発者が、1つの命令文を検査する際にかかる時間コストが10分であれば、バグの原因となる命令文の疑惑値が最上位になる場合に比べて、開発者の作業時間が100分増大することになる。
また、所定の演算装置が、疑惑値が高い順に、命令文に対して、所定のルールによる自動変換を試行するとすれば、バグの原因となる命令文に対して自動変換を試行する前に、バグの原因とならない10つの命令文に対しても自動変化を試行しなければならない。このため、所定の演算装置にかかる処理負担の増大化を招く。具体的には、所定の演算装置が、1つの命令文に対して自動変換を試行する際にかかる時間コストが60分であれば、バグの原因となる命令文の疑惑値が最上位になる場合に比べて、所定の演算装置の処理時間が600分増大することになる。
ここで、下記非特許文献1を参考に、テスト実行コードが、2以上のテストのそれぞれのテストに対応する命令文群を含む場合、疑惑値を算出する精度を向上すべく、テスト実行コードを分割するように、SBFLを改良した新たな手法1が考えられる。手法1により、分割後のそれぞれのテスト実行コード内で、ソースコード内の命令文群をテスト準備用またはテスト検証用などに呼び出す回数を削減し、疑惑値を算出する精度を向上することが期待される。
非特許文献1 : Xuan, Jifeng, and Martin Monperrus. “Test case purification for improving fault localization.” Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering. ACM, 2014.
しかしながら、手法1でも、生成されるログ情報から、ノイズとなる情報を除去することはできないため、疑惑値を算出する精度を向上することは難しい。例えば、手法1でも、分割後のそれぞれのテスト実行コード内で、ソースコード内の命令文群をテスト準備用またはテスト検証用などに呼び出すことを排除することはできず、生成されるログ情報から、ノイズとなる情報を除去することはできない。
また、下記非特許文献2を参考に、テスト対象クラスと、テスト実行クラスとの対応関係を特定し、対応関係を基に、クラス単位で、テスト対象であるか否かを区別し、バグ局所化の精度の向上を図るように、SBFLを改良した新たな手法2も考えられる。具体的には、手法2は、動的な依存解析と、クラス内のテキストの類似度、クラス名の類似度に基づいて、テスト対象クラスと、テスト実行クラスとの対応関係を特定する。そして、手法2は、命令文ごとに疑惑値を算出した後、テスト対象クラスではないクラスに関する命令文と疑惑値との組を削除することにより、ノイズと判断した命令文と疑惑値との組を削除し、バグ局所化の精度の向上を図る。
非特許文献2 : Qusef, Abdallah, et al. “Recovering test-to-code traceability using slicing and textual analysis.” Journal of Systems and Software 88 (2014): 147-168.
ここで、手法2では、クラス単位でしか、命令文と疑惑値との組がノイズであるか否かを判断することができず、命令文と疑惑値との組を除去することができない。このため、手法2では、例えば、ノイズとなる命令文と疑惑値との組を除去しきることが難しく、バグ局所化の精度を向上することは難しい。また、手法2は、動的な依存解析に相当するため、処理負担の増大化を招く。
また、下記非特許文献3を参考に、テスト対象メソッドと、テスト実行メソッドとの対応関係を特定し、対応関係を基に、メソッド単位で、テスト対象であるか否かを区別し、バグ局所化の精度の向上を図るように、SBFLを改良した新たな手法3も考えられる。具体的には、手法3は、静的な依存解析により、オブジェクトの状態変化を追跡し、テスト対象メソッドを特定することになる。この際、手法3は、テスト対象メソッドと、テスト実行メソッドとの1対1の対応関係を特定する。そして、手法3は、命令文ごとに疑惑値を算出した後、テスト対象メソッドではないメソッドに関する命令文と疑惑値との組を削除し、バグ局所化の精度の向上を図る。
非特許文献3 : Ghafari, Mohammad, Carlo Ghezzi, and Konstantin Rubinov. “Automatically identifying focal methods under test in unit test cases.” 2015 IEEE 15th International Working Conference on Source Code Analysis and Manipulation (SCAM). IEEE, 2015.
ここで、手法3は、1対1の対応関係しか特定することができないため、1つのテスト実行メソッドに対し、複数のテスト対象メソッドがある場合には適用することが難しい。このため、手法3は、ノイズとなる命令文と疑惑値との組を除去しきることが難しく、バグ局所化の精度を向上することは難しい。また、手法3は、オブジェクトの状態変化を伴わない場合には適用することができない。また、手法3は、静的な依存解析に相当し、オブジェクトの状態変化を正確に追跡することが難しい場合がある。
また、ソースコード内のいずれかの命令文群は、いずれかのテストにおけるテスト対象となっていなくても、他のテストにおけるテスト対象とはなっている場合がある。命令文群は、クラスやメソッドである。これに対し、手法2および手法3は、テストごとに、ソースコード内のいずれかの命令文群が、テスト対象であるか否かを区別することができない。このため、手法2および手法3は、ノイズとなる命令文と疑惑値との組を精度よく除去することができず、バグ局所化の精度を向上することは難しい。
また、テスト実行コード内で、ソースコード内の命令文群をテスト実行用に呼び出す箇所と、テスト準備用またはテスト検証用などに呼び出す箇所とを区別可能に、テスト実行コードを、人手で書き換える場合が考えられる。この場合、開発者にかかる作業負担の増大化を招いてしまう。
そこで、本実施の形態では、ソースコード内の命令文群を、テスト実行用に呼び出した場合であるか否かを区別しながら、実行された命令文を識別可能に記録することができるテスト実行方法について説明する。このテスト実行方法によれば、バグ局所化にあたりノイズとなる情報を切り分け可能にすることができる。
(1-1)テスト実行装置100は、テスト対象コード101と、テスト対象コード101に対するテストを実行するテスト実行コード102とを取得する。テスト対象コード101は、ソースコードである。テスト対象コード101は、例えば、Java言語により記述される。テスト対象コード101は、複数あってもよい。テスト実行コード102は、ソースコードである。テスト実行コード102は、例えば、Java言語により記述される。テスト実行コード102は、複数あってもよい。テスト実行装置100は、例えば、テスト対象コード101と、テスト実行コード102との入力を受け付けることにより、テスト対象コード101と、テスト実行コード102とを取得する。
(1-2)テスト実行装置100は、取得したテスト対象コード101と、取得したテスト実行コード102とをテキスト解析する。テスト実行装置100は、テキスト解析した結果に基づいて、テスト実行コード102内で、テスト対象コード101内の命令文群をテスト実行用に呼び出す呼出命令文を特定する。命令文群は、命令文の集まりであり、例えば、パッケージ、クラス、メソッドなどの単位の命令文の集まりである。命令文群は、数段の入れ子構造になり得る。例えば、パッケージ、クラス、メソッドは、入れ子構造になり、具体的には、パッケージは、1以上のクラスを含み、また、クラスは、1以上のメソッドを含む。
テスト実行装置100は、例えば、テスト対象コード101をテキスト解析し、テスト対象コード101内の数段の入れ子構造の命令文群のうち、それぞれの段の命令文群に付された名称を特定する。また、テスト実行装置100は、テスト実行コード102をテキスト解析し、テスト実行コード102内の数段の入れ子構造の命令文群のうち、それぞれの段の命令文群に付された名称を特定する。そして、テスト実行装置100は、特定した名称の類似度に基づいて、テスト実行コード102内で、テスト対象コード101内の命令文群をテスト実行用に呼び出す呼出命令文を特定する。図1の例では、テスト実行装置100は、命令文群G1を呼び出す呼出命令文C1と、命令文群G2を呼び出す呼出命令文C2とのうち、呼出命令文C1を特定する。
(1-3)テスト実行装置100は、テスト実行コード102を実行した結果、特定した呼出命令文によりテスト対象コード101内の命令文群が呼び出されたことに応じて実行された、テスト対象コード101内の命令文を識別可能にする情報を記録する。図1の例では、テスト実行装置100は、テスト実行コード102を実行した結果、特定した呼出命令文C1により命令文群G1がテスト実行用に呼び出されたことに応じて実行された、命令文群G1内の命令文を識別可能にする情報を記録する。
ここで、呼出命令文C2は、特定されておらず、呼出命令文C2により命令文群G2が呼び出されたことに応じて実行された、命令文群G2内の命令文を識別可能にする情報は、ノイズとなる情報であると判断される。具体的には、テスト実行用以外で実行された命令文は、開発者がテストにより処理内容を確認したい命令文ではないと判断されるため、テスト実行用以外で実行された命令文を識別可能にする情報は、ノイズとなる情報であると判断される。
このため、テスト実行装置100は、呼出命令文C2により命令文群G2が呼び出されたことに応じて実行された、命令文群G2内の命令文を識別可能にする情報については記録しなくてもよい。また、テスト実行装置100は、呼出命令文C2により命令文群G2が呼び出されたことに応じて実行された、命令文群G2内の命令文を識別可能にする情報を、ノイズとなる情報として記録してもよい。これにより、テスト実行装置100は、バグ局所化にあたりノイズとなる情報を切り分け可能にすることができる。
このため、テスト実行装置100は、バグ局所化にあたり有用な情報を、ノイズとなる情報と切り分けて、疑惑値を精度よく算出可能にすることができる。結果として、テスト実行装置100は、開発者が、精度よく算出した疑惑値を参照可能にすることができ、バグの原因となる箇所を絞り込み易くすることができ、開発者にかかる作業負担の低減化を図ることができる。また、テスト実行装置100は、精度よく算出した疑惑値に基づいて、バグの原因となる箇所を自動修正可能にすることができ、開発者にかかる作業負担の低減化を図ることができる。
また、テスト実行装置100は、クラス単位やメソッド単位の粒度ではなく、命令文単位の粒度で、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分けることができる。命令文単位の粒度は、例えば、行単位の粒度である。このため、テスト実行装置100は、ノイズとなる情報を精度よく除去可能にすることができ、疑惑値を精度よく算出可能にすることができる。
また、テスト実行装置100は、テキスト解析により、テスト実行コード102内で、テスト対象コード101内の命令文群をテスト実行用に呼び出す呼出命令文を特定するため、処理負担の増大化を抑制することができる。また、テスト実行装置100は、テスト実行コード102内で、テスト対象コード101内の命令文群をテスト実行用に呼び出す呼出命令文を特定するにあたり、命令文群と、呼出命令文とを多対多でも特定することができる。このため、テスト実行装置100は、バグ局所化にあたりノイズとなる情報を、精度よく切り分け可能にすることができる。また、テスト実行装置100は、オブジェクトの状態変化を伴わない場合にも適用することができる。
また、テスト実行装置100は、テスト対象コード101内のいずれかの命令文群が、いずれかのテストにおけるテスト対象とはなっていないが、他のテストにおけるテスト対象とはなっている場合などにも適用することができる。このため、テスト実行装置100は、バグ局所化にあたりノイズとなる情報を精度よく切り分け可能にすることができ、バグ局所化の利便性の向上を図ることができる。また、開発者は、人手で、テスト実行コード102内で、テスト対象コード101内の命令文群をテスト実行用に呼び出す箇所を判別可能にしなくてもよいため、作業負担の低減化を図ることができる。
ここでは、テスト対象コード101やテスト実行コード102が、Java言語により記述される場合について説明したが、これに限らない。例えば、テスト対象コード101やテスト実行コード102が、Java言語以外により記述される場合があってもよい。Java言語以外は、例えば、C言語である。
ここでは、テスト実行装置100が、テスト対象コード101と、テスト実行コード102との入力を受け付けることにより、テスト対象コード101と、テスト実行コード102とを取得する場合について説明したが、これに限らない。例えば、テスト実行装置100が、テスト対象コード101と、テスト実行コード102とを、他のコンピュータから受信することにより取得する場合があってもよい。この場合、テスト実行装置100と、他のコンピュータとを含むバグ発見システム200が形成される。
(バグ発見システム200の一例)
次に、図2を用いて、図1に示したテスト実行装置100を適用した、バグ発見システム200の一例について説明する。
図2は、バグ発見システム200の一例を示す説明図である。図2において、バグ発見システム200は、テスト実行装置100と、クライアント装置201とを含む。
バグ発見システム200において、テスト実行装置100とクライアント装置201は、有線または無線のネットワーク210を介して接続される。ネットワーク210は、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどである。
テスト実行装置100は、テスト対象コード101と、テスト実行コード102とを、クライアント装置201から受信する。テスト実行装置100は、受信したテスト対象コード101と、テスト実行コード102とをテキスト解析した結果に基づいて、テスト実行コード102内で、テスト対象コード101内の命令文群をテスト実行用に呼び出す呼出命令文を特定する。テスト実行装置100は、テスト実行コード102を実行した結果、特定した呼出命令文によりテスト対象コード101内の命令文群が呼び出されたことに応じて実行された、テスト対象コード101内の命令文を識別可能にする情報を記録する。
テスト実行装置100は、記録した情報に基づいて、テスト対象コード101内の命令文ごとに、バグの原因である可能性の高さを示す疑惑値を算出する。ここで、テスト実行装置100は、テスト実行コード102を実行した結果、実行されなかったテスト対象コード101内の命令文については、疑惑値を算出しなくてもよい。また、テスト実行装置100は、テスト実行コード102を実行した結果、特定した呼出命令文によりテスト対象コード101内の命令文群が呼び出されたことに応じて実行されなかったテスト対象コード101内の命令文についても、疑惑値を算出しなくてもよい。そして、テスト実行装置100は、算出した疑惑値が高い順に、テスト対象コード101内の命令文を識別する情報をソートする。テスト実行装置100は、ソートした結果を、クライアント装置201に送信する。
クライアント装置201は、開発者に用いられるコンピュータである。クライアント装置201は、テスト対象コード101と、テスト実行コード102とを、テスト実行装置100に送信する。クライアント装置201は、疑惑値が高い順に、テスト対象コード101内の命令文を識別する情報をソートした結果を、テスト実行装置100から受信して出力する。出力形式は、例えば、ディスプレイへの表示、プリンタへの印刷出力、他のコンピュータへの送信、または、記憶領域への記憶などである。クライアント装置201は、例えば、サーバやPC、スマートフォン、端末装置などである。これにより、クライアント装置201は、開発者が、バグの原因となる箇所を絞り込み易くすることができる。
ここでは、テスト実行装置100が、記録した情報に基づいて、命令文ごとの疑惑値を算出し、算出した疑惑値が高い順に、命令文を識別する情報をソートし、ソートした結果を、クライアント装置201に送信する場合について説明したが、これに限らない。例えば、テスト実行装置100が、記録した情報を、クライアント装置201に送信する場合があってもよい。この場合、クライアント装置201は、受信した情報に基づいて、命令文ごとの疑惑値を算出し、算出した疑惑値が高い順に、命令文を識別する情報をソートし、ソートした結果を出力する。
また、例えば、テスト実行装置100が、記録した情報に基づいて、命令文ごとの疑惑値を算出し、命令文ごとの疑惑値を、クライアント装置201に送信する場合があってもよい。この場合、クライアント装置201は、受信した疑惑値が高い順に、命令文を識別する情報をソートし、ソートした結果を出力する。
(テスト実行装置100のハードウェア構成例)
次に、図3を用いて、テスト実行装置100のハードウェア構成例について説明する。
図3は、テスト実行装置100のハードウェア構成例を示すブロック図である。図3において、テスト実行装置100は、CPU(Central Processing Unit)301と、メモリ302と、ネットワークI/F(Interface)303と、記録媒体I/F304と、記録媒体305とを有する。また、各構成部は、バス300によってそれぞれ接続される。
ここで、CPU301は、テスト実行装置100の全体の制御を司る。メモリ302は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU301のワークエリアとして使用される。メモリ302に記憶されるプログラムは、CPU301にロードされることで、コーディングされている処理をCPU301に実行させる。
ネットワークI/F303は、通信回線を通じてネットワーク210に接続され、ネットワーク210を介して他のコンピュータに接続される。そして、ネットワークI/F303は、ネットワーク210と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。ネットワークI/F303は、例えば、モデムやLANアダプタなどである。
記録媒体I/F304は、CPU301の制御に従って記録媒体305に対するデータのリード/ライトを制御する。記録媒体I/F304は、例えば、ディスクドライブ、SSD(Solid State Drive)、USB(Universal Serial Bus)ポートなどである。記録媒体305は、記録媒体I/F304の制御で書き込まれたデータを記憶する不揮発メモリである。記録媒体305は、例えば、ディスク、半導体メモリ、USBメモリなどである。記録媒体305は、テスト実行装置100から着脱可能であってもよい。
テスト実行装置100は、上述した構成部のほか、例えば、キーボード、マウス、ディスプレイ、プリンタ、スキャナ、マイク、スピーカーなどを有してもよい。また、テスト実行装置100は、記録媒体I/F304や記録媒体305を複数有していてもよい。また、テスト実行装置100は、記録媒体I/F304や記録媒体305を有していなくてもよい。
(クライアント装置201のハードウェア構成例)
クライアント装置201のハードウェア構成例は、図3に示した、テスト実行装置100のハードウェア構成例と同様であるため、説明を省略する。
(テスト実行装置100の機能的構成例)
次に、図4を用いて、テスト実行装置100の機能的構成例について説明する。
図4は、テスト実行装置100の機能的構成例を示すブロック図である。テスト実行装置100は、記憶部400と、取得部401と、特定部402と、記録部403と、解析部404と、出力部405とを含む。
記憶部400は、例えば、図3に示したメモリ302や記録媒体305などの記憶領域によって実現される。以下では、記憶部400が、テスト実行装置100に含まれる場合について説明するが、これに限らない。例えば、記憶部400が、テスト実行装置100とは異なる装置に含まれ、記憶部400の記憶内容がテスト実行装置100から参照可能である場合があってもよい。
取得部401~出力部405は、制御部の一例として機能する。取得部401~出力部405は、具体的には、例えば、図3に示したメモリ302や記録媒体305などの記憶領域に記憶されたプログラムをCPU301に実行させることにより、または、ネットワークI/F303により、その機能を実現する。各機能部の処理結果は、例えば、図3に示したメモリ302や記録媒体305などの記憶領域に記憶される。
記憶部400は、各機能部の処理において参照され、または更新される各種情報を記憶する。記憶部400は、例えば、1以上のテスト対象コードを記憶する。テスト対象コードは、ソースコードである。テスト対象コードは、例えば、Java言語により記述される。テスト対象コードは、Java言語以外により記述される場合があってもよい。Java言語以外は、例えば、C言語である。テスト対象コードは、命令文群を含む。命令文群は、パッケージ、クラス、メソッドなどである。テスト対象コード内で、命令文群は、数段の入れ子構造になり得る。
記憶部400は、例えば、1以上のテスト実行コードを記憶する。テスト実行コードは、ソースコードである。テスト実行コードは、テスト対象コードに対するテストを実行することを、処理内容として規定するソースコードである。テスト実行コードは、例えば、Java言語により記述される。テスト実行コードは、Java言語以外により記述される場合があってもよい。Java言語以外は、例えば、C言語である。テスト実行コードは、命令文群を含む。命令文群は、パッケージ、クラス、メソッドなどである。テスト実行コード内で、命令文群は、数段の入れ子構造になり得る。テスト実行コードは、複数ある場合、テスト対象コードに対し、互いに種類が異なるテストを実行することが好ましい。
取得部401は、各機能部の処理に用いられる各種情報を取得する。取得部401は、取得した各種情報を、記憶部400に記憶し、または、各機能部に出力する。また、取得部401は、記憶部400に記憶しておいた各種情報を、各機能部に出力してもよい。取得部401は、例えば、ユーザの操作入力に基づき、各種情報を取得する。ユーザは、例えば、開発者である。取得部401は、例えば、テスト実行装置100とは異なる装置から、各種情報を受信してもよい。
取得部401は、例えば、テスト対象コードと、テスト実行コードとを取得する。取得部401は、例えば、ユーザの操作入力に基づき、テスト対象コードと、テスト実行コードとの入力を受け付けることにより、テスト対象コードと、テスト実行コードとを取得する。取得部401は、例えば、テスト対象コードと、テスト実行コードとを、着脱可能な記録媒体305から読み出すことにより取得する場合があってもよい。取得部401は、例えば、テスト対象コードと、テスト実行コードとを、他のコンピュータから受信することにより取得する場合があってもよい。他のコンピュータは、例えば、クライアント装置201である。取得部401は、テスト対象コードに対し、互いに種類が異なるテストを実行する複数のテスト実行コードを取得してもよい。
取得部401は、いずれかの機能部の処理を開始する開始トリガーを受け付けてもよい。開始トリガーは、例えば、ユーザによる所定の操作入力があったことである。開始トリガーは、例えば、他のコンピュータから、所定の情報を受信したことであってもよい。開始トリガーは、例えば、いずれかの機能部が所定の情報を出力したことであってもよい。取得部401は、例えば、テスト対象コードと、テスト実行コードとを取得したことを、特定部402~出力部405の処理を開始する開始トリガーとして受け付ける。
特定部402は、取得したテスト実行コード内で、取得したテスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する。特定部402は、例えば、テスト対象コードと、テスト実行コードとをテキスト解析した結果に基づいて、テスト実行コード内で、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する。
特定部402は、具体的には、テスト実行コード内で、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出する。特定部402は、テスト実行コード内で、検出した候補が記述されたメソッドに対応する名称と、テスト対象コード内で、検出した候補により呼び出される命令文群が記述されたメソッドに対応する名称との第1の類似度を算出する。特定部402は、算出した第1の類似度に基づいて、検出した候補の中から、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する。
特定部402は、より具体的には、検出した候補のうち、第1の類似度が第1の閾値以上である候補を、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文として特定する。テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文の特定に、第1の類似度を用いる具体例は、図9を用いて後述する。これにより、特定部402は、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分ける指標となる情報を得ることができる。
特定部402は、具体的には、テスト実行コード内で、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出する。特定部402は、テスト実行コード内で、検出した候補が記述されたクラスに対応する名称と、テスト対象コード内で、検出した候補により呼び出される命令文群が記述されたクラスに対応する名称との第2の類似度を算出する。特定部402は、算出した第2の類似度に基づいて、検出した候補の中から、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する。
特定部402は、より具体的には、検出した候補のうち、第2の類似度が第2の閾値以上である候補を、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文として特定する。テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文の特定に、第2の類似度を用いる具体例は、図10を用いて後述する。これにより、特定部402は、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分ける指標となる情報を得ることができる。
特定部402は、具体的には、テスト実行コード内で、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出する。特定部402は、テスト実行コード内で、検出した候補が記述されたパッケージに対応するアドレスと、テスト対象コード内で、検出した候補により呼び出される命令文群が記述されたパッケージに対応するアドレスとの近似度を算出する。特定部402は、算出した近似度に基づいて、検出した候補の中から、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する。
特定部402は、より具体的には、検出した候補のうち、近似度が第3の閾値以上である候補を、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文として特定する。テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文の特定に、近似度を用いる具体例は、図11を用いて後述する。これにより、特定部402は、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分ける指標となる情報を得ることができる。
特定部402は、具体的には、第1の類似度と、第2の類似度と、近似度とのうち、少なくとも2つ以上の組み合わせに基づいて、検出した候補の中から、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する場合があってもよい。この場合、特定部402は、検出した候補のうち、第1の類似度が第1の閾値以上であり、第2の類似度が第2の閾値以上であり、かつ、近似度が第3の閾値以上である候補を、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文として特定する。これにより、特定部402は、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分ける指標となる情報を得ることができる。
特定部402は、テスト実行コードが複数ある場合、テスト実行コードごとに、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定してもよい。
記録部403は、テスト実行コードを実行する。記録部403は、テスト実行コードを実行した結果、特定した呼出命令文によりテスト対象コード内の命令文群が呼び出されたことに応じて実行された、テスト対象コード内の命令文を識別可能にする第1の情報を記録する。記録部403は、例えば、特定した呼出命令文によりテスト対象コード内の命令文群が呼び出されたことに応じて実行された、テスト対象コード内の命令文を識別する情報を、有用を示すフラグと対応付けた第1の情報を記録する。これにより、記録部403は、バグ局所化にあたり有用な情報を、第1の情報として記録し、利用可能にすることができ、ノイズとなる情報と切り分けることができる。
記録部403は、テスト実行コードを実行した結果、特定した呼出命令文以外によりテスト対象コード内の命令文群が呼び出されたことに応じて実行された、テスト対象コード内の命令文を識別可能にする第2の情報を記録する。記録部403は、例えば、特定した呼出命令文以外によりテスト対象コード内の命令文群が呼び出されたことに応じて実行された、テスト対象コード内の命令文を識別する情報を、ノイズを示すフラグと対応付けた第2の情報を記録する。これにより、記録部403は、バグ局所化にあたりノイズとなる情報を、第2の情報として記録し、利用可能にすることができる。
第2の情報は、特定した呼出命令文により命令文群が呼び出されたことに応じては実行されず、かつ、特定した呼出命令文以外により命令文群が呼び出されたことに応じて実行された、テスト対象コード内の命令文を識別可能にしてもよい。これにより、記録部403は、第1の情報と、第2の情報との重複を回避することができる。
記録部403は、具体的には、テスト対象コード内に、テスト対象コード内のそれぞれの命令文に対応付けて、当該命令文が実行されたことに応じて、当該命令文を識別する情報を含む第1の通知を出力する第1の命令文を書き込む。記録部403は、テスト実行コード内に、特定した呼出命令文に対応付けて、特定した呼出命令文が実行される直前に、特定した呼出命令文を識別する情報を含む第2の通知を出力する第2の命令文を書き込む。記録部403は、テスト実行コード内に、特定した呼出命令文に対応付けて、特定した呼出命令文が実行された直後に、特定した呼出命令文を識別する情報を含む第3の通知を出力する第3の命令文を書き込む。
記録部403は、テスト実行コードを実行した結果、出力された第1の通知と、出力された第2の通知と、出力された第3の通知とに基づいて、第1の情報を記録する。記録部403は、テスト実行コードを実行した結果、出力された第1の通知と、出力された第2の通知と、出力された第3の通知とに基づいて、第2の情報を記録する。これにより、記録部403は、バグ局所化にあたり有用な情報を、第1の情報として記録し、利用可能にすることができ、ノイズとなる情報と切り分けることができる。また、記録部403は、バグ局所化にあたりノイズとなる情報を、第2の情報として記録し、利用可能にすることができる。
記録部403は、テスト実行コードが複数ある場合、テスト実行コードごとに、第1の情報と第2の情報とのうち、少なくとも第1の情報を記録してもよい。
解析部404は、テストの実行結果の妥当性を判定する。解析部404は、判定した妥当性と、記録した第1の情報とに基づいて、テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す第1の疑惑値を算出する。解析部404は、テスト対象コード内のそれぞれの命令文に対応付けて、算出した第1の疑惑値を記録する。これにより、解析部404は、バグ局所化を実現し、開発者が、バグとなる箇所を絞り込み易くすることができる。
解析部404は、算出した第1の疑惑値に基づいて、テスト対象コード内のそれぞれの命令文を識別する情報をソートしてもよい。これにより、解析部404は、バグ局所化を実現し、開発者が、バグとなる箇所を絞り込み易くすることができる。
解析部404は、テストの実行結果の妥当性を判定する。解析部404は、判定した妥当性と、記録した第1の情報とに基づいて、テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す第1の疑惑値を算出する。解析部404は、判定した妥当性と、記録した第1の情報と、記録した第2の情報とに基づいて、テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す第2の疑惑値を算出する。解析部404は、テスト対象コード内のそれぞれの命令文に対応付けて、算出した第1の疑惑値と、算出した第2の疑惑値とを記録する。これにより、解析部404は、バグ局所化を実現し、開発者が、バグとなる箇所を絞り込み易くすることができる。
解析部404は、算出した第1の疑惑値と、算出した第2の疑惑値とに基づいて、テスト対象コード内のそれぞれの命令文を識別する情報をソートしてもよい。これにより、解析部404は、バグ局所化を実現し、開発者が、バグとなる箇所を絞り込み易くすることができる。
出力部405は、いずれかの機能部の処理結果を出力する。出力形式は、例えば、ディスプレイへの表示、プリンタへの印刷出力、ネットワークI/F303による外部装置への送信、または、メモリ302や記録媒体305などの記憶領域への記憶である。これにより、出力部405は、いずれかの機能部の処理結果を利用者に通知可能にし、テスト実行装置100の利便性の向上を図ることができる。
出力部405は、例えば、テスト対象コード内のそれぞれの命令文に対応付けて、算出した第1の疑惑値を出力する。これにより、出力部405は、第1の疑惑値を、開発者が参照可能にすることができる。出力部405は、算出した第1の疑惑値に基づいて、テスト対象コード内のそれぞれの命令文を識別する情報をソートした結果を出力する。これにより、出力部405は、ソートした結果を、開発者が参照可能にすることができる。
出力部405は、テスト対象コード内のそれぞれの命令文に対応付けて、算出した第2の疑惑値を出力する。これにより、出力部405は、第1の疑惑値と、第2の疑惑値とを、開発者が参照可能にすることができる。解析部404は、算出した第1の疑惑値と、算出した第2の疑惑値とに基づいて、テスト対象コード内のそれぞれの命令文を識別する情報をソートした結果を出力する。これにより、出力部405は、ソートした結果を、開発者が参照可能にすることができる。
(テスト実行装置100の具体的な機能的構成例)
次に、図5を用いて、テスト実行装置100の具体的な機能的構成例について説明する。
図5は、テスト実行装置100の具体的な機能的構成例を示すブロック図である。テスト実行装置100は、本体プログラム501と、テストプログラム502とを有する。図中のPRGは、プログラムを意味する。テスト実行装置100は、ロギング命令埋込部511と、テスト対象ロジック特定部521と、ロギング制御命令埋込部531と、テスト実行&カバレッジ記録部541と、疑惑値算出部551とを含む。
ロギング命令埋込部511は、本体プログラム501を取得する。ロギング命令埋込部511は、本体プログラム501内のそれぞれの命令文に対応付けて、本体プログラム501内にロギング命令を埋め込み、ロギング命令が埋め込まれた本体プログラム512を出力する。ロギング命令は、本体プログラム501内の命令文に対応付けられ、本体プログラム501内の当該命令文が実行されたことに応じて、本体プログラム501内の当該命令文が実行されたことの通知を出力する処理内容を規定する。
テスト対象ロジック特定部521は、本体プログラム501と、テストプログラム502とを取得する。テスト対象ロジック特定部521は、本体プログラム501と、テストプログラム502とに基づいて、テスト対象ロジックを特定し、テスト対象ロジック特定結果522を出力する。テスト対象ロジックは、本体プログラム501内のクラスやメソッドなどの命令文群を呼び出して実行する、テストプログラム502内の箇所である。テスト対象ロジックは、命令文群をテスト実行用に呼び出す呼出命令文に対応する。以下の説明では、テストプログラム502内の、テスト対象ロジック以外の箇所を、「テスト対象外ロジック」と表記する場合がある。
ロギング制御命令埋込部531は、テスト対象ロジック特定結果522に基づいて、テストプログラム502内のそれぞれのテスト対象ロジックに対応付けて、テストプログラム502内にロギング制御命令を埋め込む。ロギング制御命令は、ロギング命令を制御する処理内容を規定する。ロギング制御命令は、例えば、本体プログラム512内の命令文が、テスト対象ロジックとして実行されたか、または、テスト対象外ロジックとして実行されたかを区別し、ロギング命令が通知を出力するように制御する処理内容を規定する。ロギング制御命令埋込部531は、ロギング制御命令が埋め込まれたテストプログラム532を出力する。
テスト実行&カバレッジ記録部541は、テストプログラム532を実行し、外部制御機能付きのカバレッジ記録ロガープログラム540により、カバレッジ情報542を記録する。カバレッジ情報542は、テスト成否&テスト対象ロジック・テスト対象外ロジックを区別可能に、テストにおいて実行された命令文を記録する。テスト成否とは、テスト実行結果が妥当であるか否かを意味する。疑惑値算出部551は、カバレッジ情報542に基づいて、テスト対象ロジック・テスト対象外ロジックを区別し、命令文ごとの疑惑値を算出し、疑惑行ランキング表552を出力する。疑惑行ランキング表552は、疑惑値の高い順に、命令文となる本体プログラム512の行をソートし、当該命令文の疑惑値を対応付けて示した表である。
(テスト実行装置100の動作の流れ)
次に、図6および図7を用いて、テスト実行装置100の動作の流れについて説明する。まず、図6を用いて、テスト実行装置100が、テストプログラム内のテスト対象ロジックを特定する流れについて説明する。
図6は、テスト対象ロジックを特定する流れを示す説明図である。図6において、テスト実行装置100は、テストプログラム601と、本体プログラム602とを取得する。
テストプログラム601は、オブジェクト指向言語により記述され、例えば、Java言語により記述される。例えば、テストプログラム601は、1以上のパッケージにより形成され、パッケージは、1以上のクラスにより形成され、クラスは、1以上のメソッドにより形成される。
本体プログラム602は、オブジェクト指向言語により記述され、例えば、Java言語により記述される。例えば、本体プログラム602は、1以上のパッケージにより形成され、パッケージは、1以上のクラスにより形成され、クラスは、1以上のメソッドにより形成される。
テスト実行装置100は、テストプログラム601と、本体プログラム602とをテキスト解析し、メソッド名の類似性と、クラス名の類似性と、パッケージ位置の近似性とに基づいて、テスト対象ロジックを特定する。
ここで、例えば、開発者は、テストプログラム601を開発する際、可読性や開発規則などを考慮し、テストプログラム601内のメソッドに付与するメソッド名を決定する傾向がある。以下の説明では、上記傾向を「第1の傾向」と表記する場合がある。
具体的には、開発者は、テストを実行するテストプログラム601内のメソッドには、当該テストにより確認したい内容を表現する名称を付与する傾向がある。また、具体的には、開発者は、本体プログラム602内の第1のメソッドに対し、テストを実行するように記述したテストプログラム601内の第2のメソッドには、当該第1のメソッドと比較的類似したメソッド名を付与する傾向がある。より具体的には、開発者は、第1のメソッドが、メソッド名「Add」であれば、第2のメソッドには、「TestAdd」のようなメソッド名を付与する傾向がある。
同様に、例えば、開発者は、テストプログラム601を開発する際、可読性や開発規則などを考慮し、テストプログラム601内のクラスに付与するクラス名を決定する傾向がある。以下の説明では、上記傾向を「第2の傾向」と表記する場合がある。
具体的には、開発者は、テストプログラム601内のクラスには、テストにより確認したい内容を表現する名称を付与する傾向がある。また、具体的には、開発者は、本体プログラム602内の第1のクラスに対し、テストを実行するように記述したテストプログラム601内の第2のクラスには、当該第1のクラスと比較的類似したクラス名を付与する傾向がある。より具体的には、開発者は、第1のクラスが、クラス名「Add」であれば、第2のクラスには、「TestAdd」のようなクラス名を付与する傾向がある。
また、例えば、開発者は、テストプログラム601を開発する際、可読性や開発規則などを考慮し、パッケージを論理的に意味がある単位で区切っており、テストプログラム601のパッケージが存在するパッケージ位置を決定する傾向がある。以下の説明では、上記傾向を「第3の傾向」と表記する場合がある。パッケージ位置は、例えば、コンピュータ内の記憶領域のアドレスである。具体的には、開発者は、本体プログラム602内の第1のパッケージに対し、テストを実行するように記述したテストプログラム601内の第2のパッケージを、当該第1のパッケージと比較的近似したパッケージ位置に配置する傾向がある。
テスト実行装置100は、例えば、第1の傾向と、第2の傾向と、第3の傾向とを考慮し、メソッド名の類似性と、クラス名の類似性と、パッケージ位置の近似性とに基づいて、テスト対象ロジックを特定する。
テスト実行装置100は、具体的には、テストプログラム601内で、本体プログラム602内の命令文群を呼び出すテスト対象ロジックの候補を検出する。次に、テスト実行装置100は、検出した候補のうち、呼び出す命令文群との間で、メソッド名に関する第1の類似度が、第1の閾値以上である候補を抽出する。第1の類似度は、例えば、候補を含むメソッドに対応するメソッド名と、呼び出す命令文群を含むメソッドに対応するメソッド名とのJaccard係数値である。
また、テスト実行装置100は、抽出した候補のうち、呼び出す命令文群との間で、クラス名に関する第2の類似度が、第2の閾値以上である候補をさらに抽出する。第2の類似度は、例えば、候補を含むクラスに対応するクラス名と、呼び出す命令文群を含むクラスに対応するクラス名とのJaccard係数値である。
候補を含むクラスに対応するクラス名とは、候補を含むクラスに付与されたクラス名の他、候補を含むクラスの祖先または子孫であるクラスに付与されたクラス名などを用いてもよい。呼び出す命令文群を含むクラスに対応するクラス名とは、呼び出す命令文群を含むクラスに付与されたクラス名の他、呼び出す命令文群を含むクラスの祖先または子孫であるクラスに付与されたクラス名などを用いてもよい。
また、テスト実行装置100は、抽出した候補のうち、呼び出す命令文群との間で、パッケージ位置に関する近似度が、第3の閾値以上である候補をさらに抽出する。近似度は、例えば、候補を含むパッケージに対応するパッケージ位置と、呼び出す命令文群を含むパッケージに対応するパッケージ位置との近さを表す。
呼び出す命令文群を含むパッケージに対応するパッケージ位置とは、呼び出す命令文群を含むパッケージが存在するパッケージ位置の他、呼び出す命令文群を含むクラスの祖先クラスまたは子孫クラスを含むパッケージが存在するパッケージ位置などを用いてもよい。
テスト実行装置100は、抽出した候補を、テスト対象ロジックに決定する。図6の例では、テスト実行装置100は、testAdd()やtestGetFromEmptyListなどを、テスト対象ロジックに決定する。次に、図7を用いて、テスト実行装置100が、カバレッジ情報を記録する流れについて説明する。
図7は、カバレッジ情報を記録する流れを示す説明図である。図7において、テスト実行装置100は、ロガー700を有する。ロガー700は、ロギング命令により出力された通知に基づいて、カバレッジ情報を記録するプログラムである。カバレッジ情報は、いずれのテストの実行時に、いずれの命令文が実行されたかを、識別可能に記録する。
ここで、テスト実行装置100は、テスト対象ロジックを区別し、テスト対象ロジックの開始と、テスト対象ロジックの終了とを、ロガー700に通知し、通知に応じて、ロガー700にカバレッジ情報を記録する記録方法を切り替えさせる。ここで、ロガー700は、テスト対象ロジックの開始の通知から、テスト対象ロジックの終了の通知までの間、ロギング命令により出力された通知を、テスト対象ロジックとして実行された命令文に関する通知であり、有用であるとして、カバレッジ情報に記録する。
一方で、ロガー700は、テスト対象ロジックの開始の通知を受ける前、ロギング命令により出力された通知を、テスト対象外ロジックとして実行された命令文に関する通知であり、バグ局所化にあたりノイズであるとして、カバレッジ情報に記録する。また、ロガー700は、テスト対象ロジックの終了の通知を受けた後、ロギング命令により出力された通知を、テスト対象外ロジックとして実行された命令文に関する通知であり、バグ局所化にあたりノイズであるとして、カバレッジ情報に記録する。
これにより、テスト実行装置100は、テスト対象ロジック内で実行された命令文と、テスト対象外ロジック内で実行された命令文とを区別しながら、カバレッジ情報を記録することができる。このため、テスト実行装置100は、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分けてカバレッジ情報を記録することができ、疑惑値を算出する精度を向上可能にすることができる。結果として、テスト実行装置100は、開発者が、バグの原因となる命令文を絞り込み易くすることができる。
(テスト実行装置100の動作の一例)
次に、図8~図22を用いて、テスト実行装置100の動作の一例について説明する。まず、図8を用いて、本体プログラム810とテストプログラム800との一例について説明する。
図8は、本体プログラム810とテストプログラム800との一例を示す説明図である。図8において、テストプログラム800は、オブジェクト指向言語により記述され、例えば、Java言語により記述される。テストプログラム800は、1以上のパッケージにより形成され、パッケージは、1以上のクラスにより形成され、クラスは、1以上のメソッドにより形成される。
テストプログラム800は、例えば、本体プログラム810内の命令文群811,812などを、テスト実行用に、または、テスト準備用やテスト検証用などに呼び出す。命令文群811,812などは、さらに、本体プログラム810内の命令文群813などを呼び出してもよい。本体プログラム810は、オブジェクト指向言語により記述され、例えば、Java言語により記述される。本体プログラム810は、1以上のパッケージにより形成され、パッケージは、1以上のクラスにより形成され、クラスは、1以上のメソッドにより形成される。
図8の例では、「test」を接頭辞とするメソッド1つが、テスト1つに対応する。他のメソッドは、例えば、処理共通化のための補助メソッドである。また、図8の例では、テストプログラム800内の太字部分が、テストプログラム800内のテスト対象ロジックに対応する。具体的には、メソッド「ListTest#testAddAndGet」内のテスト対象ロジックは、「IList#add」と「IList#get」と「IList#getFirst」の3つである。
また、図8の例では、テストプログラム800で呼び出されているメソッドは、createList()とassertEqual()と以外、本体プログラム810内に定義されている。例えば、info()とgetVal()とcreate()となどは、本体プログラム810内に定義されている。createList()は、処理共通化のための補助メソッドであり、テストプログラム800内に定義され、具体的には、ListTest内に定義されているとする。「assert」を接頭辞とするメソッドは、値の検証のための補助メソッドであり、テストプログラム800内に定義され、具体的には、ListTest以外のクラス内に定義されているとする。
以下の説明で、「sss.ttt.uuu.AAA#xxx」との表記がある場合、sss.ttt.uuuが、パッケージ名を表し、AAAが、クラス名を表し、xxxが、メソッド名を表す。また、「AAA:nnL」との表記がある場合、AAAが、クラス名を表し、nnが、行数を表す。
次に、図9~図13を用いて、テスト実行装置100が、テスト対象ロジックを特定する一例について説明する。具体的には、テスト実行装置100が、テスト対象ロジックとして、「IList#add」と「IList#get」と「IList#getFirst」の3つを特定する一例について説明する。以下の説明では、主に、メソッド「ListTest#testAddAndGet」を一例として説明する。
図9~図13は、テスト対象ロジックを特定する一例を示す説明図である。図9において、テスト実行装置100は、テスト対象ロジックの候補を抽出する。テスト実行装置100は、例えば、テストプログラム800内のテストメソッドごとに、呼出関係を解析する。そして、テスト実行装置100は、解析した結果に基づいて、テストプログラム800内に記述され、テストプログラム800から呼び出されている本体プログラム810内のメソッドを、テスト対象ロジックの候補として抽出する。
ここで、createList、および、assertを接頭辞とするメソッドは、テストプログラム800内に定義されており、抽出されない。また、テストメソッド「testAddAndGet」から直接呼び出されているメソッド以外に、createListなどの非公開メソッドを辿って呼び出されるメソッドも、候補として抽出される。テスト実行装置100は、抽出した候補を、表900を用いて記憶する。次に、図10の説明に移行する。
図10において、テスト実行装置100は、表900のそれぞれの候補について、テストメソッドとのメソッド名に関する第1の類似度を算出する。表900のそれぞれの候補の左に記載した括弧内の数字は、算出された第1の類似度である。テスト実行装置100は、表900の候補のうち、算出した第1の類似度が閾値Tms以上である候補を抽出し、表1000を用いて記憶する。
テスト実行装置100は、例えば、メソッド名を形成する単語集合に対し、Jaccard係数値を算出し、第1の類似度に設定する。この際、テスト実行装置100は、メソッド名の先頭または末尾の「test」の単語を除去して、第1の類似度を算出してもよい。
図10の例では、テスト実行装置100は、「testAddAndGet」を形成する単語集合T1={add,and,get}と、「getFirst」を形成する単語集合T2={get,first}とを特定する。そして、テスト実行装置100は、「testAddAndGet」と「getFirst」の第1の類似度として、J(T1,T2)=|T1∩T2|/|T1∪T2|=(1/4)を算出する。次に、図11の説明に移行する。
図11において、テスト実行装置100は、表1000のそれぞれの候補について、テストクラスとのクラス名に関する第2の類似度を算出する。表1000のそれぞれの候補の左に記載した括弧内の数字は、算出された第2の類似度である。テスト実行装置100は、表1000の候補のうち、算出した第2の類似度が閾値Tcs以上である候補を抽出し、表1100を用いて記憶する。
テスト実行装置100は、例えば、クラス名を形成する単語集合に対し、Jaccard係数値を算出し、第2の類似度に設定する。この際、テスト実行装置100は、テストクラス「XXX」と、候補を含むクラス「AAA」との第2の類似度として、「AAA」の祖先クラスおよび子孫クラスのそれぞれの、「XXX」とのクラス名に関する類似度のうち、最大の類似度を採用してもよい。この際、テスト実行装置100は、クラス名の先頭または末尾の「test」の単語を除去して、第2の類似度を算出してもよい。
図11の例では、テスト実行装置100は、候補を直接含むクラス「IList」と、テストクラス「ListTest」との類似度(1/2)を算出する。また、テスト実行装置100は、候補を直接含むクラス「IList」の祖先クラスおよび子孫クラスとして、「ICollection」、「List」、「LinkedList」などを特定する。テスト実行装置100は、特定した「ICollection」、「List」、「LinkedList」などと、テストクラス「ListTest」との類似度(0)、(1)、(1/2)などを算出する。そして、テスト実行装置100は、第2の類似度として(1)を採用する。次に、図12の説明に移行する。
図12において、テスト実行装置100は、表1100のそれぞれの候補について、パッケージ位置に関する近似度を算出する。パッケージ位置は、例えば、階層構造である。表1100のそれぞれの候補の左に記載した括弧内の数字は、算出された近似度である。テスト実行装置100は、表1100の候補のうち、算出した近似度が閾値Tpn以上である候補を抽出し、表1200を用いて記憶する。
ここで、階層構造をディレクトリ構造として扱い、パッケージP1からパッケージP2へと移動するためのディレクトリ移動回数をdとする。テスト実行装置100は、例えば、パッケージP1とパッケージP2との近似度として、N(P1,P2)=1/(1+d)を算出する。テスト実行装置100は、具体的には、パッケージ「xxx.yyy」とパッケージ「xxx.aaa.bbb」との近似度を算出する際、「/xxx/yyy」と「/xxx/aaa/bbb」とのディレクトリ移動回数d=3を算出し、近似度1/4を算出する。
図12の例では、テスト実行装置100は、候補を直接含むパッケージ「xxx.util.list.IList」と、テストクラスを含むパッケージ「xxx.util.list.impl.ListTest」との近似度(1/2)を算出する。
また、テスト実行装置100は、候補を直接含むクラスの祖先クラスおよび子孫クラスを含むパッケージを特定する。祖先クラスおよび子孫クラスは、例えば、「xxx.util.ICollection」、「xxx.util.list.impl.List」、「xxx.util.list.impl.LinkedList」などである。テスト実行装置100は、特定したパッケージと、テストクラスを含むパッケージ「xxx.util.list.impl.ListTest」との近似度(1/3)、(1)、(1)などを算出する。そして、テスト実行装置100は、近似度として(1)を採用する。次に、図13の説明に移行する。
図13において、テスト実行装置100は、それぞれのテストメソッドに対し、近似度が閾値Tpn以上として抽出された候補を、テスト対象ロジックとして、表1300を用いて記憶する。次に、図14~図19を用いて、テスト実行装置100が、カバレッジ情報を記録する一例について説明する。具体的には、テスト実行装置100が、テスト対象ロジックに応じて命令文を実行中であるか否かを区別し、カバレッジ情報を記録する一例について説明する。
図14~図19は、カバレッジ情報を記録する一例を示す説明図である。図14において、テスト実行装置100は、テストプログラム800内に、ロギング制御命令を埋め込む。図14の例では、テストプログラム800内の太字部分が、埋め込んだロギング制御命令である。以下の説明では、埋込後のテストプログラム800を「テストプログラム1400」と表記する場合がある。
Logger.testStart(“テストメソッド名”)は、テストメソッド名と共に、テストの開始の通知をロガーに出力することを規定する。Logger.testEnd(“テストメソッド名”)は、テストメソッド名と共に、テストの終了の通知をロガーに出力することを規定する。
Logger.LogicStart(“テストメソッド名”)は、テストメソッド名と共に、テスト対象ロジックの開始の通知をロガーに出力することを規定する。テスト対象ロジックが、複数のテストで用いられる場合、括弧内の“テストメソッド名”は、複数あってもよい。Logger.LogicEnd(“テストメソッド名”)は、テストメソッド名と共に、テスト対象ロジックの終了の通知をロガーに出力することを規定する。テスト対象ロジックが、複数のテストで用いられる場合、括弧内の“テストメソッド名”は、複数あってもよい。
これにより、テスト実行装置100は、ロガーが、テスト対象ロジックが実行中であるか否かを把握可能にすることができ、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分ける基準を取得可能にすることができる。次に、図15の説明に移行する。
図15において、テスト実行装置100は、本体プログラム810内に、ロギング命令を埋め込む。図15の例では、本体プログラム810内の太字部分が、埋め込んだロギング命令である。Logger.Log(“クラス名:行数”)は、クラス名と共に、本体プログラム810内の当該クラス名のクラス内にあり、テストにおいて実行された命令文を示す行数の通知をロガーに出力することを規定する。以下の説明では、埋込後の本体プログラム810を「本体プログラム1500」と表記する場合がある。
これにより、テスト実行装置100は、ロガーが、テストの実行時に、本体プログラム1500内のいずれのクラス内のいずれの命令文が実行されたかを把握可能にすることができ、バグ局所化のためのカバレッジ情報を収集可能にすることができる。
以上より、ロガーは、テスト対象ロジックとして本体プログラム1500内の命令文が実行されたのか、または、テスト対象外ロジックとして本体プログラム1500内の命令文が実行されたのかを区別して、カバレッジ情報を記録可能になる。次に、図16の説明に移行する。
図16において、テスト実行装置100は、ロギング制御命令を埋め込んだテストプログラム1400を実行する。テスト実行装置100は、テストプログラム1400の実行時、ロガーにより、カバレッジ情報を記録する。ロガーは、テストプログラム1400の実行時、Logger.Log(“クラス名:行数”)により通知されたクラス名と行数とを、テスト対象ロジックが実行中であるか否かに応じて、有用またはノイズを示すフラグと対応付けて、カバレッジ情報に記録する。
図16の例では、ロガーは、テスト対象ロジック「testAddGet」や「testAddAll」が実行中に、「List:12L」の通知を受け付けた場合、「List:12L」を、有用を示すフラグと対応付けて、カバレッジ情報に記録する。一方で、ロガーは、テスト対象外ロジックが実行中に、「List:12L」の通知を受け付けた場合、「List:12L」を、ノイズを示すフラグと対応付けて、カバレッジ情報に記録する。
これにより、テスト実行装置100は、ロガーにより、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分けて、カバレッジ情報を記録することができる。このため、テスト実行装置100は、カバレッジ情報に基づいて、疑惑値を算出する精度を向上可能にすることができ、バグ局所化の精度を向上可能にすることができる。次に、図17~図19の説明に移行し、テスト実行装置100が、ロギング制御命令を埋め込んだテストプログラム1400を実行し、カバレッジ情報を記録する具体例について説明する。
図17において、テスト実行装置100は、テストプログラム1400内の03番の行を実行後、ロギング制御命令Logger.testStart(“testAddAndGet”)を実行する。テスト実行装置100は、実行したロギング制御命令により、ロガーに、テストメソッドのメソッド名「testAddAndGet」と共に、テストメソッドの開始の通知を出力する。
ここで、ロガーは、入力された通知に基づいて、メソッド名「testAddAndGet」のテストメソッドの開始を認識するが、テスト対象ロジックの開始の通知がまだないため、テスト対象ロジックが実行中ではないと認識する。
次に、テスト実行装置100は、テストプログラム1400内の04番の行を実行し、本体プログラム1500内のDate{・・・}内のget(){・・・}を呼び出し、get(){・・・}内の命令文を実行する。この際、テスト実行装置100は、例えば、ロギング命令Logger.Log(“Date:38L”)により、ロガーに、クラス名「Date」と行「38L」とを対応付けた通知を出力する。この通知は、クラス名「Date」のクラス内の行「38L」にある命令文が実行されたことを意味する。
ここで、ロガーは、テスト対象ロジックが実行中ではないと認識しており、今回実行された命令文は、テストにより処理内容を確認したい命令文ではなく、今回実行された命令文に関するカバレッジ情報は、バグ局所化にあたりノイズとなると判断する。このため、ロガーは、通知されたクラス名「Date」と行「38L」との通知を、ノイズのフラグと対応付けて、カバレッジ情報に記録する。ノイズのフラグは、例えば、図20に後述する△である。次に、図18の説明に移行する。
図18において、テスト実行装置100は、テストプログラム1400内の05番の行を実行し、11番の行に移行する。テスト実行装置100は、テストプログラム1400内の11番の行を実行し、12番の行を実行後、ロギング制御命令Logger.LogicStart(“testAddAndGet”,“testAddALL”)を実行する。テスト実行装置100は、実行したロギング制御命令により、ロガーに、テストメソッドのメソッド名と共に、テスト対象ロジックの開始の通知を出力する。
ここで、ロガーは、テスト対象ロジックの開始の通知があったため、メソッド名「testAddAndGet」のテストメソッドの実行中であり、かつ、テスト対象ロジックが実行中であると認識する。
次に、テスト実行装置100は、テストプログラム1400内の13番の行を実行し、本体プログラム1500内のList implements IList{・・・}内のadd(IElement e){・・・}を呼び出す。テスト実行装置100は、呼び出したadd(IElement e){・・・}内の命令文を実行する。この際、テスト実行装置100は、例えば、ロギング命令Logger.Log(“List:12L”)により、ロガーに、クラス名「List」と行「12L」とを対応付けた通知を出力する。この通知は、クラス名「List」のクラス内の行「12L」にある命令文が実行されたことを意味する。
ここで、ロガーは、テスト対象ロジックが実行中であると認識しており、今回実行された命令文は、テストにより処理内容を確認したい命令文であり、今回実行された命令文に関するカバレッジ情報は、バグ局所化にあたり有用であると判断する。このため、ロガーは、通知されたクラス名「List」と行「12L」との通知を、有用を示すフラグと対応付けて、カバレッジ情報に記録する。有用を示すフラグは、例えば、図20に後述する○である。次に、図19の説明に移行する。
図19において、テスト実行装置100は、テストプログラム1400内の13番の行の次に記述された、ロギング制御命令Logger.LogicEnd(“testAddAndGet”,“testAddALL”)を実行する。テスト実行装置100は、実行したロギング制御命令により、ロガーに、テストメソッドのメソッド名と共に、テスト対象ロジックの終了の通知を出力する。
ここで、ロガーは、テスト対象ロジックの終了の通知があったため、メソッド名「testAddAndGet」のテストメソッドの実行中であるが、テスト対象ロジックが実行中ではなくなったと認識する。
次に、テスト実行装置100は、テストプログラム1400内の05番の行の次に記述された、ロギング制御命令Logger.LogicStart(“testAddAndGet”)を実行する。テスト実行装置100は、実行したロギング制御命令により、ロガーに、テストメソッドのメソッド名と共に、テスト対象ロジックの開始の通知を出力する。
ここで、ロガーは、テスト対象ロジックの開始の通知があったため、メソッド名「testAddAndGet」のテストメソッドの実行中であり、かつ、テスト対象ロジックが実行中であると認識する。同様に、テスト実行装置100は、テストプログラム1400内の行を順に実行していく。
そして、テスト実行装置100は、テストプログラム1400内の09番の行を実行後、ロギング制御命令Logger.testEnd(“testAddAndGet”)を実行する。テスト実行装置100は、実行したロギング制御命令により、ロガーに、テストメソッドのメソッド名「testAddAndGet」と共に、テストメソッドの終了の通知を出力する。
ここで、ロガーは、入力された通知に基づいて、メソッド名「testAddAndGet」のテストメソッドの終了を認識する。これにより、テスト実行装置100は、テストプログラム1400を実行し、ロガーは、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分けながら、カバレッジ情報を記録していくことができる。次に、図20~図22を用いて、テスト実行装置100が、記録されたカバレッジ情報に基づいて、ランキング表2200を生成する一例について説明する。
図20~図22は、ランキング表2200を生成する一例を示す説明図である。図20において、テスト実行装置100は、テストメソッドごとに、テストメソッドの実行結果の妥当性と、それぞれの行位置にある命令文について記録したカバレッジ情報とを纏めた表2000を生成する。
妥当性は、成功または失敗である。成功は、テストメソッドの処理内容が意図通りであることを示す。失敗は、テストメソッドの処理内容が意図通りではないことを示す。○は、命令文が、テスト対象ロジックとして実行され、有用と判断されたことを示す。△は、命令文が、テスト対象外ロジックとして実行され、ノイズと判断されたことを示す。×は、命令文が実行されなかったことを示す。次に、図21の説明に移行する。
図21において、テスト実行装置100は、表2000の△を×に置き換えた表2110を生成する。テスト実行装置100は、表2110に基づいて、行位置ごとの疑惑値を算出する。行位置の疑惑値は、例えば、行位置にある命令文が、テストメソッドの実行結果が「失敗」である場合に実行された回数が多いほど、値が大きくなるように算出される。実行された回数は、表2110において、実行結果が「失敗」のテストメソッドに対応付けられた○の数により算出される。
そして、テスト実行装置100は、算出した疑惑値が閾値Tsusp以上の行位置を抽出し、算出した疑惑値が大きい順に抽出した行位置をソートした結果Aを、表2111を用いて記憶する。これにより、テスト実行装置100は、バグの原因となる箇所である可能性が比較的高いと判断した行位置を、開発者が参照可能にすることができる。
また、テスト実行装置100は、表2000の△を○に置き換えた表2120を生成する。テスト実行装置100は、表2120に基づいて、行位置ごとの疑惑値を算出する。行位置の疑惑値は、例えば、行位置にある命令文が、テストメソッドの実行結果が「失敗」である場合に実行された回数が多いほど、値が大きくなるように算出される。実行された回数は、表2120において、実行結果が「失敗」のテストメソッドに対応付けられた○の数により算出される。
そして、テスト実行装置100は、算出した疑惑値が閾値Tsusp以上の行位置を抽出し、算出した疑惑値が大きい順に抽出した行位置をソートした結果Bを、表2121を用いて記憶する。これにより、テスト実行装置100は、少なくともバグの原因となる箇所である可能性があると判断した行位置を、開発者が参照可能にすることができる。次に、図22の説明に移行する。
図22において、テスト実行装置100は、表2111の下部に、表2121を連結し、ランキング表2200を生成して出力する。これにより、テスト実行装置100は、ランキング表2200を開発者が参照可能にすることができる。開発者は、ランキング表2200を上位から参照すれば、△を×に置き換えたノイズ除去状態で精度よく算出された疑惑値に基づく、ランキング表2200内の表2111の部分にある信頼性が比較的高い結果Aを、結果Bよりも先に確認することができる。このため、開発者は、バグの原因となる箇所である可能性が比較的高いと判断された行位置から順に、バグの原因となる箇所であるか否かを検証することができ、バグの原因となる箇所を発見し易くすることができる。
一方で、開発者は、△を○に置き換えたノイズ非除去状態で算出された疑惑値に基づく、ランキング表2200内の表2121の部分にある結果Bも確認することができる。このため、開発者は、バグの原因となる箇所を見落とす確率の低減化を図ることができる。
ここでは、テスト実行装置100は、△を×に置き換えたノイズ除去状態で精度よく算出された疑惑値に基づく結果Aと、△を○に置き換えたノイズ非除去状態で算出された疑惑値に基づく結果Bとを両方出力する場合について説明したが、これに限らない。例えば、テスト実行装置100が、△を×に置き換えたノイズ除去状態でのみ、疑惑値を算出し、結果Aだけを出力する場合があってもよい。
ここでは、テスト実行装置100が、△を×に置き換えたノイズ除去状態で疑惑値を算出すると共に、△を○に置き換えたノイズ非除去状態でも疑惑値を算出する場合について説明したが、これに限らない。例えば、テスト実行装置100が、○と△と×とに異なる重み付けを行い、1種類の疑惑値を算出する場合があってもよい。また、テスト実行装置100が、△を×に置き換えたノイズ除去状態で算出した疑惑値と、△を○に置き換えたノイズ非除去状態で算出した疑惑値との重み付け和を算出し、新たな疑惑値を算出する場合があってもよい。
(全体処理手順)
次に、図23を用いて、テスト実行装置100が実行する、全体処理手順の一例について説明する。全体処理は、例えば、図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
図23は、全体処理手順の一例を示すフローチャートである。図23において、テスト実行装置100は、本体プログラム810内にロギング命令を埋め込む(ステップS2301)。
次に、テスト実行装置100は、図24に後述する特定処理を実行し、テストプログラム800内のテスト対象ロジックを特定する(ステップS2302)。そして、テスト実行装置100は、特定したテスト対象ロジックに基づいて、テストプログラム800内にロギング制御命令を埋め込む(ステップS2303)。
次に、テスト実行装置100は、図25に後述する記録処理を実行し、テストプログラム800を実行し、カバレッジ情報を記録する(ステップS2304)。そして、テスト実行装置100は、カバレッジ情報に基づいて、本体プログラム810内の各命令文についての疑惑値を算出する(ステップS2305)。
次に、テスト実行装置100は、算出した疑惑値が高い順に命令文をソートして示すランキング表を生成して出力する(ステップS2306)。この際、テスト実行装置100は、疑惑値が閾値以上の命令文を選択的に、疑惑値が高い順にソートし、ランキング表を生成してもよい。そして、テスト実行装置100は、全体処理を終了する。これにより、テスト実行装置100は、疑惑値を精度よく算出することができ、算出した疑惑値に基づいて、開発者が、バグの原因となる箇所を絞り込み易くすることができる。
(特定処理手順)
次に、図24を用いて、テスト実行装置100が実行する、特定処理手順の一例について説明する。特定処理は、例えば、図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
図24は、特定処理手順の一例を示すフローチャートである。図24において、テスト実行装置100は、呼出関係を解析する(ステップS2401)。次に、テスト実行装置100は、呼出関係を解析した結果に基づいて、テストプログラム800から呼び出されている本体プログラム810内のメソッドを抽出し、テスト対象ロジックの候補を特定する(ステップS2402)。
そして、テスト実行装置100は、メソッド名の類似性に基づいて、特定した候補をフィルタリングし、メソッド名の類似性に関する条件を満たす候補を抽出する(ステップS2403)。また、テスト実行装置100は、クラス名の類似性に基づいて、抽出した候補をさらにフィルタリングし、クラス名の類似性に関する条件を満たす候補を抽出する(ステップS2404)。また、テスト実行装置100は、パッケージの近似性に基づいて、抽出した候補をさらにフィルタリングし、パッケージの近似性に関する条件を満たす候補を抽出する(ステップS2405)。
次に、テスト実行装置100は、抽出した候補を、テスト対象ロジックに特定する(ステップS2406)。そして、テスト実行装置100は、特定処理を終了する。これにより、テスト実行装置100は、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分ける基準を得ることができる。
(記録処理手順)
次に、図25を用いて、テスト実行装置100が実行する、記録処理手順の一例について説明する。記録処理は、例えば、図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
図25は、記録処理手順の一例を示すフローチャートである。図25において、テスト実行装置100は、未処理のテストメソッドを選択する(ステップS2501)。
次に、テスト実行装置100は、選択したテストメソッドのi行目の命令文を実行する(ステップS2502)。そして、テスト実行装置100は、i行目の命令文が、テスト対象ロジックとして実行されたか否かを判定する(ステップS2503)。
ここで、テスト対象ロジックとして実行されている場合(ステップS2503:Yes)、テスト実行装置100は、ステップS2504の処理に移行する。一方で、テスト対象ロジック以外として実行されている場合(ステップS2503:No)、テスト実行装置100は、ステップS2505の処理に移行する。
ステップS2504では、テスト実行装置100は、i行目の命令文と対応付けて、テスト対象ロジックとして実行されたことを示すカバレッジ情報を記録する(ステップS2504)。そして、テスト実行装置100は、ステップS2507の処理に移行する。
ステップS2505では、テスト実行装置100は、i行目の命令文と対応付けてカバレッジ情報が記録済みであるか否かを判定する(ステップS2505)。ここで、記録済みである場合(ステップS2505:Yes)、テスト実行装置100は、ステップS2507の処理に移行する。一方で、記録済みではない場合(ステップS2505:No)、テスト実行装置100は、ステップS2506の処理に移行する。
ステップS2506では、テスト実行装置100は、i行目の命令文と対応付けて、テスト対象ロジック以外として実行されたことを示すカバレッジ情報を記録する(ステップS2506)。そして、テスト実行装置100は、ステップS2507の処理に移行する。
ステップS2507では、テスト実行装置100は、選択したテストメソッドの最終行の命令文まで実行したか否かを判定する(ステップS2507)。ここで、最終行の命令文まで実行していない場合(ステップS2507:No)、テスト実行装置100は、iをインクリメントし(ステップS2508)、ステップS2502の処理に戻る。一方で、最終行の命令文まで実行している場合(ステップS2507:Yes)、テスト実行装置100は、ステップS2509の処理に移行する。
ステップS2509では、テスト実行装置100は、未処理のテストメソッドがあるか否かを判定する(ステップS2509)。ここで、未処理のテストメソッドがある場合(ステップS2509:Yes)、テスト実行装置100は、ステップS2501の処理に戻る。一方で、未処理のテストメソッドがない場合(ステップS2509:No)、テスト実行装置100は、記録処理を終了する。これにより、テスト実行装置100は、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分けて、カバレッジ情報を記録することができる。
ここで、テスト実行装置100は、図23~図25の各フローチャートの一部ステップの処理の順序を入れ替えて実行してもよい。例えば、ステップS2403~S2405の処理の順序は入れ替え可能である。また、テスト実行装置100は、図23~図25の各フローチャートの一部ステップの処理を省略してもよい。例えば、ステップS2403~S2405のいずれかの処理は省略可能である。
以上説明したように、テスト実行装置100によれば、テスト対象コードと、テスト対象コードに対するテストを実行するテスト実行コードとを取得することができる。テスト実行装置100によれば、取得したテスト対象コードと、取得したテスト実行コードとをテキスト解析した結果に基づいて、テスト実行コード内で、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定することができる。テスト実行装置100によれば、テスト実行コードを実行した結果、特定した呼出命令文によりテスト対象コード内の命令文群が呼び出されたことに応じて実行された、テスト対象コード内の命令文を識別可能にする情報を記録することができる。これにより、テスト実行装置100は、バグ局所化にあたり有用な情報と、ノイズとなる情報とを切り分け可能にすることができる。
テスト実行装置100によれば、テスト実行コードを実行した結果、特定した呼出命令文以外によりテスト対象コード内の命令文群が呼び出されたことに応じて実行された、テスト対象コード内の命令文を識別可能にする第2の情報を記録することができる。これにより、テスト実行装置100は、バグ局所化にあたりノイズとなると判断した情報も、利用可能にすることができる。
テスト実行装置100によれば、テスト実行コードを実行した結果、特定した呼出命令文に応じては実行されず、かつ、特定した呼出命令文以外に応じて実行された、テスト対象コード内の命令文を識別可能にする第2の情報を記録することができる。これにより、テスト実行装置100は、バグ局所化にあたりノイズとなると判断した情報も、利用可能にすることができる。また、テスト実行装置100は、第1の情報と第2の情報との重複を回避することができ、処理の煩雑化や処理量の増大を回避することができる。
テスト実行装置100によれば、テストの実行結果の妥当性を判定することができる。テスト実行装置100によれば、判定した妥当性と、記録した情報とに基づいて、テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す疑惑値を算出することができる。テスト実行装置100によれば、テスト対象コード内のそれぞれの命令文に対応付けて、算出した疑惑値を出力することができる。これにより、テスト実行装置100は、開発者が、疑惑値を参照可能にし、バグの原因となる箇所を発見し易くすることができる。
テスト実行装置100によれば、算出した疑惑値に基づいて、テスト対象コード内のそれぞれの命令文を識別する情報をソートして出力することができる。これにより、テスト実行装置100は、開発者が、疑惑値に基づきテスト対象コード内のそれぞれの命令文を識別する情報をソートした結果を参照可能にし、バグの原因となる箇所を発見し易くすることができる。
テスト実行装置100によれば、テストの実行結果の妥当性を判定することができる。テスト実行装置100によれば、判定した妥当性と、記録した情報とに基づいて、テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す第1の疑惑値を算出することができる。テスト実行装置100によれば、判定した妥当性と、記録した情報と、記録した第2の情報とに基づいて、テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す第2の疑惑値を算出することができる。テスト実行装置100によれば、テスト対象コード内のそれぞれの命令文に対応付けて、算出した第1の疑惑値と、算出した第2の疑惑値とを出力することができる。これにより、テスト実行装置100は、開発者が、第1の疑惑値と、第2の疑惑値とを参照可能にし、バグの原因となる箇所を発見し易くすることができる。
テスト実行装置100によれば、算出した第1の疑惑値と、算出した第2の疑惑値とに基づいて、テスト対象コード内のそれぞれの命令文を識別する情報をソートして出力することができる。これにより、テスト実行装置100は、開発者が、第1の疑惑値と第2の疑惑値とに基づきテスト対象コード内のそれぞれの命令文を識別する情報をソートした結果を参照可能にし、バグの原因となる箇所を発見し易くすることができる。
テスト実行装置100によれば、テスト実行コード内で、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出することができる。テスト実行装置100によれば、テスト実行コード内で、検出した候補が記述されたメソッドに対応する名称と、テスト対象コード内で、検出した候補により呼び出される命令文群が記述されたメソッドに対応する名称との第1の類似度を算出することができる。テスト実行装置100によれば、算出した第1の類似度に基づいて、検出した候補の中から、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定することができる。これにより、テスト実行装置100は、開発者のメソッド名の命名傾向に基づき、呼出命令文を精度よく検出することができる。
テスト実行装置100によれば、テスト実行コード内で、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出することができる。テスト実行装置100によれば、テスト実行コード内で、検出した候補が記述されたクラスに対応する名称と、テスト対象コード内で、検出した候補により呼び出される命令文群が記述されたクラスに対応する名称との第2の類似度を算出することができる。テスト実行装置100によれば、算出した第2の類似度に基づいて、検出した候補の中から、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定することができる。これにより、テスト実行装置100は、開発者のクラス名の命名傾向に基づき、呼出命令文を精度よく検出することができる。
テスト実行装置100によれば、テスト実行コード内で、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出することができる。テスト実行装置100によれば、テスト実行コード内で検出した候補が記述されたパッケージに対応するアドレスと、テスト対象コード内で検出した候補により呼び出される命令文群が記述されたパッケージに対応するアドレスとの近似度を算出することができる。テスト実行装置100によれば、算出した近似度に基づいて、検出した候補の中から、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定することができる。これにより、テスト実行装置100は、開発者のパッケージの配置傾向に基づき、呼出命令文を精度よく検出することができる。
テスト実行装置100によれば、テスト対象コード内に、テスト対象コード内のそれぞれの命令文に対応付けて、当該命令文が実行されたことに応じて、当該命令文を識別する情報を含む第1の通知を出力する第1の命令文を書き込むことができる。テスト実行装置100によれば、テスト実行コード内に、特定した呼出命令文に対応付けて、特定した呼出命令文が実行される直前に、特定した呼出命令文を識別する情報を含む第2の通知を出力する第2の命令文を書き込むことができる。テスト実行装置100によれば、テスト実行コード内に、特定した呼出命令文に対応付けて、特定した呼出命令文が実行された直後に、特定した呼出命令文を識別する情報を含む第3の通知を出力する第3の命令文を書き込むことができる。テスト実行装置100によれば、テスト実行コードを実行した結果、出力された第1の通知と、出力された第2の通知と、出力された第3の通知とに基づいて、情報を記録することができる。これにより、テスト実行装置100は、ロガーを用いて、情報を記録可能にすることができる。
テスト実行装置100によれば、テスト対象コードに対し、互いに種類が異なるテストを実行する複数のテスト実行コードを取得することができる。テスト実行装置100によれば、テスト実行コードごとに、テスト対象コードと、テスト実行コードとをテキスト解析した結果に基づいて、テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定することができる。テスト実行装置100によれば、テスト実行コードごとに、テスト実行コードを実行した結果、特定した呼出命令文によりテスト対象コード内の命令文群が呼び出されたことに応じて実行された命令文を識別可能にする情報を記録することができる。これにより、テスト実行装置100は、テスト実行コードが複数ある場合に適用することができる。
なお、本実施の形態で説明したテスト実行方法は、予め用意されたプログラムをPCやワークステーションなどのコンピュータで実行することにより実現することができる。本実施の形態で説明したテスト実行プログラムは、コンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。記録媒体は、ハードディスク、フレキシブルディスク、CD(Compact Disc)-ROM、MO、DVD(Digital Versatile Disc)などである。また、本実施の形態で説明したテスト実行プログラムは、インターネットなどのネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)テスト対象コードと、前記テスト対象コードに対するテストを実行するテスト実行コードとを取得し、
取得した前記テスト対象コードと、取得した前記テスト実行コードとをテキスト解析した結果に基づいて、前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定し、
前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする情報を記録する、
処理をコンピュータに実行させることを特徴とするテスト実行プログラム。
(付記2)前記記録する処理は、
さらに、前記テスト実行コードを実行した結果、特定した前記呼出命令文以外により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする第2の情報を記録する、ことを特徴とする付記1に記載のテスト実行プログラム。
(付記3)前記記録する処理は、
さらに、前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じては実行されず、かつ、特定した前記呼出命令文以外により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする第2の情報を記録する、ことを特徴とする付記1に記載のテスト実行プログラム。
(付記4)前記テストの実行結果の妥当性を判定し、
判定した前記妥当性と、記録した前記情報とに基づいて、前記テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す疑惑値を算出し、
前記テスト対象コード内のそれぞれの命令文に対応付けて、算出した前記疑惑値を出力する、処理を前記コンピュータに実行させることを特徴とする付記1~3のいずれか一つに記載のテスト実行プログラム。
(付記5)算出した前記疑惑値に基づいて、前記テスト対象コード内のそれぞれの命令文を識別する情報をソートして出力する、処理を前記コンピュータに実行させることを特徴とする付記4に記載のテスト実行プログラム。
(付記6)前記テストの実行結果の妥当性を判定し、
判定した前記妥当性と、記録した前記情報とに基づいて、前記テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す第1の疑惑値を算出し、
判定した前記妥当性と、記録した前記情報と、記録した前記第2の情報とに基づいて、前記テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す第2の疑惑値を算出し、
前記テスト対象コード内のそれぞれの命令文に対応付けて、算出した前記第1の疑惑値と、算出した前記第2の疑惑値とを出力する、処理を前記コンピュータに実行させることを特徴とする付記2または3に記載のテスト実行プログラム。
(付記7)算出した前記第1の疑惑値と、算出した前記第2の疑惑値とに基づいて、前記テスト対象コード内のそれぞれの命令文を識別する情報をソートして出力する、処理を前記コンピュータに実行させることを特徴とする付記6に記載のテスト実行プログラム。
(付記8)前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出し、
前記テスト実行コード内で、検出した前記候補が記述されたメソッドに対応する名称と、前記テスト対象コード内で、検出した前記候補により呼び出される命令文群が記述されたメソッドに対応する名称との第1の類似度を算出する、処理を前記コンピュータに実行させ、
前記特定する処理は、
算出した前記第1の類似度に基づいて、検出した前記候補の中から、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する、ことを特徴とする付記1~7のいずれか一つに記載のテスト実行プログラム。
(付記9)前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出し、
前記テスト実行コード内で、検出した前記候補が記述されたクラスに対応する名称と、前記テスト対象コード内で、検出した前記候補により呼び出される命令文群が記述されたクラスに対応する名称との第2の類似度を算出する、処理を前記コンピュータに実行させ、
前記特定する処理は、
算出した前記第2の類似度に基づいて、検出した前記候補の中から、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する、ことを特徴とする付記1~8のいずれか一つに記載のテスト実行プログラム。
(付記10)前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出し、
前記テスト実行コード内で、検出した前記候補が記述されたパッケージに対応するアドレスと、前記テスト対象コード内で、検出した前記候補により呼び出される命令文群が記述されたパッケージに対応するアドレスとの近似度を算出する、処理を前記コンピュータに実行させ、
前記特定する処理は、
算出した前記近似度に基づいて、検出した前記候補の中から、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する、ことを特徴とする付記1~9のいずれか一つに記載のテスト実行プログラム。
(付記11)前記テスト対象コード内に、前記テスト対象コード内のそれぞれの命令文に対応付けて、当該命令文が実行されたことに応じて、当該命令文を識別する情報を含む第1の通知を出力する第1の命令文を書き込み、
前記テスト実行コード内に、特定した前記呼出命令文に対応付けて、特定した前記呼出命令文が実行される直前に、特定した前記呼出命令文を識別する情報を含む第2の通知を出力する第2の命令文と、特定した前記呼出命令文が実行された直後に、特定した前記呼出命令文を識別する情報を含む第3の通知を出力する第3の命令文とを書き込む、処理を前記コンピュータに実行させ、
前記記録する処理は、
前記テスト実行コードを実行した結果、出力された前記第1の通知と、出力された前記第2の通知と、出力された前記第3の通知とに基づいて、前記情報を記録する、ことを特徴とする付記1~10のいずれか一つに記載のテスト実行プログラム。
(付記12)前記取得する処理は、
前記テスト対象コードに対し、互いに種類が異なるテストを実行する複数のテスト実行コードを取得し、
前記特定する処理は、
前記テスト実行コードごとに、前記テスト対象コードと、前記テスト実行コードとをテキスト解析した結果に基づいて、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定し、
前記記録する処理は、
前記テスト実行コードごとに、前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする情報を記録する、ことを特徴とする付記1~11のいずれか一つに記載のテスト実行プログラム。
(付記13)テスト対象コードと、前記テスト対象コードに対するテストを実行するテスト実行コードとを取得し、
取得した前記テスト対象コードと、取得した前記テスト実行コードとをテキスト解析した結果に基づいて、前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定し、
前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする情報を記録する、
処理をコンピュータが実行することを特徴とするテスト実行方法。
(付記14)テスト対象コードと、前記テスト対象コードに対するテストを実行するテスト実行コードとを取得し、
取得した前記テスト対象コードと、取得した前記テスト実行コードとをテキスト解析した結果に基づいて、前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定し、
前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする情報を記録する、
制御部を有することを特徴とするテスト実行装置。
100 テスト実行装置
101 テスト対象コード
102 テスト実行コード
200 バグ発見システム
201 クライアント装置
210 ネットワーク
300 バス
301 CPU
302 メモリ
303 ネットワークI/F
304 記録媒体I/F
305 記録媒体
400 記憶部
401 取得部
402 特定部
403 記録部
404 解析部
405 出力部
501,512,602,810 本体プログラム
502,532,601,800 テストプログラム
511 ロギング命令埋込部
521 テスト対象ロジック特定部
522 テスト対象ロジック特定結果
531 ロギング制御命令埋込部
540 カバレッジ記録ロガープログラム
541 テスト実行&カバレッジ記録部
542 カバレッジ情報
551 疑惑値算出部
552 疑惑行ランキング表
700 ロガー
811~813 命令文群
900,1000,1100,1200,1300,2000,2110,2111,2120,2121 表
2200 ランキング表

Claims (13)

  1. テスト対象コードと、前記テスト対象コードに対するテストを実行するテスト実行コードとを取得し、
    取得した前記テスト対象コードと、取得した前記テスト実行コードとをテキスト解析した結果に基づいて、前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定し、
    前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする情報を記録する、
    処理をコンピュータに実行させることを特徴とするテスト実行プログラム。
  2. 前記記録する処理は、
    さらに、前記テスト実行コードを実行した結果、特定した前記呼出命令文以外により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする第2の情報を記録する、ことを特徴とする請求項1に記載のテスト実行プログラム。
  3. 前記記録する処理は、
    さらに、前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じては実行されず、かつ、特定した前記呼出命令文以外により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする第2の情報を記録する、ことを特徴とする請求項1に記載のテスト実行プログラム。
  4. 前記テストの実行結果の妥当性を判定し、
    判定した前記妥当性と、記録した前記情報とに基づいて、前記テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す疑惑値を算出し、
    前記テスト対象コード内のそれぞれの命令文に対応付けて、算出した前記疑惑値を出力する、処理を前記コンピュータに実行させることを特徴とする請求項1~3のいずれか一つに記載のテスト実行プログラム。
  5. 算出した前記疑惑値に基づいて、前記テスト対象コード内のそれぞれの命令文を識別する情報をソートして出力する、処理を前記コンピュータに実行させることを特徴とする請求項4に記載のテスト実行プログラム。
  6. 前記テストの実行結果の妥当性を判定し、
    判定した前記妥当性と、記録した前記情報とに基づいて、前記テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す第1の疑惑値を算出し、
    判定した前記妥当性と、記録した前記情報と、記録した前記第2の情報とに基づいて、前記テスト対象コード内のそれぞれの命令文の、バグの原因である可能性の高さを示す第2の疑惑値を算出し、
    前記テスト対象コード内のそれぞれの命令文に対応付けて、算出した前記第1の疑惑値と、算出した前記第2の疑惑値とを出力する、処理を前記コンピュータに実行させることを特徴とする請求項2または3に記載のテスト実行プログラム。
  7. 算出した前記第1の疑惑値と、算出した前記第2の疑惑値とに基づいて、前記テスト対象コード内のそれぞれの命令文を識別する情報をソートして出力する、処理を前記コンピュータに実行させることを特徴とする請求項6に記載のテスト実行プログラム。
  8. 前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出し、
    前記テスト実行コード内で、検出した前記候補が記述されたメソッドに対応する名称と、前記テスト対象コード内で、検出した前記候補により呼び出される命令文群が記述されたメソッドに対応する名称との第1の類似度を算出する、処理を前記コンピュータに実行させ、
    前記特定する処理は、
    算出した前記第1の類似度に基づいて、検出した前記候補の中から、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する、ことを特徴とする請求項1~7のいずれか一つに記載のテスト実行プログラム。
  9. 前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出し、
    前記テスト実行コード内で、検出した前記候補が記述されたクラスに対応する名称と、前記テスト対象コード内で、検出した前記候補により呼び出される命令文群が記述されたクラスに対応する名称との第2の類似度を算出する、処理を前記コンピュータに実行させ、
    前記特定する処理は、
    算出した前記第2の類似度に基づいて、検出した前記候補の中から、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する、ことを特徴とする請求項1~8のいずれか一つに記載のテスト実行プログラム。
  10. 前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文となる候補を検出し、
    前記テスト実行コード内で、検出した前記候補が記述されたパッケージに対応するアドレスと、前記テスト対象コード内で、検出した前記候補により呼び出される命令文群が記述されたパッケージに対応するアドレスとの近似度を算出する、処理を前記コンピュータに実行させ、
    前記特定する処理は、
    算出した前記近似度に基づいて、検出した前記候補の中から、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定する、ことを特徴とする請求項1~9のいずれか一つに記載のテスト実行プログラム。
  11. 前記テスト対象コード内に、前記テスト対象コード内のそれぞれの命令文に対応付けて、当該命令文が実行されたことに応じて、当該命令文を識別する情報を含む第1の通知を出力する第1の命令文を書き込み、
    前記テスト実行コード内に、特定した前記呼出命令文に対応付けて、特定した前記呼出命令文が実行される直前に、特定した前記呼出命令文を識別する情報を含む第2の通知を出力する第2の命令文と、特定した前記呼出命令文が実行された直後に、特定した前記呼出命令文を識別する情報を含む第3の通知を出力する第3の命令文とを書き込む、処理を前記コンピュータに実行させ、
    前記記録する処理は、
    前記テスト実行コードを実行した結果、出力された前記第1の通知と、出力された前記第2の通知と、出力された前記第3の通知とに基づいて、前記情報を記録する、ことを特徴とする請求項1~10のいずれか一つに記載のテスト実行プログラム。
  12. テスト対象コードと、前記テスト対象コードに対するテストを実行するテスト実行コードとを取得し、
    取得した前記テスト対象コードと、取得した前記テスト実行コードとをテキスト解析した結果に基づいて、前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定し、
    前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする情報を記録する、
    処理をコンピュータが実行することを特徴とするテスト実行方法。
  13. テスト対象コードと、前記テスト対象コードに対するテストを実行するテスト実行コードとを取得し、
    取得した前記テスト対象コードと、取得した前記テスト実行コードとをテキスト解析した結果に基づいて、前記テスト実行コード内で、前記テスト対象コード内の命令文群をテスト実行用に呼び出す呼出命令文を特定し、
    前記テスト実行コードを実行した結果、特定した前記呼出命令文により前記テスト対象コード内の命令文群が呼び出されたことに応じて実行された、前記テスト対象コード内の命令文を識別可能にする情報を記録する、
    制御部を有することを特徴とするテスト実行装置。
JP2019228133A 2019-12-18 2019-12-18 テスト実行プログラム、テスト実行方法、およびテスト実行装置 Active JP7331681B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2019228133A JP7331681B2 (ja) 2019-12-18 2019-12-18 テスト実行プログラム、テスト実行方法、およびテスト実行装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2019228133A JP7331681B2 (ja) 2019-12-18 2019-12-18 テスト実行プログラム、テスト実行方法、およびテスト実行装置

Publications (2)

Publication Number Publication Date
JP2021096685A JP2021096685A (ja) 2021-06-24
JP7331681B2 true JP7331681B2 (ja) 2023-08-23

Family

ID=76431440

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2019228133A Active JP7331681B2 (ja) 2019-12-18 2019-12-18 テスト実行プログラム、テスト実行方法、およびテスト実行装置

Country Status (1)

Country Link
JP (1) JP7331681B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114153742A (zh) * 2021-12-10 2022-03-08 深圳前海微众银行股份有限公司 单元测试方法、装置、电子设备和存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2005338987A (ja) 2004-05-25 2005-12-08 Fujitsu Ltd 例外テスト支援プログラム及び例外テスト支援装置
CN103914386A (zh) 2014-04-21 2014-07-09 西北工业大学 基于输入参数特征谱的软件缺陷定位方法
JP2014182451A (ja) 2013-03-18 2014-09-29 Fujitsu Ltd プログラム分析装置、方法及びプログラム

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2005338987A (ja) 2004-05-25 2005-12-08 Fujitsu Ltd 例外テスト支援プログラム及び例外テスト支援装置
JP2014182451A (ja) 2013-03-18 2014-09-29 Fujitsu Ltd プログラム分析装置、方法及びプログラム
CN103914386A (zh) 2014-04-21 2014-07-09 西北工业大学 基于输入参数特征谱的软件缺陷定位方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
Wanzhi Wen,Software Fault Localization Based on Program Slicing Spectrum,2012 34th International Conference on Software Engineering (ICSE),米国,IEEE,2012年06月02日,p.1511-1514
前田 芳晴 ほか,業務アプリケーションの結合テストでの回帰テスト選択手法, ソフトウェア工学の基礎XVIII ,日本,株式会社近代科学社,2011年11月30日,レクチャーノート/ソフトウェア学37,p.169-174
藤原 新 ほか,モジュール理解のためのバグレポート推薦,ソフトウェア工学の基礎XXI ,日本,株式会社近代科学社,2014年12月31日,レクチャーノート/ソフトウェア学40,p.177-182

Also Published As

Publication number Publication date
JP2021096685A (ja) 2021-06-24

Similar Documents

Publication Publication Date Title
Zeng et al. Studying the characteristics of logging practices in mobile apps: a case study on f-droid
US8527965B2 (en) Layered static program analysis framework for software testing
CN104899147B (zh) 一种面向安全检查的代码静态分析方法
US8397104B2 (en) Creation of test plans
Hemmati et al. Prioritizing manual test cases in rapid release environments
US10049031B2 (en) Correlation of violating change sets in regression testing of computer software
US20200065226A1 (en) Automated software program repair of similar code snippets
KR101979329B1 (ko) 바이너리의 취약점을 유발하는 입력데이터 위치 추적 방법 및 그 장치
JP6245006B2 (ja) テストケース生成装置、方法、及びプログラム
KR20160021585A (ko) 코드 커버리지 측정 방법 및 이를 실행하기 위한 프로그램을 기록한 컴퓨터로 판독가능한 기록매체
JP6559600B2 (ja) 情報処理装置、情報処理プログラムおよび検査システム
JP7331681B2 (ja) テスト実行プログラム、テスト実行方法、およびテスト実行装置
CN110287700B (zh) 一种iOS应用安全分析方法及装置
JP6416588B2 (ja) ソースコード検証システム
Magalhães et al. Evaluating an automatic text-based test case selection using a non-instrumented code coverage analysis
JP2012174082A (ja) 情報処理装置及び情報処理方法及びプログラム
US10546080B1 (en) Method and system for identifying potential causes of failure in simulation runs using machine learning
CN113031995B (zh) 一种更新规则的方法、装置、存储介质以及电子设备
JP7380851B2 (ja) テストスクリプト生成装置、テストスクリプト生成方法及びプログラム
CN113946339A (zh) 应用工程文件的处理方法、装置、电子设备及可读介质
Huang et al. Atlantis: Improving the analysis and visualization of large assembly execution traces
CN111338956A (zh) 一种自动化的压测方法、装置、设备和存储介质
JP4869581B2 (ja) カバレッジ計測システム及びそのプログラム
JP2017041196A (ja) スタブ化対象判定装置、方法、及びプログラム
Shim et al. Semantic-aware Comment Analysis Approach for API Permission Mapping on Android

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20220809

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20230614

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20230711

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20230724

R150 Certificate of patent or registration of utility model

Ref document number: 7331681

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150