回帰テスト

回帰テスト (かいきテスト、) とは、前にテストしたソフトウェアが変更後もまだ動作するかどうかを、機能テストと非機能テストを再度実行して確認する作業のこと。退行テスト、リグレッションテストとも呼ばれる。そうでない場合、それは"先祖返り"と呼ばれる。回帰テストが必要になる可能性のある変更には、バグ修正、ソフトウェアの機能強化、構成変更、さらには電子部品の置き換えなどある。 リグレッションをテストするための仕組みは、欠陥が見つかるたびに大きくなる傾向があるため、通常はテストの自動化でカバーされる。テストするためのテストケースを決定するために、変更影響分析を実行することもある（"非回帰分析" ）。
背景.
ソフトウェアが更新または変更されたり、変更されたターゲットで再利用されたりすると、新しい障害の発生や古い障害の再発生が非常に一般的である。不十分なリビジョン管理手法（またはリビジョン管理における単純な人為的エラー）によって修正が失われるために、再出現が発生することがある。多くの場合、問題の修正は「脆弱」であり、最初に観察された狭いケースでは問題が修正されるが、ソフトウェアの存続期間中に発生する可能性のあるより一般的なケースでは修正されない。多くの場合、ある領域の問題を修正すると、別の領域でソフトウェアのバグが発生する。最後に、一部の機能が再設計されると、その機能の元の実装で行われたのと同じ間違いのいくつかが再設計で行われる場合がある。
そのため、ほとんどのソフトウェア開発の状況では、コーディングのベストプラクティスとして、バグの修正を行ったら、バグを再現させたテストを実行して、さらにプログラムに以降の変更を行ったときに定期的にプログラムへの同じテストを再実行することが挙げられている。 これは、プログラミング手法を使用した手動テスト手順で実行できるが、多くの場合、自動テストツールを使用して実行される。 このようなテストスイートには、テスト環境ですべての回帰テストケースを自動的に実行できるようにするソフトウェアツールが含まれる。一部のプロジェクトでは、自動システムをセットアップして、指定された間隔ですべての回帰テストを再実行し、障害を報告する（これは回帰または古いテストを意味する可能性がある）。 一般的な戦略では、コンパイルが成功するたびに（小さなプロジェクトの場合）、毎晩、または週に1回、このようなシステムを実行する。これらの戦略は、外部ツールによって自動化できる。
回帰テストは、エクストリームプログラミングソフトウェア開発手法の不可欠な部分である。この方法では、設計ドキュメントは、ソフトウェア開発プロセスの各段階を通じて、ソフトウェアパッケージ全体の広範囲にわたる反復可能な自動テストに置き換えられる。回帰テストは、機能テストが終了した後に実行され、他の機能が機能していることを確認する。
企業の世界では、従来、回帰テストは、開発チームが作業を完了した後にソフトウェア品質保証チームによって実行されてきた。ただし、この段階で見つかった欠陥は、修正するのに最も費用がかかる。この問題は、単体テストによって対処されている。開発者は常に、開発サイクルの一環として、テストケースを書いているが、これらのテストケースは、一般的にどちらかだった機能テストや単体テストのみ意図成果を検証する。開発者テストでは、開発者は単体テストに集中し、ポジティブテストケースとネガティブテストケースの両方を含める必要がある。
テクニック.
回帰テスト手法は次のとおり。
すべてを再テスト.
現在のプログラムのすべてのテストケースをチェックして、その整合性をチェックする。すべてのケースを再実行する必要があるためコストがかかるが、コードが変更されたためにエラーが発生しないことが保証される。 
回帰テストの選択.
すべてを再テストするのとは異なり、この手法は、テストスイートの一部を選択するコストがすべてを再テストする手法よりも少ない場合、テストスイートの一部を実行する（すべてを再テストするコストがかかるため）。 
テストケースの優先順位付け.
テストスイートの障害検出率を高めるために、テストケースに優先順位を付ける。テストケースの優先順位付け手法では、優先度の高いテストケースが、優先度の低いテストケースの前に実行されるようにテストケースをスケジュールする。 
ハイブリッド.
回帰テストの選択とテストケースの優先順位付けを組み合わせたもの。 
長所と短所.
回帰テストは、ソフトウェアの既存の機能に変更が加えられた場合、またはソフトウェアにバグ修正がある場合に実行される。回帰テストは複数のアプローチで実現できる。"すべての"アプローチを"テストする"場合、ソフトウェアに加えられた変更が、変更されていない既存の機能に影響を与えていないことを確認できる。 
ソフトウェア開発ライフサイクルが非常に短く、リソースが不足しており、ソフトウェアへの変更が非常に頻繁であるアジャイルソフトウェア開発では、回帰テストによって多くの不要なオーバーヘッドが発生する可能性がある。 
サードパーティのブラックボックスコンポーネントを使用する傾向があるソフトウェア開発環境では、サードパーティコンポーネントの変更がシステムの他の部分に干渉する可能性があるため、回帰テストの実行は難しい場合がある（そしてサードパーティで回帰テストを実行するパーティコンポーネントは不明なエンティティであるため、困難な場合がある）。 
用途.
回帰テストは、プログラムの"正当性"をテストするためだけでなく、多くの場合、その出力の品質を追跡するためにも使用できる。 たとえば、コンパイラの設計では、回帰テストでコードサイズと、テストスイートのケースをコンパイルして実行するのにかかる時間を追跡できる。
回帰テストは、機能テストまたは単体テストに分類できる。機能テストは、さまざまな入力を使用してプログラム全体を実行する。単体テストは、個々の関数、サブルーチン、またはオブジェクトメソッドを実行する。機能テストツールと単体テストツールはどちらも自動化される傾向があり、多くの場合、コンパイラスイートの一部ではないサードパーティ製品である。機能テストは、スクリプト化された一連のプログラム入力である場合があり、マウスの動きとクリックを制御するための自動化されたメカニズムが含まれる場合もある。単体テストは、コード自体内の個別の関数のセット、またはテスト対象のコードを変更せずにコードにリンクするドライバーレイヤーの場合がある。