システム開発のテストを効率化する自動テストと回帰テスト
「テストっていくらやっても安心できないんだよなぁ…」
「テストの精度を上げられたらトラブル減らせそうだよな…」
テストが大事なことは分かっていても、
- 「納期まで時間がないし…」
- 「めんどくさいし…」
という理由でテストに十分な時間や労力を掛けていないプロジェクトはよくあります。
炎上してるプロジェクトに限って、テスト要員に新入社員を大量投入してたりしますよね。
一方でプログラムをテストするためのプログラム(自動テスト)を書いて、ビルドする度に自動的にテストも実行されるような仕組みを導入しているプロジェクトもあります。このような仕組みは継続的インテグレーションと呼ばれていて、ツールや方法論も多数あります。
私の個人的意見としては自動テストも、導入すべきプロジェクトとそうでないプロジェクトがあるように思います。
そんなわけで、今回は「テストを効果的に行う方法」を紹介します。
新規開発とリリース後の機能追加ではテストのやり方も変わる
新規開発のテスト
新規にシステム開発する場合は、テストケースも新規に作成しますよね。仕様通りに動いているかを確認するためのテストケースを一つ一つ起こしていきます。
追加機能のテストには、回帰テストも必要
それに対して、リリース後の機能追加時に行うテストは、新規追加した機能を確認するテストケースを作成して実施するのに加えて、既存機能が今回の機能追加によって影響を受けていないかをテストする必要があります。
既存機能が壊れずに正常動作していることを確認することを回帰テスト(リグレッションテスト)と言います。
ということで、機能追加の場合は、
追加機能分のテストに加えて、回帰テストが必要になります。
そして、この回帰テストは機能追加する度に何度も繰り返し行います。ですから、この部分を自動化するためにテストコードを書くべきなのです。
プログラムをテストするプログラムとは
JavaだとJUnitっていうテスティングフレームワークが有名です。
例えば、
//テスト対象プログラム public class Calc { public static boolean add(int num1, int num2) { return num1 + num2; } }
のようなプログラムをテストするコードは
//プログラムをテストするプログラム import junit.framework.TestCase; public class CalcTest extends TestCase { public void testAdd() { //テスト対象メソッドを実行する int result = Calc.add(2, 4); //戻り値が6であることを確認する。6じゃない場合、テスト失敗と判定される assertEquals(6, result); } }
のようになります。
CalcTestを実行すると、assertEqualsメソッドで戻り値が想定通りの値かどうかを判定します。想定通りの値であればテストOKと表示されます。
違っていればテストNGと表示されます。
人の手でテストするのではなくテストをするプログラムを作ってプログラムにテストをさせているんです。
「テストコードが正しいかはどうやってテストするんだ?」
っていう禅問答みたいな疑問は沸いてきますが、間違ったテストコードを書けば想定通りの判定結果にはならないはずなのでうまく機能します。
こうやって、テストを自動化しておけば、機能追加の度に行う回帰テストを自動で行わせることが出来ます。
ですから、テストを自動化する時のポイントは何度もそのテストを行うかです。
受託開発などで、「一度納品したら、その後の機能追加は発生しない」というような場合はテストを自動化しなくても良いでしょう。テストコードを正しく書いて実施するのは意外と時間が掛かりますからね。
何度も繰り返しそのテストコードを実行するならば、少し時間と労力をかけてでもテストコードを書いた方が良いので、労力と得られる効果のバランスを考えて、テストを自動化するかを決めると良いでしょう。