システムの開発が進み、その複雑さが増してくると、改修した部分が影響して不具合が発生するリスクが高くなります。
そのため、改修内容に応じてその影響を確認する「リグレッションテスト」を実行して、不具合を早期に検出することが重要です。
今回はテスト工程におけるリグレッションテストについて、定義や目的、効果的な実行タイミング、そしてリグレッションテストの自動化について解説します。
- もくじ
1.リグレッションテスト(回帰テスト)とは
「リグレッションテスト(Regression Test)」とは、プログラムの変更・修正によって、既存の機能や性能に予想外の影響が現れていないかを確認するテストです。
リグレッションには「回帰」「退行」という意味があるため、「回帰テスト」「退行テスト」とも呼ばれます。
一般的なソフトウェア開発現場では、既存のソフトウェアへ機能追加や仕様変更を繰り返し行います。この時、変更した機能のみをテストするのでは不十分です。プログラムを変更したことによって、既存の機能や性能に影響が出るリスクが少なからずあります。
たとえば、入力処理だけを変更したつもりが、出力処理に悪影響が生じてしまうケースも考えられます。たとえ別々の機能でも同じ内部データやモジュールに依存している場合、こうした不具合が発生することは珍しくありません。
このように、プログラムの変更が意図した箇所以外に副作用を与えていないかを確認するのがリグレッションテストです。
1-1 リグレッションテストの目的
リグレッションテストの目的は、プログラムの変更・改修が既に検証済みの部分に悪影響を及ぼして、新たに不具合を引き起こしていないかを確認することです。
改修箇所が全く新しいモジュールやメソッドであれば、影響は比較的少ないと予想されます。
しかし、既存のモジュールやメソッド、あるいは基盤となるコードを変更する場合、その既存コードを利用する機能全体に影響を及ぼすリスクが発生します。
また、影響範囲が広かったり、変更対象のソフトウェアが顧客の業務と密接に関わっていたりする場合、わずかな修正が深刻な事態を招く恐れがあります。
リグレッションテストを実施するのは、このような事態を防ぐためです。
元々は正常に動作していた機能や処理が、プログラムの変更や修正後もそのままの状態が保たれているかどうかを検証します。
リグレッションテストで予期せぬ問題を検出できれば、リリース後に顧客のもとで不具合が発生する事態は避けられるでしょう。
1-2 リグレッションテストの実行タイミング
リグレッションテストは、プログラムに変更を加えた後のテスト工程で実行するのが基本です。
テスト工程は単体テスト、結合テスト、システムテストという順序で、プログラム単体から、システム全体へと範囲を広げながら進んでいきます。
リグレッションテストは、このすべてのテスト工程で実行するのが望ましいです。
たとえば、関数Aを追加した後の単体テストでは、同じ変数を参照している関数Bのリグレッションテストが必要でしょう。
また、認証機能を追加した後の結合テストでは、同じユーザーデータを参照しているアクセス管理機能のリグレッションテストが必要です。
注意点として、リグレッションテストでの不具合検出が遅れるほど、リリース前に対処することが難しくなります。致命的な不具合の場合、本来予定していた機能のリリースにまで影響しかねません。
こうした事態を防ぐためにも、リグレッションテストの観点をテスト工程の初期段階で導入し、不具合を早期に検出・修正できる体制づくりが必要です。
1-3 リグレッションテストとデグレーションの違い
「リグレッションテスト」と似ている単語に「デグレードテスト(Degrade Test))」があります。デグレードには「悪化させる」「退化させる」といった意味があります。
デグレードテストとは、プログラムの変更によってソフトウェアの品質が悪化していないかを確認するテスト手法です。既存の機能や性能がそれまでどおり保たれているかを検証します。つまり、リグレッションテストとデグレードテストは基本的に同義です。
なお、プログラムの変更によってソフトウェアの品質が悪化した"状態"を表すときは、「リグレッション」「デグレード」と単体で使います。これは、機能が劣化する、パフォーマンスが悪化する、といった悪い影響が出ている"状態"を指します。
日本の現場では「デグレード」の方を良く耳にしますが、英語圏の国だと、デグレードよりもリグレッションのほうが使われやすい傾向があります。事実、国際ソフトウェアテスト資格認定委員会(ISTQB)は「リグレッション」という言葉をグローバルスタンダードとして用いています。
2.リグレッションテストを行わないリスク
リグレッションテストを省略してしまうと、次のようなリスクが懸念されます。
- ソフトウェア品質の低下
- 修正コストの増大
- セキュリティリスクの上昇
それぞれ解説していきます。
2-1 ソフトウェア品質の低下
リグレッションテストを行わないと、当然ながらソフトウェア品質の低下を引き起こしかねません。
たとえば、ソフトウェア納品後に「画面が開かない」「処理が終わらない」といった基本機能を損なう重大な欠陥が発見されるリスクがあります。
それまでは問題なかった機能が動かなくなったり、性能が下がったりすれば、顧客はすぐに不具合と認識するでしょう。「元々は正常に動作していた」という前提があるからこそ顧客の失望は大きくなり、ソフトウェアに対する信頼を大きく失墜させてしまいます。
また、リグレッションテストの副次的なメリットとして、たまたま顕在化していなかった既存のバグに気付ける可能性もあります。リグレッションテストを省略すると、こうしたバグを放置することにもなり、やはりソフトウェアの品質改善にはつながりません。
2-2 修正コストの増大
リグレッションテストの実行には工数やコストがかかります。しかし、だからといってリグレッションテストを行わないと、かえってコストが増大してしまうでしょう。
一般的にソフトウェアの不具合は、早期に検出できるほどコスト面のダメージが少なく済みます。特に、リリース前に不具合を検出するのと、リリース後に不具合が発覚するのでは、対応にかかる工数やコストは大きく変わってきます。
リリース後の対応では、顧客への報告や謝罪ばかりか、損害賠償を請求されるケースもゼロではありません。このようなコストの増大を防ぐために、リグレッションテストで確実に既存機能の欠陥を検出しましょう。
2-3 セキュリティリスクの上昇
リグレッションテストを行わない場合、セキュリティリスクの上昇も懸念されます。
一般的に、ソフトウェアのバグはサイバー攻撃の標的となる危険性が高いです。攻撃者にバグの弱みを突かれてサイバー攻撃が成功してしまうケースは珍しくありません。
たとえば、プログラムの不適切な変更によって入力チェック機能に新たな不備が生じた場合、攻撃者からの不正な入力データを受け入れてしまうことも考えられます。そうなれば、悪意のあるコードがシステム側で実行されて、システムを不正操作されかねません。
このようなセキュリティリスクを防ぐためにも、確実にリグレッションテストを実施することが大切です。
3.リグレッションテストはどこまで実行すべきか
リグレッションテストは既存の機能や、そのテストケースに対して実行します。
ソフトウェアが大規模なほど対象の機能やテストケースが増え、実行範囲の判断が難しくなります。
リグレッションテストの実施範囲を正しく決めるために、以下のポイント3つを押さえておきましょう。
- プログラムの影響範囲を漏れなくカバーする
- デグレードのリスクが高い箇所を優先的に検証する
- 過去のデータや傾向からテストケースの優先度を判断する
3-1 プログラムの影響範囲を漏れなくカバーする
プログラムの影響範囲を漏れなくカバーすることが理想といえます。デグレードが発生する原因の1つは、プログラムの変更による影響範囲を正しく把握できていないことです。
「影響があるとは思わなかった」といった部分でデグレードが発生することも往々にしてあります。
プログラムの変更で混入したデグレードを確実に検出するためには、影響範囲の正確な見極めが重要です。
設計書やコードを交えて、プログラムの変更がどの範囲にまで影響し得るのかを明確にすることが求められます。
なお、影響が広範囲に及ぶ場合は、リグレッションテストの実行範囲を絞り込まずに、全ての既存テストケースを実行する「フルリグレッションテスト」も一考です。
しかし、大規模なソフトウェアだと実行するテストケース数が膨大になり、多くの手間やコストがかかります。フルリグレッションテストは、自動テストの体制が整っている場合、極めて高い信頼性が求められる場合、影響範囲の見極めが難しい場合などに検討しましょう。
3-2 デグレードのリスクが高い箇所を優先的に検証する
「変更による影響はない」と断言できない既存テストケースは、できる限りリグレッションテストを実行すべきです。
しかし、現実的なソフトウェア開発では、リグレッションテストに費やせる時間や人員には限りがあります。
限られたリソースの中でテスト成果を最大化するためには、デグレードのリスクにもとづく優先順位付けが必要です。
デグレードのリスクは一般的に、「デグレードの発生確率」と「発生した際の影響度」の掛け算で求められます。機能や画面、テストケースごとに発生確率と影響度を評価し、デグレードのリスクを分析すると良いでしょう。デグレードのリスクが高いテストケースから優先的に実施することで、テスト成果を効率的に高めることが可能です。
3-3 過去のデータや傾向からテストケースの優先度を判断する
リグレッションテストの優先度を判断する際には、過去のデータや傾向も加味しましょう。
不具合が多発している機能や、特定の変更内容で混入されやすいバグなどを過去のデータから分析でき、より精度の高い優先順位付けが可能となります。
過去のデータや傾向を把握する際には、バグ管理システムや以前のテストケース・テスト結果などを参照しましょう。
4.リグレッションテストの自動化とは
リグレッションテストのテストケースが多いと、手動のテストでは時間がかかり、テスターの負担も増大します。
リグレッションテストの生産性向上や負担軽減を図りたい場合は、自動化を検討しましょう。
テストの自動化とは、テストの手動プロセスを、ツールやスクリプトなどを使って機械的に実施できるようにすることです。ここでは、リグレッションテストを自動化するメリットと注意点についてお伝えします。
4-1 自動化のメリット
リグレッションテストを自動化することで、テスターがテスト実行に費やす工数やコストを削減できます。手作業と比べて自動テストの実行スピードは格段に速く、夜間などの業務時間外に実施することも可能です。
また、人間のようなケアレスミスを防げる分、テスト結果の信頼性も担保しやすいでしょう。
特にリグレッションテストは、同じ手順のテストケースを繰り返し実行するため、一度きりでなく継続的な工数削減効果が期待できます。コストパフォーマンスが高いため、リグレッションテストは自動化に向いていると言えます。
4-2 自動化する際の注意点
リグレッションテストを自動化する際には、自動化ツールの選定・導入・設定、自動化スクリプトの実装といった作業が必要です。
適切な自動テストを実現するためには、テスト自動化に精通する人材の確保が欠かせません。
テスト自動化担当者の人件費、自動化ツールの利用費用など、さまざまな初期コストがかかることを知っておきましょう。
また、自動テストの導入初期はトラブルが付き物です。トラブル対応に時間がかかり、通常の開発プロセスに支障をきたさないように注意しましょう。
まとめ
リグレッションテストとは、プログラムの一部分を変更・修正したことで、システムに予想外の影響が現れていないかを確認するテストです。思わぬ動作不良や不具合発生のリスク回避を目的とします。
プログラム改修にともなう影響範囲が広く、工数や納期の関係から全範囲に対してリグレッションテストを行うことが困難な場合は、以下のポイントを押さえて実行しましょう。
- プログラムの影響範囲を漏れなくカバーする
- デグレードのリスクが高い箇所を優先的に検証する
- 過去のデータや傾向からテストケースの優先度を判断する
リグレッションテストは、顧客の信頼を失わないためにも、各テスト工程に組み込んでいくことが重要です。重大な欠陥を見逃さないように実行していきましょう。