JP7070195B2 - インタラクティブなソフトウェアプログラムの修復 - Google Patents

インタラクティブなソフトウェアプログラムの修復 Download PDF

Info

Publication number
JP7070195B2
JP7070195B2 JP2018138230A JP2018138230A JP7070195B2 JP 7070195 B2 JP7070195 B2 JP 7070195B2 JP 2018138230 A JP2018138230 A JP 2018138230A JP 2018138230 A JP2018138230 A JP 2018138230A JP 7070195 B2 JP7070195 B2 JP 7070195B2
Authority
JP
Japan
Prior art keywords
test
repair
augmented
human
suite
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
JP2018138230A
Other languages
English (en)
Other versions
JP2019029015A (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
Publication of JP2019029015A publication Critical patent/JP2019029015A/ja
Application granted granted Critical
Publication of JP7070195B2 publication Critical patent/JP7070195B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3692Test management for test results analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Description

本開示は、ソフトウェアプログラムの修復に概して関係がある。
ソフトウェアプログラムは、それらの中にしばしば欠陥(“バグ”と広く呼ばれる。)を有している。その場合に、ソフトウェアプログラムは、意図されたように動作しないことがある。しばしば、自動化された修復システムが、ソフトウェアプログラム内の欠陥を特定及び修正しようとして使用される。
本開示で請求される主題は、上述されたもののような環境でしか動作しない実施形態又は如何なる欠点も解消する実施形態に制限されない。むしろ、この背景は、本開示で記載される実施形態が実施され得る技術分野の一例を説明するためにのみ与えられる。
いくつかの例に従って、1つ以上の自動生成されたテストに加えて、人間が生み出した1つ以上のテストオラクルを用いてソフトウェアプログラムをインタラクティブに修復する方法が、記載される。1つ以上の自動生成されたテストに加えて、人間が生み出した1つ以上のテストオラクルを用いてソフトウェアプログラムをインタラクティブに修復する方法の例は、ソフトウェアプログラム内の欠陥箇所を特定し、修復候補に基づき、前記欠陥箇所で、可能な修復を生成し、該可能な修復をテストするよう第1テストを自動生成し、該第1テストに基づき、第1テストオラクルのための第1クエリを生成することを含んでよい。方法は、前記第1クエリに対する応答を人間から取得し、前記第1クエリ及び該第1クエリに対する前記取得された応答に基づき、人間が提供した第1テストオラクルを生成し、拡張された第1テストを生成するよう前記人間が提供した第1テストオラクルを前記第1テストに加え、前記拡張された第1テストを含むようテストスイートを増補し、該増補されたテストスイートを用いて前記可能な修復をテストすることを更に含んでよい。
実施形態の目的及び利点は、特許請求の範囲で特に指し示されている要素、特徴、及び組み合わせによって少なくとも実現及び達成されるだろう。前述の概要及び以下の詳細な説明はいずれも例として与えられており、説明のためであって、請求される発明の限定ではない。
本開示の前述及び他の特徴は、添付の図面とともに理解される以下の記載及び添付の特許請求の範囲から、より十分に明らかになるだろう。それらの図面が本開示に従ういくつかの実施形態しか表しておらず、従って、その適用範囲の限定と見なされるべきでないとの理解の下、本開示は、添付の図面の使用を通じて、更なる特定及び詳細を用いて記載されることになる。
インタラクティブなソフトウェアプログラム修復に関する環境の例の概要を表す。 ソフトウェアプログラムを修復するよう構成され得る汎用のコンピュータシステムの例の選択されたコンポーネントを表す。 ソフトウェアプログラムをインタラクティブに修復するプロセスを例示するフロー図である。 ソフトウェアプログラムをインタラクティブに修復するプロセスを例示するフロー図である。 前に受け入れられた修復を増補されたテストスイートを用いて再テストするプロセスを例示するフロー図である。
以下の詳細な説明では、本願の一部をなす添付の図面が参照される。図面において、同様の符号は、別段文脈中で示されない限りは、通常は、同様のコンポーネントを特定する。詳細な説明、図面、及び特許請求の範囲で記載される、実例となる実施形態は、限定であるよう意図されていない。本願で提示されている主題の精神及び適用範囲から逸脱することなしに、他の実施形態が利用されてよく、他の変更がなされてよい。概して本明細書中で記載され且つ図に表されている本開示の態様は、多種多様な異なった構成において配置され、置換され、組み合わされ、分離され、且つ設計され得る。それらの全てが明示的に本明細書において考えられている。
本開示は、とりわけ、インタラクティブなソフトウェアプログラム修復に関する方法、装置、システム、デバイス、及び/又はコンピュータプログラム製品に概して引き付けられている。ソフトウェアプログラムは、意図しない様態でソフトウェアプログラムを挙動させることがある欠陥(一般には“バグ”とも呼ばれる。)をしばしば含む。その上、自動修復システム及び技術(例えば、自動プログラム修復)は、欠陥を検出及び修正してソフトウェアプログラムを修復するためにしばしば使用される。自動プログラム修復の目的は、ソフトウェアプログラム内でバグを特定し、その特定されたバグを直す(例えば、パッチをあてる)プロセスを自動化することである。これは、修正された又はパッチをあてられたソフトウェアプログラムの期待される挙動のための素晴らしい基準となり得る修復規格に基づき行われ得る。例えば、修復規格は、テストケースの組(例えば、テストスイート)を含んでよく、テストケースの1つ以上は、修復を受けているソフトウェア(例えば、テストを受けているソフトウェアプログラム)の現在のバグの出るバージョンの下では落第点であることがある。
しかし、テストスイートは、修復規格として不完全であることがある。更に、一般に使用されている自動修復システム及び技術は、単に、元の又は修復されたソフトウェアプログラムが所与のテストケースに合格又は落第するかどうかを確認するために、修復規格を使用していることがある。よって、一般に使用されている自動修復システム及び技術は、修復規格を満足する修復を実現し得る(例えば、修復規格に含まれるテストケースを満足する修復を実現し得る)が、実際には、テストスイートが不完全でありうるので不適当である。
いくつかの実施形態で、修復モジュールは、ソフトウェアプログラム内のバグのための修復(パッチ)を改善するのに適した拡張されたテストケースの発生及び増補されたテストスイートの発生において、人間が提供した(human-provided)テストオラクルを組み込む。修復モジュールは、初期テストスイート(例えば、既存のテストスイート)の実行に基づき、ソフトウェアプログラム内で1つ以上の欠陥及び対応する欠陥位置を特定してよい。初期テストスイートはテストの組を含んでよい。夫々の欠陥位置について、修復モジュールは、修復候補を選択し、修復候補を用いて欠陥位置での可能性がある修復又は変換(例えば、可能性があるパッチ)を構成してよい。修復モジュールは、次いで、可能性がある修復(例えば、可能性があるパッチ)がテストスイート(例えば、テストスイートに含まれているテスト)を通過するかどうかを判定するよう、テストスイートに対して、欠陥位置で可能性がある修復(例えば、可能性があるパッチ)を有しているソフトウェアプログラムを実行してよい。可能性がある修復がテストスイートを通過しない場合には、修復モジュールは、その可能性がある修復を捨て、他の修復候補を選択し、新たに選択された修復候補を用いて欠陥位置で新しい可能性がある修復を構成し、その新しい可能性がある修復をテストスイートを用いてテストしてよい。
可能性がある修復がテストスイートを通過する場合には、修復モジュールは、可能性がある修復をテストするのに適した新しい(例えば、更なる)テストが存在するかどうかを判定してよい。可能性がある修復をテストするのに適したテストがない場合には、修復モジュールは、欠陥の適切な修復(パッチ)として欠陥位置でその可能性がある修復を受け入れてよい。新しいテストがある場合には、修復モジュールは、その新しいテストをテストスイートに含めてよい。いくつかの例において、修復モジュールが新しいテストを生成してよい。修復モジュールは、新しいテストに基づきテストオラクルのためのクエリ(新しいテストの実行に対応するクエリ)を導出又は生成し、テストオラクルのためのクエリを、プログラマ、ソフトウェア開発者、などのような、ソフトウェアプログラミングの知識を持った人間に提示してよい。修復モジュールは、提示されたクエリ及びその提示されたクエリに対する人間の(例えば、人間による)応答に基づき、人間が提供したテストオラクルを生成し、その人間が提供したテストオラクルを新しいテストに加えてよい。このように、新しいテストは、既存のテストスイート(例えば、初期テストスイート)が、増補されたテストスイートを生成するよう、新しいテスト及びそれの人間が提供したテストオラクルにより増補され得るように、拡張されてよい。増補されたテストスイートは、次いで、既存のテストスイートになってよい。修復モジュールは、次いで、増補されたテストスイートを用いて、可能性がある修復をテストしてよい。可能性がある修復が増補されたテストスイートを通過する場合には、修復モジュールは、可能性がある修復を更にテストするのに適した更なる新しいテストが存在するかどうかを判定してよい。他の新しいテストがある場合には、修復モジュールは、対応する人間が提供したテストオラクルにより増補された新しいテストにより既存のテストスイートを増補するよう、上記のプロセスを繰り返してよい。このように、修復モジュールは、不適切な可能性がある修復を取り除くか又は捨てるよう、1つ以上のテスト及びそれらの人間が提供したテストオラクルによりテストスイートを強化してよい。いくつかの実施形態では、修復モジュールは、可能性がある修復を更にテストするための更なるテストをチェックすることなしに、可能性がある修復が増補されたテストスイートを通過すると、その可能性がある修復を適切な修復として受け入れてよい。
可能性がある修復が増補されたテストスイートを通過しない場合には、修復モジュールは、可能性がある修復を不適切な修復として拒絶してよい。すなわち、修復候補は、不適切な修復を生じさせるものとして捨てられてよい。修復モジュールは、新しい修復候補を選択し、新しい修復候補を用いて欠陥位置で新しい可能性がある修復を構成し、新しい可能性がある修復をテストスイートを用いてテストしてよい。同様にして、修復モジュールは、特定された欠陥位置のうちの1つ以上で修復候補のうちの1つ以上を処理してよい。
いくつかの実施形態では、修復モジュールは、欠陥のための更なる又は複数の適切な修復(例えば、複数のパッチ)を生成してよい。すなわち、修復モジュールは、欠陥の適切な修復(パッチ)として、欠陥位置で1つよりも多い可能性がある修復を受け入れてよい。例えば、欠陥位置での適切な修復として、修復候補に基づき、欠陥位置で可能性がある修復を受け入れた後、修復モジュールは、その欠陥位置のための更なる修復候補が存在するかどうかを判定し、そして、更なる修復候補に基づき可能性がある修復を生成し、可能性がある修復を増補されたテストスイートに対してテストして更なる可能性がある修復を欠陥位置で潜在的に受け入れる上記のプロセスを繰り返してよい。
いくつかの実施形態では、修復モジュールは、前に受け入れられた可能性がある修復を取り除くよう(例えば、前の適切な修復が依然として適切な修復であるかどうかを判定するよう)、前に受け入れられた可能性がある修復(前の適切な修復)を増補されたテストスイート(例えば、対応する人間が提供したテストオラクルにより増補された新しいテストケースにより増補されたテストスイート)に対してテストしてよい。すなわち、修復モジュールは、前の適切な修復が増補されたテストスイートを通過するかどうかを判定してよい。例えば、前に受け入れられた可能性がある修復は、増補されたテストスイートにおいて現在含まれている1つ以上のテスト(例えば、人間が提供したテストオラクルにより増補された1つ以上の新たに生成されたテスト)を含んでいなかった前のテストスイートを用いてテストされて、適切な修復として受け入れられている。修復モジュールは、前に受け入れられた可能性がある修復を増補されたテストスイートを用いてテストしてよく、前に受け入れられた可能性がある修復が増補されたテストスイートを通過しない場合には、修復モジュールは、前に受け入れられた可能性がある修復を不適切な修復として捨ててよい。すなわち、前に決定された適切な修復は、もはや、適切な修復と見なされ得ない。前に受け入れられた可能性がある修復が増補されたテストスイートを通過する場合には、修復モジュールは、前に受け入れられた可能性がある修復を適切な修復として再び受け入れてよい。すなわち、前に決定された適切な修復は、増補されたテストスイートに対してテストされた適切な修復として引き続き見なされ得る。
本開示の様々な実施形態が、添付の図面を参照して詳細に記載される。
図1は、本明細書で記載される少なくともいくつかの実施形態に従って配置される、インタラクティブなソフトウェアプログラム修復に関連した、例となる環境100の概要を表す。環境100は、人間が提供した1つ以上のテストオラクルを生成するよう修復モジュール106と相互作用する人間102を含んでよい。人間102は、プログラマ、ソフトウェア開発者、などのような、ソフトウェアプログラミングの十分な知識を持った如何なる人であってもよい。修復モジュール106は、テストスイート112を用いて1つ以上の欠陥について被試験コード(code under test)104を解析するよう構成されてよい。修復モジュール106は、更に、人間が提供したテストオラクルが加えられている1つ以上の拡張されたテストを含む増補されたテストスイート108を出力又は生成するよう構成されてよく、被試験コード104内の欠陥に対する可能な修復をテストすることをもたらす。いくつかの実施形態では、修復モジュール106は、欠陥を正確に修復する1つ以上のパッチ110を出力又は生成するよう構成されてよい。
被試験コード104は、例えば、ソフトウェアプログラム、ソフトウェアプログラムのコード、ライブラリ、アプリケーション、スクリプト、若しくは他のロジック、又はプロセッシングデバイスによる実行のための命令のような、電子データを含んでよい。いくつかの実施形態では、被試験コード104は、ソフトウェアプログラムの完全なインスタンスを含んでよい。その上、又は代替的に、被試験コード104は、ソフトウェアプログラムの部分を含んでよい。被試験コード104は、ソフトウェアプログラムのために使用され得る如何なる適切なタイプのコンピュータ言語でも記述されてよい。
修復モジュール106は、コンピュータデバイスが被試験コード104内の欠陥に対する1つ以上の可能な修復を実行し、人間102と相互作用して、人間が提供したテストオラクルを夫々加えられている1つ以上の拡張された新しいテストを含む増補されたテストスイート108を生成することを可能にするよう構成されたコード及びルーチンを含んでよい。その上、又は代替的に、修復モジュール106は、コンピュータデバイスが増補されたテストスイート108を用いて被試験コード104内の欠陥に対する可能な修復をテストしてパッチ110を生成することを可能にするよう構成されたコード及びルーチンを含んでよい。いくつかの実施形態では、修復モジュール106は、プロセッサ、マイクロプロセッサ(例えば、1つ以上の動作を実行するか又はその実行を制御するもの)、フィールドプログラマブルゲートアレイ(FPGA)、又は特定用途向け集積回路(ASIC)を含むハードウェアを用いて実装されてよい。いくつかの他の例では、修復モジュール106は、ハードウェアとソフトウェアとの組み合わせを用いて実装されてよい。本開示では、修復モジュール106によって実行されるものとして記載される動作は、修復モジュール106が対応するシステムに実行するよう指示し得る動作を含んでよい。
テストスイート112は、被試験コード104のためのテストケースとなり得る1つ以上のテスト(例えば、ルーチン、関数、など)を含んでよい。テストスイート112は、被試験コード104が特定の様態で動くかどうかを判定するよう構成されてよい。テストスイート112は、如何なる適切な技術にも従って構成されてよい。
修復モジュール106は、テストスイート112の1つ以上のテストを被試験コード104に対して適用して被試験コード104内で1つ以上の欠陥及び対応する欠陥位置を検出又は決定するよう構成されてよい。いくつかの実施形態では、修復モジュール106は、テストスイート112に含まれている1つ以上のテストを実行するよう構成されてよい。これは、テスト実行を実施するとも呼ばれ得る。通過するテスト実行は、“テスト実行合格”と呼ばれてよく、失敗するテスト実行は、“テスト実行落第”と呼ばれてよい。いくつかの実施形態では、被試験コード104の欠陥及び対応する欠陥位置は、1つ以上のテスト実行落第及び1つ以上のテスト実行合格を解析することに基づき特定されてよい。欠陥位置は、対応する欠陥を修復しようと試みるために被試験コード104の変更又は変換が行われ得る被試験コード104内の位置であってよい。
いくつかの実施形態では、修復モジュール106は、被試験コード104内の特定された欠陥及び/又は欠陥位置に優先順位をつけるよう構成されてよい。修復モジュール106は、次いで、特定の欠陥位置を、その特定の欠陥位置の優先順位に基づき、選択してよい。優先順位付けは、可能な修復動作の実行中に欠陥位置の選択の順序を決定するために使用されてよい。より高い優先順位を有している欠陥位置は、より低い優先順位を有している欠陥位置の選択より前に選択されてよい。例えば、修復モジュール106は、異なる欠陥位置の夫々の優先順位を比較してよい。特定の欠陥位置は、残りの欠陥位置の夫々よりも高い優先順位を有することがある。優先順位の比較に基づき、修復モジュール106は、より低い優先順位を有している欠陥位置を選択するのではなく、より高い優先順位を有している特定の欠陥位置を選択してよい。
いくつかの実施形態では、修復モジュール106は、修復テンプレートに基づき、可能な修復動作のうちの1つ以上を実行するよう構成されてよい。修復テンプレートは、如何なる適切なタイプの命令又はルーチンも含んでよい、命令又はルーチンは、実行される場合に、被試験コード104内の欠陥の存在に応答して被試験コード104に対して欠陥位置の1つ以上の変更又はそこでの変換を実施するよう構成されてよい。変更は、欠陥位置での被試験コード104における変更(changes)を含んでよく、そのような変更は、欠陥を修復するか又は修復するよう試みてよい。
いくつかの実施形態では、修復モジュール106は、被試験コード104内の欠陥位置を選択し、選択された欠陥位置で可能な修復動作を実行するよう構成されてよい。欠陥位置は、欠陥位置の優先順位付けに基づき選択されてよい。可能な修復動作は、被試験コード104内の選択された欠陥に関連し得る修復候補に基づいてよい。可能な修復動作は、可能性がある修復(可能性があるパッチ)として、選択された欠陥位置で修復候補を実装することを含んでよい。修復モジュール106は、テストスイート112の1つ以上のテストを用いて欠陥位置で可能性がある修復をテストするよう構成されてよい。修復モジュール106は、可能性がある修復がテストスイート112の中の適用されたテストを通過しない場合には、その可能性がある修復を、欠陥の不適切な修復として捨ててよい。修復モジュール106は、可能性がある修復がテストスイート112の中の適用されたテストを通過する場合には、可能性がある修復を更にテストするように、1つ以上の新しいテストケースを生成し、それらを、人間が提供したテストオラクルにより増補するよう試みるよう構成されてよい。修復モジュール106は、それらの人間が提供したテストオラクルにより増補された新しい自動生成されたテストケースを用いて、可能性がある修復をテストしてよい。修復モジュール106は、可能性がある修復が増補された新たに生成されたテストを通過しない場合には、可能性がある修復を、欠陥の不適切な修復として捨て、可能性がある修復が増補された新たに生成されたテストを通過する場合には、可能性がある修復を、欠陥の適切な修復(例えば、パッチ)として受け入れてよい。
いくつかの実施形態では、修復モジュール106は、次のように、テストスイート112のテストを通過する、被試験コード104内の欠陥に対する可能性がある修復をテストするように、1つ以上の新しい又は更なるテスト(例えば、テストスイート112内のテストに加えて1つ以上のテスト)を生成及び増強するよう構成されてよい。修復モジュール106は、如何なる適切な技術を用いても新しいテストを生成してよい。いくつかの実施形態では、テスト(例えば、新しいテスト)は単体テスト(unit test)であってよい。新しいテストを作ると、修復モジュール106は、その新しいテストに基づきテストオラクルのためのクエリを生成してよい。修復モジュール106は、次いで、テストオラクルのためのクエリを人間102に提示してよい。人間102は、テストオラクルのための提示されたクエリに応答又は返答してよい。例えば、テストオラクルのためのクエリは、視覚的な方法、音声、及び/又は同様のもののような、如何なる適切な技術を用いても、提示され且つ応答を受け取ってよい。修復モジュール106は、テストオラクルのための提示されたクエリ及び提示されたクエリに対する人間102の応答に基づき、人間が提供したテストオラクルを生成してよい。修復モジュール106は、人間が提供したテストオラクルを適切なテストにより含め(例えば、付加し)て、拡張されたテストを生成し、その拡張されたテストをテストスイート112に付加して、増補されたテストスイート108を生成してよい。
例えば、特定された欠陥が被試験コード104内にあり、たまたま、3つの整数の中間値を返す関数“int median(int n1,int n2,int n3)”であるとする。修復モジュール106は、被試験コード104内の欠陥に対応する欠陥位置の可能な修復をテストするよう新しいテスト“median(1,2,3)”を生成してよい。新しいテストについて、修復モジュール106は、クエリ“3つの整数1、2及び3の連続において中間値はどれですか?”を生成してよい。修復モジュール106は、次いで、クエリを人間102に提示してよい。人間102は、“2”が中間値であることを指示又は特定することによって、提示されたクエリへの応答を与えてよい。提示されたクエリに対する人間102の応答に基づき、修復モジュール106は、人間が提供したテストオラクル、例えば、“assert median(1,2,3)==2”を生成してよい。このテストオラクルは、次いで、新しいテストに加えられてよい。新しいテストは、入力1,2,3により関数medianを呼び出し(median(1,2,3)として)、“assert median(1,2,3)==2”において見られるようなオラクルを用いて、返された応答をチェックする。
いくつかの実施形態では、修復モジュール106は、新しいテストに基づきテストオラクルのための仮定(hypothesis)を生成するよう構成されてよい。仮定は、新しいテストの結果に関する提案であってよい。先の例では、新しいテスト“median(1,2,3)”について、修復モジュール106は、提案“3つの整数1、2及び3の連続において中間値は2ですか?”を生成してよい。修復モジュール106は、次いで、提案を人間102に提示してよい。人間102は、肯定応答(acknowledgement)(例えば、“yes”)を与えることによって、提示された仮定への応答を与えてよい。提示された仮定に対する人間102の応答に基づき、修復モジュール106は、人間が提供したテストオラクル、例えば、“assert median(1,2,3)==2”を生成してよい。これは、新しいテストを拡張するよう、新しいテストに加えられてよい。それらの又は他の実施形態において、拡張された新しいテストは、増補されたテストスイート108を生成するよう、テストスイート112に加えられてよい。
いくつかの実施形態では、修復モジュール106は、人間が提供したテストオラクルを伴った拡張された新しいテストを含む増補されたテストスイート108を用いて、欠陥位置で、可能な修復をテストしてよい。修復モジュール106は、可能な修復が増補されたテストスイート108を通過することに応答して、可能な修復を適切な修復として受け入れるよう構成されてよい。いくつかの実施形態では、修復モジュール106は、被試験コード104内の欠陥に対する可能性がある修復をテストするように、人間が提供したテストオラクルを伴った複数の拡張された新しいテストを生成するよう試みるよう構成されてよい。例えば、第1の人間が提供したテストオラクルを伴った第1の拡張された新しいテストを用いて可能な修復をテストした後、修復モジュール106は、第2の新しいテストを生成して、可能な修復をテストするよう試みてよい。修復モジュール106が第2の新しいテストを生成することができる場合には、修復モジュール106は、その第2の新しいテストに基づき第2の人間が提供したテストオラクルを生成し、第2の人間が提供したテストオラクルを第2の新しいテストに加えて、拡張された第2の新しいテストを生成してよい。修復モジュール106は、拡張された第2の新しいテストを、増補されたテストスイート108に加えるよう構成されてよい。修復モジュール106は、次いで、第2の人間が提供したテストオラクルを伴った拡張された第2の新しいテストを含む増補されたテストスイート108を用いて、可能な修復をテストしてよい。
選択された欠陥位置を処理し、ことによると、欠陥のための受け入れ可能な修復を見つけられなかった場合には、修復モジュール106は、被試験コード104内の新しい欠陥位置を選択し、新たに選択された欠陥位置での可能な修復動作を実行するよう構成されてよい。新しい欠陥位置は、欠陥位置の優先順位に基づき選択されてよい。例えば、新しい欠陥位置は、被試験コード104内の残りの欠陥位置の中で最も高い優先順位を有している欠陥位置であってよい。可能な修復動作は、被試験コード104内の新たに選択された欠陥位置と関連し得る修復候補に基づいてよい。可能な修復動作は、新たに選択された欠陥位置での修復候補を、可能性がある修復(可能なパッチ)として実装することを含んでよい。修復モジュール106は、次いで、本明細書で記載されるのと同様にして、新たに選択された欠陥位置を処理してよい。
いくつかの実施形態では、修復モジュール106は、欠陥のための複数のパッチを生成するよう構成されてよい。すなわち、修復モジュールは、欠陥位置での1つ以上の可能な修復を欠陥の適切な修復(パッチ)として受け入れてよい。欠陥位置での適切な修復として修復候補に基づきその欠陥位置での可能な修復を受け入れた後、修復モジュール106は、その欠陥位置のための更なる修復候補が存在するかどうかを判定するよう構成されてよい。更なる修復候補が存在する場合には、修復モジュール106は、更なる修復候補に基づき欠陥位置での可能な修復を生成し、その可能な修復を増補されたテストスイートに対してテストして、場合により、欠陥位置での複数の可能な修復を欠陥の複数のパッチとして受け入れる上記のプロセスを繰り返すよう構成されてよい。修復モジュール106は、欠陥位置のための如何なる追加の修復候補(例えば、第3、第4、など)も処理するよう構成されてよい。
いくつかの実施形態では、修復モジュール106は、欠陥のための1つ以上のパッチをパッチ110に含めるよう構成されてよい。いくつかの実施形態では、修復モジュール106は、1つ以上の更なる欠陥のための1つ以上のパッチをパッチ110に含めるよう構成されてよい。すなわち、パッチ110は、被試験コード104内の複数の欠陥のための1つ以上のパッチを含んでよい。
いくつかの実施形態では、修復モジュール106は、前に受け入れられた修復(前に受け入れられた可能な修復)を増補されたテストスイート108に対してテストして、前に受け入れられた修復を取り除くよう構成されてよい。修復モジュール106は、増補されたテストスイート108に対してテストされていなかった適切な修復を増補されたテストスイート108に対してテストして、その適切な修復が増補されたテストスイート108を通過するかどうかを判定してよい。適切な修復が増補されたテストスイート108を通過しない場合には、修復モジュール106は、その適切な修復を、不適切な修復であるとして拒絶してよい。適切な修復が増補されたテストスイート108を通過する場合には、修復モジュール106は、その適切な修復を適切な修復として再び受け入れてよい。
いくつかの実施形態では、修復モジュール106は、被試験コード104内の1つ以上の欠陥を直すように被試験コード104に対する変更(例えば、変換)を含む変更された被試験コードを出力するよう構成されてよい。
変更、追加、又は省略が、本開示の適用範囲から外れることなしに、図1に対して行われてよい。例えば、環境100は、本開示で図解及び記載されているものよりも多い又は少ない要素を含んでよい。その上、いくつかの実施形態では、修復モジュールの1つ以上のルーチン、1つ以上の命令、又はコードの少なくとも一部分と、テストスイート112とは、それらが同じ要素と見なされ得るか、あるいは、修復モジュール106及びテストスイート112の2つ以上の部分と見なされ得る共通のセクションを有し得るように、組み合わされてよい。例えば、増補されたテストスイート108は、欠陥又は複数の欠陥をテストするよう、様々な数の、人間が提供したテストオラクルを含んでよい。他の例では、パッチ110は、欠陥又は複数の欠陥に対するパッチ(適切な修復)をいくつでも含んでよい。
図2は、本明細書で記載される少なくともいくつかの実施形態に従って配置される、ソフトウェアプログラムを修復するよう構成され得る、例となる汎用コンピュータシステム202の選択されたコンポーネントを表す。コンピュータシステム202は、修復モジュール(例えば、図1の修復モジュール106)と関連する1つ以上の動作を実装又は指示するよう構成されてよい。コンピュータシステム202は、プロセッサ250、メモリ252、及びデータストレージ254を含んでよい。プロセッサ250、メモリ252、及びデータストレージ254は、通信上結合されてよい。
一般に、プロセッサ250は、様々なコンピュータハードウェア又はソフトウェアモジュールを含む如何なる適切な専用又は汎用コンピュータ、コンピュータエンティティ、又はコンピュータ若しくはプロセッシングデバイスも含んでよく、如何なる適切なコンピュータ可読記憶媒体においても記憶された命令を実行するよう構成されてよい。例えば、プロセッサ250は、マイクロプロセッサ、マイクロコントローラ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、あるいは、プログラム命令を解釈するよう及び/若しくは実行するよう並びに/又はデータを処理するよう構成された如何なる他のデジタル又はアナログ回路構成も含んでよい。図2では単一のプロセッサとして表されているが、プロセッサ250は、本開示で記載される動作をいくつでも個々に又は集合的に実行するか又はそのような実行を指示するよう構成されるプロセッサをいくつでも含んでよい。その上、プロセッサの1つ以上は、1つ以上の異なる電子デバイス、例えば、異なるサーバにおいて存在してよい。
いくつかの実施形態では、プロセッサ250は、メモリ252、データストレージ254、又はメモリ252及びデータストレージ254に記憶されているプログラム命令を解釈及び/若しくは実行し、並びに/又はそのように記憶されているデータを処理するよう構成されてよい。いくつかの実施形態では、プロセッサ250は、データストレージ254からプログラム命令をフェッチし、プログラム命令をメモリ252にロードしてよい。プログラム命令がメモリ252にロードされた後、プロセッサ250はプログラム命令を実行してよい。
例えば、いくつかの実施形態では、修復モジュールは、プログラム命令としてデータストレージ254に含まれてよい。プロセッサ250は、修復モジュールのプログラム命令をデータストレージ254からフェッチしてよく、そして、修復モジュールのプログラム命令をメモリ252にロードしてよい。修復モジュールのプログラム命令がメモリ252にロードされた後、プロセッサ250は、コンピュータシステムが、命令によって指示されるように、修復モジュールに関連した動作を実装し得るように、プログラム命令を実行してよい。
メモリ252及びデータストレージ254は、コンピュータ実行可能な命令又はデータ構造を搬送するか、又はそれらが記憶されているコンピュータ可読記憶媒体を含んでよい。そのようなコンピュータ可読記憶媒体は、プロセッサ250のような汎用又は専用のコンピュータによってアクセスされ得る如何なる利用可能な媒体も含んでよい。一例として、制限なしに、そのようなコンピュータ可読記憶媒体には、ランダムアクセスメモリ(RAM)、リードオンリーメモリ(ROM)、電気的消去可能なプログラム可能リードオンリーメモリ(EEPROM)、コンパクトディスク・リードオンリーメモリ(CD-ROM)若しくは他の光ディスクストレージ、磁気ディスクストレージ若しくは他の磁気記憶デバイス、フラッシュメモリデバイス(例えば、固体状態メモリデバイス)、あるいは、コンピュータ実行可能な命令又はデータ構造の形で特定のプログラムコードを搬送又は記憶するために使用され得、且つ、汎用又は専用のコンピュータによってアクセスされ得る如何なる他の記憶媒体も含む有形又は非一時的なコンピュータ可読記憶媒体が含まれ得る。上記の組み合わせも、コンピュータ可読記憶媒体の適用範囲内に含まれ得る。コンピュータ実行可能命令は、例えば、プロセッサ250に特定の動作又は動作群を実行させるよう構成される命令及びデータを含んでよい。
変更、追加、又は省略は、本開示の適用範囲から外れることなしに、コンピュータシステム202に対して行われてよい。例えば、いくつかの実施形態では、コンピュータシステム202は、明示的に図解又は記載され得ない他のコンポーネントをいくつでも含んでよい。
図3A及び3Bは、本明細書で記載される少なくともいくつかの実施形態に従って配置される、ソフトウェアプログラムをインタラクティブに修復するプロセスを例示するフロー図300である。例となるプロセス及び方法は、ブロック302、304、306、308、310、312、314、316、318、320、322、324、326、328、330、及び/又は332の1つ以上によって表される1つ以上の動作、関数、又はアクションを含んでよい。ブロック302~332で記載される動作は、ソフトウェアプログラム(例えば、図1の被試験コード104)に関して如何なる適切なシステム、装置、又はデバイスによっても実行されてよい。例えば、いくつかの実施形態では、ブロック302~332で記載される動作は、図1の修復モジュール106、又は(修復モジュールによって指示される)図2のコンピュータシステム202のようなコンピュータシステムによって実行されてよい。ブロック302~332で記載される動作はまた、コンピュータシステム202のメモリ252及び/又はデータストレージ254のようなコンピュータ可読媒体において、コンピュータ実行可能な命令として記憶されてよい。
フロー図300によって表されているように、ソフトウェアプログラムをインタラクティブに修復するプロセスの例は、ブロック302(“欠陥位置を選択する”)から開始してよい。ブロック302で、修復モジュール(例えば、図1の修復モジュール106)は、修復されているソフトウェアプログラム(例えば、図1の被試験コード104)において欠陥位置を選択してよい。1つ以上の欠陥及び対応する欠陥位置は、如何なる適切な技術を用いてもソフトウェアプログラムにおいて特定されてよい。例えば、いくつかの実施形態では、欠陥の特定は、ソフトウェアプログラムに関して1つ以上のテストスイート(例えば、図1のテストスイート112)のテスト実行の結果起こってよい。
いくつかの実施形態では、修復モジュールは、特定された欠陥及び/又は対応する欠陥位置の優先順位に基づき、特定の欠陥位置を選択してよい。優先順位は、ソフトウェアプログラムのインタラクティブな修復の実行の間に、修復候補の実装のための特定の欠陥位置の選択の順序を決定してよい。例えば、修復モジュールは、特定された欠陥位置の夫々の優先順位を比較してよい。特定の欠陥位置は、残りの欠陥位置の夫々よりも高い優先順位を有してよい。優先順位の比較に基づき、修復モジュールは、より低い優先順位を有している欠陥位置を選択する代わりに、より高い優先順位を有している特定の欠陥位置を選択してよい。修復モジュールは、選択された欠陥位置での修復候補を、可能性がある修復として実装してよい。
ブロック302の後には、ブロック304(“修復候補を選択し、可能な修復を実装する”)が続いてよい。ブロック304で、修復モジュールは、修復候補を選択し、その選択された修復候補を用いて可能な修復を実装してよい。修復モジュールは、選択された欠陥位置での修復候補を、欠陥位置に対応する欠陥の可能な修復として実装してよい。いくつかの実施形態では、修復モジュールは、本明細書で記載されるように、修復テンプレートに基づき修復候補を実装してよい。
ブロック304の後には、ブロック306(“テストスイートを実行する”)が続いてよい。ブロック306で、修復モジュールは、欠陥位置での可能な修復に対してテストスイート(図1のテストスイート112)の中の1つ以上のテストを実行してよい。可能な修復をテストすることは、可能な修復を含むソフトウェアプログラムの一部又は全てをテストすることを含んでよい。可能な修復及び/又は可能な修復を含むソフトウェアプログラムの一部若しくは全てをテストすることは、テストされたソフトウェアプログラム及び/又は可能な修復がテストスイートの中のテストを通過するかどうかといった、テストされたソフトウェアプログラム及び/又は可能な修復に関する情報を生成してよい。
ブロック306の後には、決定ブロック308(“全てのテストを通過したか?”)が続いてよい。決定ブロック308で、修復モジュールは、選択された欠陥位置での可能な修復がテストスイートの中のテストを通過するかどうかを判定してよい。例えば、修復モジュールは、可能な修復がテストスイートを通過するかどうかを判定するよう、可能な修復に対して実行されたテストの夫々を試験してよい。選択された欠陥位置での可能な修復がテストスイートの中の全てのテストを通過する場合には、決定ブロック308の後に決定ブロック310(“テストスイートを増補するテストが存在するか?”)が続いてよい。決定ブロック310で、修復モジュールは、テストスイートを増補する追加の(例えば、新しい)テストが存在するかどうかを判定してよい。すなわち、修復モジュールは、欠陥位置での可能な修復をテストする追加のテストが存在するかどうかを判定してよい。
いくつかの実施形態では、修復モジュールは、如何なる適切な技術を用いても、追加のテストを生成するよう構成されてよい。例えば、修復モジュールは、記号実行に基づくテスト生成技術、検索に基づくテスト生成技術、又はそれらの技術の何らかの組み合わせを用いて、追加のテストを生成してよい。いくつかの実施形態では、修復モジュールは、修復されているソフトウェアプログラム及び/又は可能な修復における全ての実行経路が働かされない限りは、追加のテストを生成するよう構成されてよい。すなわち、修復モジュールは、修復されているソフトウェアプログラム及び/又は可能な修復における全ての実行経路が働かされると、追加のテストを生成することを中止するよう構成されてよい。いくつかの実施形態では、修復モジュールは、修復されているソフトウェアプログラム及び/又は可能な修復における実行経路のうちの特定の割合が働かされない限りは、追加のテストを生成するよう構成されてよい。すなわち、修復モジュールは、修復されているソフトウェアプログラム及び/又は可能な修復のうちの特定の割合(例えば、95%、90%、85%、80%、など)が働かされると、追加のテストを生成することを中止するよう構成されてよい。いくつかの実施形態では、修復モジュールは、テストの数が特定の数に達するまで、追加のテストを生成するよう構成されてよい。いくつかの実施形態では、修復モジュールは、修復モジュールが新しいテストを生成することができなくなるまで、追加のテストを生成するよう構成されてよい。
テストスイートを増補する追加の(例えば、新しい)テストが存在する場合には、決定ブロック310の後にブロック312(“新しいテストをテストスイートに加える”)が続いてよい。ブロック312で、修復モジュールは、追加のテストを生成し、その新しいテストをテストスイートに加えてよい。例えば、テストスイートは、ブロック306で可能な修復をテストするために使用されたテストスイート(例えば、図1のテストスイート112)であってよい。いくつかの実施形態では、テストスイートは、人間が提供したテストオラクルにより拡張されたテストケースにより以前に増補されたテストスイート(図1の増補されたテストスイート108)であってよい。
ブロック312の後には、ブロック314(“人間からテストオラクルを得る”)が続いてよい。ブロック314で、修復モジュールは、新たに生成されたテストケースについて人間(例えば、図1の人間102)からテストオラクルを取得してよい。いくつかの実施形態では、修復モジュールは、追加のテストに基づきテストオラクルのためのクエリを生成してよい。例えば、クエリは、追加のテストの実行の結果を要求してよい。修復モジュールは、クエリを人間に提示し、提示されたクエリに対する人間の応答を取得してよい。修復モジュールは、次いで、提示されたクエリ及び人間の対応する応答に基づき、人間が提供したテストオラクルを生成してよい。いくつかの実施形態では、修復モジュールは、提示されたクエリに人間が応答(例えば、回答)しないか又はそうすることができない場合に、提示されたクエリをスキップするよう構成されてよい。例えば、修復モジュールは、提示されたクエリに対する応答を受けるよう、特定量の時間(例えば、30秒、1分、など)だけ待ってよい。いくつかの実施形態では、修復モジュールは、提示されたクエリに対して人間が応答しないか又はそうすることができない場合に、追加のテストを生成すること、及び生成された追加のテストに対応するクエリを提示することを続けるよう構成されてよい。いくつかの実施形態では、修復モジュールは、提示されたクエリに対して人間が応答しないか又はそうすることができない場合に、提示されたクエリと同じ入力スペースに異なる(例えば、他の)クエリを生成し提示するよう構成されてよい。いくつかの実施形態では、提示されたクエリに対して人間が応答しないか又はそうすることができない場合に、欠陥位置(例えば、現在の欠陥位置)をスキップし、次の(例えば、他の)欠陥位置を処理するよう構成されてよい。
ブロック315(“新しいテストを拡張する”)で、修復モジュールは、人間が提供したテストオラクルを新しいテストに加えることによって、新しいテストを拡張してよい。修復モジュールは、次いで、拡張された新しいテストをテストスイートに含めることによって、テストスイートを増補してよい。ブロック315の後には、ブロック316(“増補されたテストスイートを実行する”)が続いてよい。ブロック316で、修復モジュールは、欠陥位置での可能な修復に対して、人間が提供したテストオラクルにより拡張された更なるテストを含む増補されたテストスイートを実行してよい。いくつかの実施形態では、修復モジュールは、新たに生成された拡張されたテストに対して、欠陥位置での可能な修復をテストしてよい。いくつかの実施形態では、修復モジュールは、人間が提供したテストオラクルにより拡張されている拡張された新たに生成されたテストを含む増補されたテストスイートの中の一部又は全てのテストに対して、欠陥位置での可能な修復をテストしてよい。テストされたテストは、人間が提供したテストオラクルにより拡張された1つ以上の前に生成されたテストを含んでよい。可能な修復をテストすることは、可能な修復を含むソフトウェアプログラムの一部又は全てをテストすることを含んでよい。可能な修復及び/又は可能な修復を含むソフトウェアプログラムの一部若しくは全てをテストすることは、テストされたソフトウェアプログラム及び/又は可能な修復が増補されたテストスイートの中のテストを通過するかどうかといった、テストされたソフトウェアプログラム及び/又は可能な修復に関する情報を生成してよい。
ブロック316の後には、決定ブロック320(“全てのテストを通過したか?”)が続いてよい。決定ブロック320で、修復モジュールは、選択された欠陥位置での可能な修復が増補されたテストスイートの中のテストを通過するかどうかを判定してよい。例えば、修復モジュールは、選択された欠陥位置での可能な修復が、拡張された新たに生成されたテストを通過するかどうかを判定してよい。例えば、修復モジュールは、選択された欠陥位置での可能な修復が増補されたテストスイートを通過するかどうかを判定するよう、可能な修復に対して実行されたテストの夫々を試験してよい。選択された欠陥位置での可能な修復が(拡張された新たに生成されたテストを含む)増補されたテストスイートの中のテストを通過する場合には、決定ブロック320の後に決定ブロック310が続いてよい。決定ブロック310で、修復モジュールは、増補されたテストスイートを更に増補するようその増補されたテストスイートに加えられ得る他の人間が提供したテストオラクルにより拡張すべき他の追加の(例えば、他の新しい)テストが存在するかどうかを判定してよい。すなわち、修復モジュールは、他のテストが存在するかどうかを判定してよく、該他のテストは、人間が提供したテストオラクルのための基礎であってよく、且つ、欠陥位置での可能な修復を更にテストするよう対応する人間が提供したテストオラクルにより拡張され得る。この例では、修復モジュールは、増補されたテストスイートを、対応する人間が提供したテストオラクルにより拡張される更なる拡張されたテストにより充実させること又は強化させることであってよい。更なる拡張されたテスト(例えば、生成されたテスト及びその対応する人間が提供したテストオラクル)は、欠陥の適切な修復(パッチ)としての選択された欠陥位置での可能な修復を拒絶するために使用されてよい。例えば、可能な修復は、第1の人間が提供したテストオラクルを伴った第1の拡張されたテストには合格し、そして、第2の人間が提供したテストオラクルを伴った第2の拡張されたテストには落第することがある。この例では、可能な修復が、第2の人間が提供したテストオラクルを伴った第2の拡張されたテストに対してテストされない場合に、可能な修復は、たとえそれが適切な修復でない(例えば、パッチでない)としても、適切な修復として誤って受け入れられ得る。
さもなければ、選択された欠陥位置での可能な修復が増補されたテストスイートの中のテストを通過しない場合に、決定ブロック320の後にはブロック322(“可能な修復を拒絶する”)が続いてよい。ブロック322で、修復モジュールは、選択された欠陥位置での可能な修復を不適切な修復として拒絶してよい。修復モジュールは、可能な修復の基礎となった修復候補を、不適切又は不正確な修復を生成するものとして捨ててよい。ブロック322の後には、以下で更に記載されるように、決定ブロック328が続いてよい。
さもなければ、決定ブロック310で、修復モジュールが、テストスイートを増補する追加の(例えば、新しい)テストは存在しないと決定する場合に、決定ブロック310の後にはブロック324(“可能な修復を受け入れる”)が続いてよい。ブロック324で、修復モジュールは、選択された欠陥位置での可能な修復を適切な修復(パッチ)として受け入れてよい。修復モジュールは、可能な修復の基礎となった修復候補を、適切又は正確な修復を生成するものとして受け入れてよい。修復モジュールは、受け入れられた可能な修復を適切な修復(パッチ)としてパッチ110に含めてよい。上述されたように、決定ブロック310はまた、修復モジュールが、増補されたテストスイートの中を増補するよう他の追加の(例えば、他の新しい)テストが存在するかどうかを判定するよう確認し得る場合において、決定ブロック320から続いてよい。
ブロック324の後には、決定ブロック326(“更なる修復を生成するか?”)が続いてよい。決定ブロック326で、修復モジュールは、それが、選択された欠陥位置で追加の可能な修復を生成しようと試みるべきかどうかを判定してよい。選択された欠陥位置での可能な修復をパッチとして受け入れた後、修復モジュールは、それが、選択された欠陥位置で、まさに受け入れられたパッチ以外の他の追加のパッチを生成しようと試みるべきかどうかを判定してよい。例えば、修復モジュールは、新たに生成されたテストが前に受け入れられた可能な修復(例えば、前のパッチ)を無効にし得るということで、選択された欠陥位置での複数の可能な修復(例えば、欠陥のための複数のパッチ)を生成しようと試みてよい。いくつかの実施形態では、修復モジュールは、特定の計算量を費やした後には、選択された欠陥位置で追加の可能な修復をしようと試みないよう構成されてよい。特定の計算量の一例として、修復モジュールは、選択された欠陥位置で追加の可能な修復を生成しようと試みるのにn時間よりも多く費やさないように構成されてよい。特定の計算量の他の例として、修復モジュールは、選択された欠陥位置でm個のパッチを生成した後には、選択された欠陥位置で追加の可能な修復を生成しようと試みないよう構成されてよい。特定の計算量の更なる他の例として、修復モジュールは、最後のp個のパッチが新しいテストが生成されることをもたらさないとの決定時には、選択された欠陥位置で追加の可能な修復を生成しようと試みないよう構成されてよい。これは、増補されたテストスイートが十分にロバストであり、且つ/あるいは、可能性がある修復を拒絶すること又は前のパッチを無効にすることがありそうもないことを示し得る。特定の計算量は、前述の例のうちの2つ以上の如何なる組み合わせであってもよい。いくつかの実施形態では、n、m、及び/又はpの値は、実験によって得られるデータに基づき設定されてよい。いくつかの実施形態では、n、m、及び/又はpの値は、任意に設定されてよい。
選択された欠陥位置で追加の可能な修復を生成しようと試みるべきであると修復モジュールが決定する場合には、決定ブロック326の後に決定ブロック328(“更なる修復候補はあるか?”)が続いてよい。決定ブロック328で、修復モジュールは、選択された欠陥位置で他の可能な修復として実装され得る他の(例えば、追加の)修復候補が存在するかどうかを判定してよい。決定ブロック328はまた、選択された欠陥位置での可能な修復がテストスイートの中の全てのテストを通過しない場合に、決定ブロック308から続いてよい。決定ブロック328はまた、修復モジュールが選択された欠陥位置での可能な修復を不適切な修復として拒絶するブロック322から続いてよい。選択された欠陥位置で他の可能な修復として実装され得る追加の修復候補が存在すると修復モジュールが決定する場合には、決定ブロック328の後にブロック304が続く。ブロック304で、修復モジュールは、その追加の修復候補を用いて、選択された欠陥位置で追加の可能な修復を実装してよい。修復モジュールは、選択された欠陥位置での追加の修復候補を、その欠陥位置に対応する欠陥の他の可能な修復として実装してよい。修復モジュールは、本明細書で記載されるように、次いで、追加の可能な修復をテストしてよい。
さもなければ、選択された欠陥位置で他の可能な修復として実装され得る追加の修復候補が存在しないと修復モジュールが決定する場合に、決定ブロック328の後には決定ブロック330(“更なる欠陥位置はあるか?”)が続いてよい。決定ブロック330で、修復モジュールは、修復され得るソフトウェアプログラム内の他の欠陥位置が存在するかどうかを判定してよい。決定ブロック330はまた、選択された欠陥位置で追加の可能な修復を生成しようと試みるべきでないと修復モジュールが決定する場合に、決定ブロック326から続いてよい。修復されているソフトウェアプログラムにおいて他の欠陥位置が存在すると修復モジュールが決定する場合には、決定ブロック330の後にブロック302が続いてよい。ブロック302で、修復モジュールは、処理のために修復されているソフトウェアプログラムにおいて他の(例えば、新しい)欠陥位置を選択してよい。例えば、修復モジュールは、次に高い優先順位を有している欠陥位置を新しい欠陥位置として選択してよい。修復モジュールは、本明細書で記載されるように、次いで、選択された新しい欠陥位置を特定の欠陥位置として処理してよい(例えば、新しい欠陥位置は、現在の特定の欠陥位置を新しい特定の欠陥位置として置換する。)。
さもなければ、修復されているソフトウェアプログラムにおいて追加の欠陥位置が存在しないと修復モジュールが決定する場合に、決定ブロック330の後にはブロック332(“パッチを出力する”)が続いてよい。ブロック332で、修復モジュールは、ソフトウェアプログラムの修復の間に生成されたパッチ(例えば、パッチ110)を出力してよい。出力されたパッチは、単一の修復位置に対するパッチを含んでよい。出力されたパッチは、複数の修復位置に対するパッチを含んでよい。出力されたパッチは、夫々の修復位置について1つのパッチを含んでよい。いくつかの実施形態では、修復モジュールはまた、ソフトウェアプログラムの修復の間に生成されたそれらの対応する人間が提供したテストオラクルにより拡張された新たに生成されたテストケースを含む増補されたテストスイート(例えば、増補されたテストスイート108)を出力してよい。増補されたテストスイートは、次いで、他のソフトウェアプログラムにおいて欠陥及び対応する欠陥位置を特定するために使用されてよい。
当業者に明らかなように、本明細書で開示されているこの及び他のプロセス及び方法について、プロセス及び方法で実行される動作は、異なる順序で実施されてよい。その上、又は代替的に、2つ以上の動作は、同時に実行されてよい。更には、説明されているアクション及び動作は、単に例として与えられており、アクション及び動作の一部は、開示されている実施形態の本質から逸脱することなしに、任意であり、より少ないアクション及び動作にまとめられ、あるいは、更なるアクション及び動作に拡張されてよい。
その上、いくつかの実施形態では、プロセス及び方法において実行される動作は、繰り返し実行されてよい。その場合に、一度に1つの欠陥位置及び/又は修復候補が解析されてよい。その上、又は代替的に、1つ以上のブロックに関連する1つ以上の動作は、一度に複数の欠陥位置及び/又は修復候補に対して実行されてよい。
例えば、例となるインタラクティブな修復プロセスとして、修復モジュールは、ソフトウェアプログラムをインタラクティブに修復してよく、次のソフトウェアプログラムにおいて次の欠陥を処理してよい:

int median(int n1,int n2,int n3){
//n1が中間値である
if(n2<=n1 && n1<=n3)
return n1;
//n2が中間値である
if((n1<n2 && n2<=n3)||(n3<=n2 && n2<n1))
return n2;
//上記以外で、n3が中間値である
return n3;
}

上記の欠陥のあるソフトウェアプログラムは、3つの整数の中間値を返す関数を含み、欠陥(例えば、欠陥は、if(n2<=n1 && n1<=n3) return n1の記述である。)を含む。欠陥及び対応する欠陥位置(例えば、上記の欠陥位置)は、以下のテストスイートを用いて特定され得る:

void test1(){
//テスト3つの異なる数
assert(median(2,6,8)==6);
}
void test2(){
//テスト3つの異なる数
assert(median(9,9,9)==9);
}
void test3(){
//テスト3つの異なる値
assert(median(8,8,2)==8);
}

例えば、上記のテストスイートを適用すると、関数は、テスト“median(8,8,2)”に応答して値“8”の代わりに値“2”を返し、アサーション“assert(median(8,8,2)==8)”に落第する。
修復モジュールは、次の可能な修復[1]を実装することによって、欠陥を修復又は回復しようと試みてよい:

replace
if((n1<n2 && n2<=n3)||(n3<=n2 && n2<n1))
return n2;

with
if((n1<n2 && n2<=n3)||(n1==n2))
return n2; [1]

修復モジュールは、可能な修復[1]を含む関数をテストスイートに対してテストしてよい。可能な修復[1]を含む関数は、テストスイートの中の3つのテストを通過する。可能な修復[1]を適切な修復として受け入れることよりむしろ、修復モジュールは、可能な修復[1]を更にテストするように追加のテストを生成しようと試みてよい。
例えば、修復モジュールは、可能な修復[1]をテストするよう第1の追加のテスト“median(8,6,2)”(最初のテスト内の引数を並べ替えるテスト)を生成してよい。修復モジュールは、第1の追加のテストに基づきクエリ“3つの数8、6及び2の中で中間値はどれですか?”を生成してよい。修復モジュールはクエリを人間に提示し、人間は応答“数6”を供給し得る。修復モジュールは、次いで、第1の追加のテストに関連するクエリ及び人間の応答に基づき、人間が提供したテストオラクル“assert(median(8,6,2)==6)”を生成し、第1の人間が提供したテストオラクルを第1の追加のテストにより含めて、以下のように、第1の追加のテストをテストスイート内の第4のテストとして増補してよい:

void test1(){
//テスト3つの異なる数
assert(median(2,6,8)==6);
}
void test2(){
//テスト3つの異なる数
assert(median(9,9,9)==9);
}
void test3(){
//テスト3つの異なる値
assert(median(8,8,2)==8);
}
void test4(){
//test1の引数が置換されたテスト
assert(median(8,6,2)==6);
}
すなわち、修復モジュールは、テストスイートの中のテスト及び第1の人間が提供したテストオラクルを含む拡張された最初のテスト(例えば、第4のテスト)に基づき、増補されたテストスイートを生成してよい。修復モジュールは、次いで、可能な修復[1]を含む関数を、増補されたテストスイートに対して(例えば、最初の3つのテストケースと、その人間が提供したテストオラクルを伴った新たに生成された第4のテストとに対して)テストしてよい。増補されたテストスイートに対してテストされると、関数(例えば、可能な修復[1])は、第1の追加のテスト(median(8,6,2))に応答して値“6”の代わりに値“2”を返し、第1の人間が提供したテストオラクル“assert(median(8,6,2)==6)”に落第する。関数が増補されたテストスイートに落第した結果として、修復モジュールは、可能な修復[1]を不適切な修復として捨ててよい。
修復モジュールは、再び、次の可能な修復[2]を実装することによって、欠陥を修復又は回復しようと試みてよい:

replace
if(n2<=n1 && n1<=n3)
return n1

with
if((n2<=n1 && n1<=n3)||(n1==n2))
return n1; [2]

修復モジュールは、可能な修復[2]を含む関数を、第1の人間が提供したテストオラクルを伴った第1の拡張されたテストを含む増補されたテストスイートに対してテストしてよい。可能な修復[2]を含む関数は、増補されたテストスイートの中の4つのテストを通過する。可能な修復[2]を適切な修復として受け入れることよりむしろ、修復モジュールは、可能な修復[2]を更にテストするように他の追加のテストを生成しようと試みてよい。
例えば、修復モジュールは、可能な修復[2]をテストするよう第2の追加のテスト“median(6,8,2)”(最初のテスト内の引数を更に並べ替えるテスト)を生成してよい。修復モジュールは、第2の追加のテストに基づきクエリ“3つの数6、8及び2の中で中間値はどれですか?”を生成してよい。修復モジュールはクエリを人間に提示し、人間は応答“数6”を供給し得る。修復モジュールは、次いで、第2の追加のテストに関連するクエリ及び人間の応答に基づき、人間が提供したテストオラクル“assert(median(6,8,2)==6)”を生成し、第2の人間が提供したテストオラクルを第2の追加のテストにより含めて、以下のように、第2の追加のテストをテストスイート内の第5のテストとして増補してよい:

void test1(){
//テスト3つの異なる数
assert(median(2,6,8)==6);
}
void test2(){
//テスト3つの異なる数
assert(median(9,9,9)==9);
}
void test3(){
//テスト3つの異なる値
assert(median(8,8,2)==8);
}
void test4(){
//test1の引数が置換されたテスト
assert(median(8,6,2)==6);
}
void test5(){
//test1の引数が置換されたテスト
assert(median(6,8,2)==6);
}

修復モジュールは、次いで、可能な修復[2]を含む関数を、増補されたテストスイート(例えば、前から存在する4つのテストに加えて第5のテストを含む。)に対してテストしてよい。増補されたテストスイートに対してテストされると、関数(例えば、可能な修復[2])は、第2の追加のテスト(median(6,8,2))に応答して値“6”の代わりに値“2”を返し、第2の人間が提供したテストオラクル“assert(median(6,8,2)==6)”に落第する。関数が増補されたテストスイートに落第した結果として、修復モジュールは、可能な修復[2]を不適切な修復として捨ててよい。
修復モジュールは、再び、次の可能な修復[3]を実装することによって、欠陥を修復又は回復しようと試みてよい:

replace
if(n2<=n1 && n1<=n3)
return n1

with
if((n2<=n1 && n1<=n3)||(n3<=n1 && n1<=n2))
return n1; [3]

修復モジュールは、可能な修復[3]を含む関数を、第2の人間が提供したテストオラクルを伴った第2の追加のテスト(例えば、第5のテスト)を含む増補されたテストスイートに対してテストしてよい。可能な修復[3]を含む関数は、増補されたテストスイートの中の5つのテストを通過する。修復モジュールは、次いで、可能な修復[3]を含む関数を更にテストするために追加のテストが必要とされないと決定してよい。例えば、修復モジュールは、増補されたテストスイートが十分にロバストであると決定してよい。然るに、修復モジュールは、可能な修復[3]を欠陥位置での適切な修復(パッチ)として受け入れてよい。
図4は、本明細書で記載される少なくともいくつかの実施形態に従って配置される、前に受け入れられた修復を増補されたテストスイートを用いて再テストするプロセスを例示するフロー図400である。例となるプロセス及び方法は、ブロック402、404、406、408、及び/又は410の1つ以上によって表される1つ以上の動作、関数、又はアクションを含んでよい。ブロック402~410で記載される動作は、ソフトウェアプログラム(例えば、図1の被試験コード104)に関して如何なる適切なシステム、装置、又はデバイスによっても実行されてよい。例えば、いくつかの実施形態では、ブロック402~410で記載される動作は、図1の修復モジュール106、又は(修復モジュールによって指示される)図2のコンピュータシステム202のようなコンピュータシステムによって実行されてよい。ブロック402~410で記載される動作はまた、コンピュータシステム202のメモリ252及び/又はデータストレージ254のようなコンピュータ可読媒体において、コンピュータ実行可能な命令として記憶されてよい。
フロー図400によって表されているように、前に受け入れられた修復を増補されたテストスイートを用いて再テストするプロセスの例は、ブロック402(“前に受け入れられた修復(パッチ)を読み出す”)から開始してよい。ブロック402で、修復モジュール(例えば、図1の修復モジュール106)は、増補されたテストスイートに対してテストすべき、前に受け入れられた修復(例えば、欠陥位置での前に受け入れられた可能な修復)を読み出してよい。増補されたテストスイートは、1つ以上のテスト(例えば、人間が提供したテストオラクル)を含んでよく、前に受け入れられた修復は、増補されたテストスイート内のテストの1つ以上に対してテストされたことがない可能性がある。
ブロック402の後には、ブロック404(“増補されたテストスイートを実行する”)が続いてよい。ブロック404で、修復モジュールは、読み出された、前に受け入れられた修復を、増補されたテストスイートに対してテストしてよい。修復モジュールは、前に受け入れられた修復が依然として適切な修復(パッチ)であるかどうかを判定するよう、前に受け入れられた修復を増補されたテストスイートに対してテストしてよい。
ブロック404の後には、決定ブロック406(“全てのテストを通過したか?”)が続いてよい。決定ブロック406で、修復モジュールは、前に受け入れられた修復が増補されたテストスイートの中のテストを通過するかどうかを判定してよい。前に受け入れられた修復が増補されたテストスイートの中のテストを通過すると修復モジュールが決定する場合には、決定ブロック406の後にブロック408(“前に受け入れられた修復を受け入れる”)が続いてよい。ブロック408で、修復モジュールは、前に受け入れられた修復を適切な修復として受け入れてよい(例えば、再度受け入れてよい)。
さもなければ、前に受け入れられた修復が増補されたテストスイートの中のテストを通過しないと修復モジュールが決定する場合に、決定ブロック406の後にはブロック410(“前に受け入れられた修復を拒絶する”)が続いてよい。ブロック410で、修復モジュールは、前に受け入れられた修復を不適切な又は不正確な修復として拒絶してよい。すなわち、修復モジュールは、前に受け入れられた修復を、もはや適切な修復でないとして取り除いてよい。前に受け入れられた修復は拒絶され、そして、増補されたテストスイートに落第するために、もはや適切な修復でない。いくつかの実施形態では、修復モジュールは、前に受け入れられた修復をパッチ110から除いてよい。修復モジュールは、増補されたテストスイートに対してテストされていない更なる前に受け入れられた修復を、増補されたテストスイートに対してテストしてよい。
上述されたように、本開示で記載される実施形態は、本明細書で更に詳細に説明されるように、様々なコンピュータハードウェア又はソフトウェアモジュールを含む専用又汎用のコンピュータ(例えば、図2のプロセッサ250)の使用を含んでよい。更には、上述されたように、本開示で記載される実施形態は、コンピュータ実行可能な命令又はデータ構造を搬送するか又はそれらが記憶されているコンピュータ可読媒体(例えば、図2のメモリ252)を用いて実装されてよい。
本開示で使用されるように、語“モジュール”又は“コンポーネント”は、コンピュータシステムの汎用ハードウェア(例えば、コンピュータ可読媒体、プロセッシングデバイス)において記憶及び/又は実行され得るソフトウェアオブジェクト若しくはソフトウェアルーチン及び/又はモジュール若しくはコンポーネントのアクションを実行するよう構成される特定のハードウェア実装を表し得る。いくつかの実施形態では、本開示で記載される種々のコンポーネント、モジュール、エンジン、及びサービスは、コンピュータシステムで(例えば、別個のスレッドとして)実行するオブジェクト又はプロセスとして実装されてよい。本開示で記載されるシステム及び方法の一部は、ソフトウェア(汎用ハードウェアにおいて記憶及び/又は実行される。)で実装されるものとして概して記載されるが、特定のハードウェア実装、ファームウェア実装、又はそれらの如何なる組み合わせも、可能であって考えられている。本明細書において、“コンピュータエンティティ”は、本開示で先に記載されている如何なるコンピュータシステムであっても、あるいは、コンピュータシステムで実行する如何なるモジュール又はモジュールの組み合わせであってもよい。
一般的に、本明細書内及び添付の請求の範囲内(例えば、添付の請求の範囲の要部)で使用される用語は、一般的に「非限定的な(open)」用語として意図されている(例えば、「含んでいる(including)」という用語は、「・・・を含んでいるが限定されない(including, but not limited to)」と解釈されるべきであり、「有している(having)」という用語は、「少なくとも・・・を有している(having at least)」と解釈されるべきであり、「含む(includes)」という用語は、「・・・を含むが限定されない(includes, but is not limited to)」と解釈されるべきである。)。
加えて、導入されたクレーム記載(introduced claim recitation)において特定の数が意図される場合、そのような意図は当該クレーム中に明確に記載され、そのような記載がない場合は、そのような意図も存在しない。理解を促すために、例えば、後続の添付する特許請求の範囲では、「少なくとも1つの(at least one)」及び「1つ以上の(one or more)」といった導入句を使用し、クレーム記載を導入することがある。しかし、このような句を使用するからといって、「a」又は「an」といった不定冠詞によりクレーム記載を導入した場合に、たとえ同一のクレーム内に、「1つ以上の」又は「少なくとも1つの」といった導入句と「a」又は「an」といった不定冠詞との両方が含まれるとしても、当該導入されたクレーム記載を含む特定のクレームが、当該記載事項を1つのみ含む例に限定されるということが示唆されると解釈されるべきではない(例えば、「a」及び/又は「an」は、通常は、「少なくとも1つの」又は「1つ以上の」を意味すると解釈されるべきである。)。定冠詞を使用してクレーム記載を導入する場合にも同様のことが当てはまる。
加えて、導入されたクレーム記載において特定の数が明示されている場合であっても、そのような記載は、通常、「少なくとも」記載された数を意味するように解釈されるべきであることは、当業者には理解されるであろう(例えば、他に修飾語のない、単なる「2つの記載事項」という記載がある場合、この記載は、「少なくとも」2つの記載事項、又は「2つ以上の」記載事項を意味する。)。更に、「A、B及びCなどのうち少なくとも1つ」又は「A、B及びCのうちの1つ以上」に類する表記が使用される場合、一般的に、そのような構造は、Aのみ、Bのみ、Cのみ、A及びBの両方、A及びCの両方、B及びCの両方、並びに/又はA及びB及びCの全て、などを有するものとして意図される。
ここで挙げられている全ての例及び条件付き語は、当該技術の促進に対して発明者によって寄与される概念及び発明を読者が理解するのを助ける教育上の目的を意図され、そのような具体的に挙げられている例及び条件に制限されないものとして解釈されるべきである。本発明の実施形態が詳細に記載されてきたが、様々な変更、置換及び代替は、本発明の主旨及び適用範囲から逸脱することなしに行われてよいことが理解されるべきである。
上記の実施形態に加えて、以下の付記を開示する。
(付記1)
人間が生み出した1つ以上のテストオラクルを用いてソフトウェアプログラムをインタラクティブに修復する方法であって、
ソフトウェアプログラム内の欠陥箇所を特定し、
修復候補に基づき、前記欠陥箇所で、可能な修復を生成し、
前記可能な修復をテストするよう第1テストを自動生成し、
前記第1テストに基づき、第1テストオラクルのための第1クエリを生成し、
前記第1クエリに対する応答を人間から取得し、
前記第1クエリ及び該第1クエリに対する前記取得された応答に基づき、人間が提供した第1テストオラクルを生成し、
拡張された第1テストを生成するよう、前記人間が提供した第1テストオラクルを前記第1テストに加え、
前記拡張された第1テストを含むようテストスイートを増補し、
前記増補されたテストスイートを用いて、前記可能な修復をテストする
ことを有する方法。
(付記2)
前記拡張された第1テストを含む前記増補されたテストスイートを前記可能な修復が通過することに応答して、前記可能な修復を適切な修復として受け入れる
ことを更に有する、付記1に記載の方法。
(付記3)
前記拡張された第1テストを含む前記増補されたテストスイートを前記可能な修復が通過しないことに応答して、前記可能な修復を不適切な修復として拒絶する
ことを更に有する、付記1に記載の方法。
(付記4)
前記可能な修復が前記増補されたテストスイートを通過することに応答して、
前記可能な修復をテストするよう第2テストを自動生成し、
前記第2テストに基づき、第2テストオラクルのための第2クエリを生成し、
前記第2クエリに対する応答を人間から取得し、
前記第2クエリ及び該第2クエリに対する前記取得された応答に基づき、人間が提供した第2テストオラクルを生成し、
拡張された第2テストを生成するよう、前記人間が提供した第2テストオラクルを前記第2テストに加え、
前記拡張された第2テストを含むよう、前記増補されたテストスイートを増補する
ことを更に有する、付記1に記載の方法。
(付記5)
前記拡張された第2テストを含む前記増補されたテストスイートを用いて、前記可能な修復をテストする
ことを更に有する、付記4に記載の方法。
(付記6)
前記拡張された第2テストを含む前記増補されたテストスイートを前記可能な修復が通過することに応答して、前記可能な修復を適切な修復として受け入れる
ことを更に有する、付記5に記載の方法。
(付記7)
前記拡張された第2テストを含む前記増補されたテストスイートを前記可能な修復が通過しないことに応答して、前記可能な修復を不適切な修復として拒絶する
ことを更に有する、付記5に記載の方法。
(付記8)
前記拡張された第1テストを含む前記増補されたテストスイートを用いて、前に受け入れられた可能な修復をテストする
ことを更に有する、付記1に記載の方法。
(付記9)
人間が生み出したテストオラクルに基づきソフトウェアプログラムに対する修復をインタラクティブに生成する方法であって、
ソフトウェアプログラム内の欠陥箇所で、第1修復候補に基づく第1の可能な修復をテストするよう、テストを自動生成し、
前記テストに基づき、テストオラクルのためのクエリを生成し、
前記クエリに対する応答を人間から取得し、
前記クエリ及び該クエリに対する前記取得された応答に基づき、人間が提供したテストオラクルを生成し、
拡張されたテストを生成するよう、前記人間が提供したテストオラクルを前記テストに加え、
前記拡張されたテストを含むようテストスイートを増補し、
前記拡張されたテストを含む前記増補されたテストスイートを用いて、前記第1の可能な修復をテストする
ことを有する方法。
(付記10)
前記拡張されたテストを含む前記増補されたテストスイートを前記第1の可能な修復が通過することに応答して、前記第1の可能な修復を第1の適切な修復として受け入れる
ことを更に有する、付記9に記載の方法。
(付記11)
前記ソフトウェアプログラム内の前記欠陥箇所で、第2修復候補に基づく第2の可能な修復を生成し、
前記拡張されたテストを含む前記増補されたテストスイートを用いて、前記第2の可能な修復をテストし、
前記拡張されたテストを含む前記増補されたテストスイートを前記第2の可能な修復が通過することに応答して、前記第2の可能な修復を第2の適切な修復として受け入れる
ことを更に有する、付記10に記載の方法。
(付記12)
前記拡張されたテストを含む前記増補されたテストスイートを用いて、前に受け入れられた可能な修復をテストする
ことを更に有する、付記9に記載の方法。
(付記13)
人間が生み出した1つ以上のテストオラクルを用いてソフトウェアプログラムをインタラクティブに修復するよう構成されるシステムであって、
命令を記憶するよう構成される1つ以上のコンピュータ可読記憶媒体と、
前記命令を実行するよう構成される1つ以上のプロセッサと
を有し、
前記命令の実行は、当該システムに、
ソフトウェアプログラム内の欠陥箇所を特定し、
第1修復候補に基づき、前記欠陥箇所で、第1の可能な修復を生成し、
前記第1の可能な修復をテストするよう第1テストを生成し、
前記第1テストに基づき、第1テストオラクルのための第1クエリを生成し、
前記第1クエリに対する応答を人間から取得し、
前記第1クエリ及び該第1クエリに対する前記取得された応答に基づき、人間が提供した第1テストオラクルを生成し、
拡張された第1テストを生成するよう、前記人間が提供した第1テストオラクルを前記第1テストに加え、
前記拡張された第1テストを含むようテストスイートを増補し、
前記拡張された第1テストを含む前記増補されたテストスイートを用いて、前記第1の可能な修復をテストする
ことを含む動作を実行させる、システム。
(付記14)
前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを前記第1の可能な修復が通過することに応答して、前記第1の可能な修復を第1の適切な修復として受け入れることを更に含む、
付記13に記載のシステム。
(付記15)
前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを前記第1の可能な修復が通過しないことに応答して、前記第1の可能な修復を不適切な修復として拒絶することを更に含む、
付記13に記載のシステム。
(付記16)
前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを前記第1の可能な修復が通過することに応答して、
前記第1の可能な修復をテストするよう第2テストを生成し、
前記第2テストに基づき、第2テストオラクルのための第2クエリを生成し、
前記第2クエリに対する応答を人間から取得し、
前記第2クエリ及び該第2クエリに対する前記取得された応答に基づき、人間が提供した第2テストオラクルを生成し、
拡張された第2テストを生成するよう、前記人間が提供した第2テストオラクルを前記第2テストに加え、
前記拡張された第2テストを含むよう、前記増補されたテストスイートを増補する
ことを更に含む、
付記13に記載のシステム。
(付記17)
前記動作は、前記拡張された第2テストを含む前記増補されたテストスイートを用いて、前記第1の可能な修復をテストすることを更に含む、
付記16に記載のシステム。
(付記18)
前記動作は、
第2修復候補に基づき、前記欠陥箇所で、第2の可能な修復を生成し、
前記拡張された第1テストを含む前記増補されたテストスイートを用いて、前記第2の可能な修復をテストする
ことを更に含む、
付記13に記載のシステム。
(付記19)
前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを前記第2の可能な修復が通過することに応答して、前記第2の可能な修復を第2の適切な修復として受け入れることを更に含む、
付記18に記載のシステム。
(付記20)
前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを用いて、前に受け入れられた可能な修復をテストすることを更に含む、
付記13に記載のシステム。
100 環境
102 人間
114 被試験コード(code under test)
106 修復モジュール
108 増補されたテストスイート
110 パッチ
112 テストスイート
202 コンピュータシステム
250 プロセッサ
252 メモリ
254 データストレージ

Claims (20)

  1. 人間が生み出した1つ以上のテストオラクルを用いてソフトウェアプログラムをインタラクティブに修復する方法であって、
    ソフトウェアプログラム内の欠陥箇所を特定し、
    修復候補に基づき、前記欠陥箇所で、可能な修復を生成し、
    前記可能な修復をテストするよう第1テストを自動生成し、
    前記第1テストに基づき、第1テストオラクルのための第1クエリを生成し、
    前記第1クエリに対する応答を人間から取得し、
    前記第1クエリ及び該第1クエリに対する前記取得された応答に基づき、人間が提供した第1テストオラクルを生成し、
    拡張された第1テストを生成するよう、前記人間が提供した第1テストオラクルを前記第1テストに加え、
    前記拡張された第1テストを含むようテストスイートを増補し、
    前記増補されたテストスイートを用いて、前記可能な修復をテストする
    ことを有する方法。
  2. 前記拡張された第1テストを含む前記増補されたテストスイートを前記可能な修復が通過することに応答して、前記可能な修復を適切な修復として受け入れる
    ことを更に有する、請求項1に記載の方法。
  3. 前記拡張された第1テストを含む前記増補されたテストスイートを前記可能な修復が通過しないことに応答して、前記可能な修復を不適切な修復として拒絶する
    ことを更に有する、請求項1に記載の方法。
  4. 前記可能な修復が前記増補されたテストスイートを通過することに応答して、
    前記可能な修復をテストするよう第2テストを自動生成し、
    前記第2テストに基づき、第2テストオラクルのための第2クエリを生成し、
    前記第2クエリに対する応答を人間から取得し、
    前記第2クエリ及び該第2クエリに対する前記取得された応答に基づき、人間が提供した第2テストオラクルを生成し、
    拡張された第2テストを生成するよう、前記人間が提供した第2テストオラクルを前記第2テストに加え、
    前記拡張された第2テストを含むよう、前記増補されたテストスイートを増補する
    ことを更に有する、請求項1に記載の方法。
  5. 前記拡張された第2テストを含む前記増補されたテストスイートを用いて、前記可能な修復をテストする
    ことを更に有する、請求項4に記載の方法。
  6. 前記拡張された第2テストを含む前記増補されたテストスイートを前記可能な修復が通過することに応答して、前記可能な修復を適切な修復として受け入れる
    ことを更に有する、請求項5に記載の方法。
  7. 前記拡張された第2テストを含む前記増補されたテストスイートを前記可能な修復が通過しないことに応答して、前記可能な修復を不適切な修復として拒絶する
    ことを更に有する、請求項5に記載の方法。
  8. 前記拡張された第1テストを含む前記増補されたテストスイートを用いて、前に受け入れられた可能な修復をテストする
    ことを更に有する、請求項1に記載の方法。
  9. 人間が生み出したテストオラクルに基づきソフトウェアプログラムに対する修復をインタラクティブに生成する方法であって、
    ソフトウェアプログラム内の欠陥箇所で、第1修復候補に基づく第1の可能な修復をテストするよう、テストを自動生成し、
    前記テストに基づき、テストオラクルのためのクエリを生成し、
    前記クエリに対する応答を人間から取得し、
    前記クエリ及び該クエリに対する前記取得された応答に基づき、人間が提供したテストオラクルを生成し、
    拡張されたテストを生成するよう、前記人間が提供したテストオラクルを前記テストに加え、
    前記拡張されたテストを含むようテストスイートを増補し、
    前記拡張されたテストを含む前記増補されたテストスイートを用いて、前記第1の可能な修復をテストする
    ことを有する方法。
  10. 前記拡張されたテストを含む前記増補されたテストスイートを前記第1の可能な修復が通過することに応答して、前記第1の可能な修復を第1の適切な修復として受け入れる
    ことを更に有する、請求項9に記載の方法。
  11. 前記ソフトウェアプログラム内の前記欠陥箇所で、第2修復候補に基づく第2の可能な修復を生成し、
    前記拡張されたテストを含む前記増補されたテストスイートを用いて、前記第2の可能な修復をテストし、
    前記拡張されたテストを含む前記増補されたテストスイートを前記第2の可能な修復が通過することに応答して、前記第2の可能な修復を第2の適切な修復として受け入れる
    ことを更に有する、請求項10に記載の方法。
  12. 前記拡張されたテストを含む前記増補されたテストスイートを用いて、前に受け入れられた可能な修復をテストする
    ことを更に有する、請求項9に記載の方法。
  13. 人間が生み出した1つ以上のテストオラクルを用いてソフトウェアプログラムをインタラクティブに修復するよう構成されるシステムであって、
    命令を記憶するよう構成される1つ以上のコンピュータ可読記憶媒体と、
    前記命令を実行するよう構成される1つ以上のプロセッサと
    を有し、
    前記命令の実行は、当該システムに、
    ソフトウェアプログラム内の欠陥箇所を特定し、
    第1修復候補に基づき、前記欠陥箇所で、第1の可能な修復を生成し、
    前記第1の可能な修復をテストするよう第1テストを生成し、
    前記第1テストに基づき、第1テストオラクルのための第1クエリを生成し、
    前記第1クエリに対する応答を人間から取得し、
    前記第1クエリ及び該第1クエリに対する前記取得された応答に基づき、人間が提供した第1テストオラクルを生成し、
    拡張された第1テストを生成するよう、前記人間が提供した第1テストオラクルを前記第1テストに加え、
    前記拡張された第1テストを含むようテストスイートを増補し、
    前記拡張された第1テストを含む前記増補されたテストスイートを用いて、前記第1の可能な修復をテストする
    ことを含む動作を実行させる、システム。
  14. 前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを前記第1の可能な修復が通過することに応答して、前記第1の可能な修復を第1の適切な修復として受け入れることを更に含む、
    請求項13に記載のシステム。
  15. 前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを前記第1の可能な修復が通過しないことに応答して、前記第1の可能な修復を不適切な修復として拒絶することを更に含む、
    請求項13に記載のシステム。
  16. 前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを前記第1の可能な修復が通過することに応答して、
    前記第1の可能な修復をテストするよう第2テストを生成し、
    前記第2テストに基づき、第2テストオラクルのための第2クエリを生成し、
    前記第2クエリに対する応答を人間から取得し、
    前記第2クエリ及び該第2クエリに対する前記取得された応答に基づき、人間が提供した第2テストオラクルを生成し、
    拡張された第2テストを生成するよう、前記人間が提供した第2テストオラクルを前記第2テストに加え、
    前記拡張された第2テストを含むよう、前記増補されたテストスイートを増補する
    ことを更に含む、
    請求項13に記載のシステム。
  17. 前記動作は、前記拡張された第2テストを含む前記増補されたテストスイートを用いて、前記第1の可能な修復をテストすることを更に含む、
    請求項16に記載のシステム。
  18. 前記動作は、
    第2修復候補に基づき、前記欠陥箇所で、第2の可能な修復を生成し、
    前記拡張された第1テストを含む前記増補されたテストスイートを用いて、前記第2の可能な修復をテストする
    ことを更に含む、
    請求項13に記載のシステム。
  19. 前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを前記第2の可能な修復が通過することに応答して、前記第2の可能な修復を第2の適切な修復として受け入れることを更に含む、
    請求項18に記載のシステム。
  20. 前記動作は、前記拡張された第1テストを含む前記増補されたテストスイートを用いて、前に受け入れられた可能な修復をテストすることを更に含む、
    請求項13に記載のシステム。
JP2018138230A 2017-08-03 2018-07-24 インタラクティブなソフトウェアプログラムの修復 Active JP7070195B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US15/668,065 US10268572B2 (en) 2017-08-03 2017-08-03 Interactive software program repair
US15/668065 2017-08-03

Publications (2)

Publication Number Publication Date
JP2019029015A JP2019029015A (ja) 2019-02-21
JP7070195B2 true JP7070195B2 (ja) 2022-05-18

Family

ID=65229560

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2018138230A Active JP7070195B2 (ja) 2017-08-03 2018-07-24 インタラクティブなソフトウェアプログラムの修復

Country Status (2)

Country Link
US (1) US10268572B2 (ja)
JP (1) JP7070195B2 (ja)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10761961B2 (en) * 2018-12-21 2020-09-01 Fujitsu Limited Identification of software program fault locations
US10782941B1 (en) 2019-06-20 2020-09-22 Fujitsu Limited Refinement of repair patterns for static analysis violations in software programs
US11748086B2 (en) * 2021-01-22 2023-09-05 Dell Products L.P. Automated software upgrade download control based on device issue analysis
CN113590477B (zh) * 2021-07-16 2023-06-09 四川大学 一种移动应用功能测试用例生成方法
KR102619048B1 (ko) * 2023-05-12 2023-12-27 쿠팡 주식회사 오류 처리 방법 및 그 시스템

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008250914A (ja) 2007-03-30 2008-10-16 Canon Software Inc プログラム修正装置及び方法、並びにプログラム
JP2017045446A (ja) 2015-08-25 2017-03-02 富士通株式会社 ソフトウェアプログラムを修復する方法、記憶媒体及びシステム
JP2017102912A (ja) 2015-12-02 2017-06-08 富士通株式会社 機械学習ベースのソフトウェアプログラム修復

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH1115693A (ja) * 1997-05-01 1999-01-22 Nippon Steel Corp ソフトウェアのテスト装置および記録媒体
US6173440B1 (en) * 1998-05-27 2001-01-09 Mcdonnell Douglas Corporation Method and apparatus for debugging, verifying and validating computer software
US6907546B1 (en) * 2000-03-27 2005-06-14 Accenture Llp Language-driven interface for an automated testing framework
US6574764B2 (en) * 2001-04-25 2003-06-03 Agilent Technologies, Inc. Algorithmically programmable memory tester with history FIFO's that aid in error analysis and recovery
US7121639B2 (en) * 2002-12-02 2006-10-17 Silverbrook Research Pty Ltd Data rate equalisation to account for relatively different printhead widths
US7386434B1 (en) * 2004-02-20 2008-06-10 Unisys Corporation Method and apparatus for creating integrated circuit simulator test source files
US20060010426A1 (en) * 2004-07-09 2006-01-12 Smartware Technologies, Inc. System and method for generating optimized test cases using constraints based upon system requirements
US7599688B2 (en) * 2005-11-29 2009-10-06 Alcatel-Lucent Usa Inc. Methods and apparatus for passive mid-stream monitoring of real-time properties
US20090292941A1 (en) * 2008-05-22 2009-11-26 Nec Laboratories America, Inc. Proof-guided error diagnosis (ped) by triangulation of program error causes
US8195983B2 (en) * 2008-10-22 2012-06-05 International Business Machines Corporation Method and system for evaluating software quality
US9043761B2 (en) * 2010-09-01 2015-05-26 International Business Machines Corporation Fault localization using condition modeling and return value modeling
US8645761B2 (en) * 2011-01-13 2014-02-04 International Business Machines Corporation Precise fault localization
IN2013MU01495A (ja) * 2013-04-22 2015-04-17 Tata Consultancy Services Ltd
WO2015135043A1 (en) * 2014-03-13 2015-09-17 Bugwolf Pty Ltd Evaluation system and method
US20160321594A1 (en) * 2015-04-30 2016-11-03 Optimal Plus Ltd. Correlation between manufacturing segment and end- user device performance
US10133657B2 (en) * 2016-02-23 2018-11-20 Fujitsu Limited Textual similarity based software program repair
US10180897B2 (en) * 2016-09-26 2019-01-15 Fujitsu Limited Automated software program repair

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008250914A (ja) 2007-03-30 2008-10-16 Canon Software Inc プログラム修正装置及び方法、並びにプログラム
JP2017045446A (ja) 2015-08-25 2017-03-02 富士通株式会社 ソフトウェアプログラムを修復する方法、記憶媒体及びシステム
JP2017102912A (ja) 2015-12-02 2017-06-08 富士通株式会社 機械学習ベースのソフトウェアプログラム修復

Also Published As

Publication number Publication date
US20190042398A1 (en) 2019-02-07
US10268572B2 (en) 2019-04-23
JP2019029015A (ja) 2019-02-21

Similar Documents

Publication Publication Date Title
JP7070195B2 (ja) インタラクティブなソフトウェアプログラムの修復
JP4266226B2 (ja) 選択的に有効にされるチェッカーを用いた設計検証システムおよび方法
US8589892B2 (en) Verification of speculative execution
US8621441B2 (en) System and method for software immunization based on static and dynamic analysis
JP7172435B2 (ja) 抽象コードグラフを用いたソフトウェアの表現
US10296447B2 (en) Automated software program repair
US10152406B2 (en) Software program repair
US9208451B2 (en) Automatic identification of information useful for generation-based functional verification
JP6520074B2 (ja) テストダブルの生成
JP7110789B2 (ja) 自動化されたソフトウェアプログラム修復候補の選択
US10049031B2 (en) Correlation of violating change sets in regression testing of computer software
US20150143179A1 (en) System and Method for Progressive Fault Injection Testing
JP2017151977A (ja) ソフトウエアプログラムの修復のための方法及びプログラム
US10592703B1 (en) Method and system for processing verification tests for testing a design under test
US20200065226A1 (en) Automated software program repair of similar code snippets
JP6891703B2 (ja) 自動ソフトウェアプログラム修復
JP2020102209A (ja) ソフトウェアプログラム不良位置の識別
JP2020144842A (ja) コンピュータ可読プログラム検査のための入力の生成
CN108572892B (zh) 一种基于PowerPC多核处理器的离线测试方法和装置
WO2017015955A1 (en) Application testing
JP7384054B2 (ja) 自動化されたソフトウェアプログラム修復
US10761962B1 (en) Automated software program repair
US20140281719A1 (en) Explaining excluding a test from a test suite
JP2020126603A (ja) 自動候補修正パッチ生成
KR100777103B1 (ko) 테스트 드라이버 생성 장치 및 방법

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20210408

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20220323

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: 20220405

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20220418

R150 Certificate of patent or registration of utility model

Ref document number: 7070195

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150