リグレッションテストとは何か?修正による影響がないかを確認する

リグレッションテストの概要

リグレッションテストとは、バグ改修や機能追加などでプログラムの一部を修正した際に、修正箇所以外に影響が出ていないか確認するためのテストです。回帰テスト、ノンディグレードテストなどとも呼ばれます。

なぜリグレッションテストが必要なのか

不具合やバージョンアップなどにより、プログラムは日々改修が行われます。システムの規模が大きくなればなるほど、プログラムは複雑になり、ちょっとした修正が思わぬところに影響を及ぼします。

例をあげてみましょう。
ある大規模なECサイトで、特定の商品の画像が表示できないというバグが発生しました。プログラム改修により、商品画像は無事に表示できるようになりました。しかし、今度は買い物カゴから商品が削除できなくなってしまうというバグが発生しました。そのような改修は行っていないにもかかわらずです。
実は、画像表示のバグを改修する際に修正した処理が、買い物カゴの削除処理からも呼ばれていたのです。画像表示のために行った改修が、買い物カゴの削除処理に影響を与えていたのが原因でした。
プログラム改修の際、商品画像が表示できるかどうかのテストは行っていましたが、買い物カゴから商品が削除できるかどうかのテストは行っていませんでした。買い物カゴのプログラムには改修を行っていないため、テストは不要と考えられたからです。

このように、修正によってそれまで動作していた機能が、突然動かなくなることを「ディグレード(デグレード)」と呼びます。改修を行った際は、もちろん不具合がないかのテストを行います。
しかし、改修箇所のテストだけを行ってリグレッションテストを行わなかった場合、ディグレードの発生する確率が高まります。リグレッションテストはディグレードを発見するためのテストであると言えます。
先のECサイトの例で言うと、リグレッションテストを行わなかったために、ECサイトは再度プログラム改修を行うことになりました。もちろん、その分余計なコストがかかり、何よりユーザーに多大な迷惑をかけてしまっています。今後、客離れが起きるかもしれません。
このようなダメージを防ぐためにリグレッションテストは必要なのです。

どのようにリグレッションテストを行うのか

いつリグレッションテストを行うのか

各テスト工程ごとにリグレッションテストは行われるべきです。
共通処理のディグレードは、単体テストでは発見できません。他システムとのインターフェースのトラブルは、システム間テストでなければ発見できないでしょう。運用してみて初めて気づく不具合もあるかもしれないので、運用テスト工程でも行っておいた方がいいでしょう。

どこまでリグレッションテストを行うのか

各テスト工程で、通常のテストに加え、リグレッションテストまで行うのはコストがかかります。リグレッションテストに関しては、どこまでの範囲でテストを行うかが重要になってきます。
まず、修正したモジュールが他の処理から呼び出されていないか、影響範囲を洗い出す必要があります。他の処理と共通で使用されているようなモジュールはリグレッションテストを行うべきでしょう。
影響範囲の洗い出しができれば、リグレッションテストの範囲も決まってきます。ただ、テストにかけられる時間も限られていることから、ボリュームによっては優先順位をつける必要があります。各テスト工程の試験項目作成後には、有識者を交えてのレビューで優先順位づけを行った方がいいでしょう。
過去に発生したバグやディグレードの内容をチェックリスト化し、チェックリストに沿ってリグレッションテストの観点を決めるのも効果的です。
運用テストでは、各シナリオを一通り行うのが理想的でしょう。

リグレッションテストの自動化

リグレッションテストを行うにはコストがかかるため、自動化することが望ましいです。テストの自動化はリグレッションテストに限らず、開発プロセスの迅速化に貢献します。
一つ念頭に置いて欲しいのは、テストの自動化にもそれなりのコストがかかるということです。幅広いスキルも求められるので、計画的に自動化していくべきです。
ここでは、リグレッションテストの自動化に最適なツールを3つ紹介します。

Selenium

Webアプリケーションの自動化テストツールといえば、Seleniumを思い浮かべる方も多いのではないでしょうか。
Seleniumは、自動テストのスクリプトを書くことでWebブラウザ上の動作を制御することができるツールです。
Java、Python、Ruby、Perlなどさまざまな言語をサポートしています。

Appium

Appiumはスマホアプリのテスト自動化に使われます。
一つのスクリプトでiOS、Androidの両方に対応できます。ネイティブ、Webアプリ、ハイブリッドアプリをそれぞれ自動で実行することが可能です。
テスト用にビルドする必要がなく、リリース可能なものをテストすることができます。
Java、Python、Ruby、C#、JavaScriptに対応しています。

Jenkins

Jenkinsは、CI(Continuous Integration、継続的インテグレーション)、CD(Continuous Delivery、継続的デリバリー)のためのツールで、テストのみならず、ビルドからデプロイ、リリースまでを自動化してくれるためのツールです。
Webブラウザ経由で、ほぼすべての設定、管理をGUIで行うことができます。

参考