第6回 UnitTestをする理由 (その1)
開発しているとき、どんな気持ち?
みなさんが普段開発をしているとき、「自分が作っているこのプログラムってちゃんと動くかなぁ?」という気持ちになったことはありませんか? そういった気持ちになるのは次のようなことが気になるからだと思います。
- タイプミスをしているのではないか?
- 引数の数や型を間違えてしまっているのではないか?
- 作成した関数が期待したとおりの値を返してくれないのではないか?
- 正規表現の使い方が間違っていないか?
- フレームワークやライブラリの使い方は間違っていないか?
これらは一言でいえば開発しているものに対する"不安"ということになります。
こういった"不安"はプログラムを書いている時点では目に見える形で現れてこないので、目に見えないプレッシャーとしてプログラマを襲ってきます。そのプレッシャーは次第にプログラマの開発効率を下げて、決められた期間に決められたことができなくなり、どんどん追い詰められていくということになることが多いのではないでしょうか?
そういう経験を積み重ねていくとプログラミングという行為自体が楽しくなくなり、さらに泥沼に…という連鎖が発生してませんか?
みなさんが今プログラマを職業とされているならば、そのきっかけ/原動力は元々次のようなものだったはずです。
- 図形が表示されるものをつくって実行したら期待した通りのもの表示された!
- 時間をかけてサンプルを入力したら、すごいアニメーションが動いた!
- 今まで手作業でやっていたすごい難しい計算が、あっという間に終わった! ... etc.
上記のようにやはりプログラマの原動力は「思った通りに動いた!!!」ということだと思います。だれも動かないものを作りたいわけではないですよね? その「動いた!!!」という感動を後押ししてくれるのが"UnitTest"なのです。
UnitTestはなぜ必要なの?
ここでUnitTestがなぜ必要なのかを考えてみましょう。必要ないものをがんばってやっても仕方がないですからね。
プログラマの責務は"仕様通りに動作するものを作ること"です。プログラマが会社やチームから期待されているのは、それぞれのプログラマが担当している"もの"が正しく動作することということになります。
結合テストはそれぞれのプログラマが作ったものを全部合わせた状態で動作するかを確認する作業でしたが、UnitTestはあくまでも各プログラマが担当している"もの"がそれ単独で動作するかを確認する作業になります。
さて、みなさんは普段開発をしているときに、今書いているプログラムが期待どおりの動作をするかどうかをどのように確認していますか?
プログラムをコンパイルしたときやプログラムを実行したときにエラーメッセージが出力されることによって、そのプログラムが"正しく動作していない"ということを確認することができます。しかしこの方法では、そのプログラムが"期待したとおりの動作をしている"ということを確認することはできません。
UnitTestでは、自分が今から作成するプログラムがどのような動作をすることが期待されるかということを、実際のプログラムを書く前に記述します。また、UnitTest用に特別な言語を使用するわけではなく、普段自分が使用しているプログラム言語を使って記述します。この講座を読まれている方ならばPHPを使うということですね。
またUnitTestは実施するタイミングというのが重要です。次のようなサイクルでUnitTestをすることによって「動いた!!!」という感動がいつでも味わえるようになります。
- (事前準備) それぞれのプログラマが何を作るべきかという大枠の設計はしておく。
- (1) 自分の担当部分がどのように動くべきかを考える。
- (2) 考えたものをテストとして書いてみる。
- (3) 実際にプログラムを書いてみる。
- (4) (3)で書いたものが(2)で書いたテストにパスするかを確認する。
- (5) パスしたら素直に感動する(動いた!!!)、パスしなかったらそんなに落ち込まずに(3)に戻って手直しをする。
- (6) パスしても気を抜かずに無駄な部分がないかを再確認する。無駄があれば(3)に戻って手直しをする。
どうでしょうか? 面倒だなぁと思いましたか? 今までやったことがない手順だと思うので手間がかかるなぁと思われるかもしれませんが、やってみると"不安"というのがかなり解消されることがわかると思います。(2)で書くテストというのは実は自分が抱えている"不安"を形にしたものです。もう一度最初に示した"不安"を思い出してみましょう。
- タイプミスをしているのではないか?
- 引数の数や型を間違えてしまっているのではないか?
- 作成した関数が期待したとおりの値を返してくれないのではないか?
- 正規表現の使い方が間違っていないか?
- フレームワークやライブラリの使い方は間違っていないか?
上記のような不安があるならば、それをテストとして書いてしまえばいいわけです。テストにパスしなければ「やっぱり心配したとおりダメだったか、けどこれにパスすればいいんだ」と思えるので漠然とした不安が目に見えるものになり、どうなれば解決したことになるかも明確になります。
このようにUnitTestは他の人のために記述するものではなく、プログラマが自分のために自分自身で自分が普段使っている言語で記述するものです。







