Software Engineer and Web Developer's Diary

1年後の自分に向けて

テストファースト/デイリービルド/リグレッションテスト

未来のいつか/hyoshiokの日記-OSSに対する企業の貢献のエントリーを読んで気づいたことです。

最初にテストケースを定義し、テストを作り、そしてテストをするということである。つまり最初にSamba 3.0の国際化の問題を徹底的に洗い出す。そしてその後その問題を解決していくというアプローチをとった。こう書いてしまうと当り前すぎて身もふたもないのだが、先に国際化の実装をするのではなく、先にテストを行いバグを徹底的に洗い出すというアプローチである。流行りの言葉でいうとテストファーストである。そして発見したバグはどんどんSambaのバグデータベースに登録した。
テストプログラムは全て自動的に実行できるようにして毎晩実行することにした。シリコンバレーの常識のデイリービルドとリグレッションテストである。最初のフェーズは毎日毎日少しずつテストが増えて行くフェーズである。もちろんそれに比例して不具合(バグ)も増えて行く。厳密に言うとバグが増えるのではなく、発見されるバグが増えるのである。バグはもとから存在しているのだから。ある時点で想定したテストプログラムが全て出来上がる。そうすると既知のバグ数というのがでてくるのであとはそれを淡々と修正していく。
例えばテストケースが100個定義されているとして、それを網羅するテストをせっせと作る。その時の進捗は100個のうち何個テストプログラムができたかということになる。当然不具合が見付かる。そうするとそれをバグデータベースに登録する。全部のテストケースを網羅するテストが実施されたとすると、今度はその発見されたバグを直すというのが我々のプロジェクトのゴールとなる。例えば修正すべき30個バグがあるとすると、それをいくつ直したかが進捗である。
テストプログラムは全て自動的に実行できるようにして毎晩実行することにした。シリコンバレーの常識のデイリービルドとリグレッションテストである。最初のフェーズは毎日毎日少しずつテストが増えて行くフェーズである。もちろんそれに比例して不具合(バグ)も増えて行く。厳密に言うとバグが増えるのではなく、発見されるバグが増えるのである。バグはもとから存在しているのだから。ある時点で想定したテストプログラムが全て出来上がる。そうすると既知のバグ数というのがでてくるのであとはそれを淡々と修正していく。

引用しまくってしまいました^^ はてなダイアリー - 未来のいつか/hyoshiokの日記さんのエントリーで特に気になったのは テストファースト デイリービルドとリグレッションテスト 修正すべき30個バグがあるとすると、それをいくつ直したかが進捗である という手法達です。この記事を読んで、今までもやもやしていたテストファーストの概念を少し自分の中で受け入れる事ができるようになりました。

テストケースを作り、そのテストケースが正常に終了すれば、進捗1ケース完了という考え方だと思います。「デイリービルドとリグレッションテスト」はそのテストケースを自動で試す為のプログラム(人の手でやると再現性が低くなる為)。「修正すべき30個バグがあるとすると、それをいくつ直したかが進捗である」という考え方もとてもわかりやすいと感じます。

じゃあ、実際のプロジェクトでもこのような手法を使えるのでしょうか? 仕様が決まればテストケースは作れます。今行っているジョブはWEBシステムなのでテストの自動化は難しいかもしれませんが、テストケースは作成できます。 仕様から考えられるテストケースをすべて洗い出し、ユーザーに提出、レビューをしてもらいます。開発前の初期段階で先にテストケースを作ってしまうという方法です。

この手法の良いところは開発の終了時期が明確になることです。今までの方法だと結合テストまで終わってもどこかに漏れがあるんじゃないの?とか、もうテストが終わってるのにバグが見つかったり、しかもそこに仕様変更まで絡んできてどこでプロジェクトが終了なのかわかりにくくなる事がありました。始めにこのテストケースが完了すれば品質は保証されているというコミットをユーザーとの間でアグリーしておけば、テストケースすべてパスすればプロジェクト終了と考えられます。仕様変更は別プロジェクトとして対応できれば最高ですね。(コミットとかアグリー…)

まぁそんなに上手くはいかないと思うのですが、この手法では終わりが分かりやすくなるということはわかりました。でも、私は逆に始めが大変になってるよな、と感じています。今まで開発後の単体テスト結合テストでひぃひぃ言っていたのが、開発前のテストケース作りでひぃひぃと言うことになります。ここでどれだけしぶとくより完全なものを作成できるかにプロジェクトの成否がかかってきます。

とはいっても最後にあがくより、最初にあがけるこの手法は前倒しという意味でも有用な方法だと、ここまで書いて感じています。

最後に テストファースト デイリービルド リグレッションテスト この3つについても少し勉強しておきましょう。