今回は弊社サービスであるShanon Marketing Platformの開発で行っているユニットテストについて書いてみたいと思います。
恐らく2008年の夏くらいです。
コードレビューを始めた時期と同じくらいだと思います。
その頃はバグが多発していて何とかしないといけないなーと思って始めました。
Test::Classを使用してXUnitライクに書いています。
テストはクラス単位で行っています。
テスト対象クラス一つに対しテストクラスが一つ、テストクラスを実行するテストスクリプトが一つ存在します。
テストスクリプトをクラス毎に用意しているのは、
- クラス単位でテストが実行できるようにしたい
- テスト間の影響をできるだけ無くしたい
という狙いがあります。
トリッキーなことをすることでやっとテストができるという場合もありますので、どちらかというと後者の狙いの方が大きいです。
開発時にはテストスクリプト単体を繰り返し実行していきます。
開発がある程度終わりに近づき他のクラスへのデグレが無いことを確認したり、デイリーでテストする際にはまとめてテストを実行する必要あります。
その場合にはModule::Buildを使用して全てのテストスクリプトをまとめて実行するようにしています。
ごくごく一般的なものばかりです。
- Test::Class
- Test::More、Test::Exception等
- Module::Build
- Devel::Cover
XUnitライクにテストを行うためのテストクラスのベースとして使用
各チェックメソッド内でのアサーション。
この辺は
http://www.amazon.co.jp/Perl-Testing-Developers-Notebook/dp/0596100922/ref=sr_1_1?ie=UTF8&qid=1311040508&sr=8-1
が参考になります。
テストをまとめて実行するために利用
コードカバレッジの取得
実際にやってみた一番大きなメリットだと思ったのは、クラスのインタフェースがシンプルになる点です。
インタフェースがシンプルじゃないととてもじゃないけどテストが大変なので。
デメリットはやっぱり工数がかかることです。
ただこれは後からテストを作る場合であって、テスト駆動で開発を行えばそんなに増えないかなーって印象です。
ユニットテストを始めて3年くらい経ちましたが、現在のコードカバレッジ(命令網羅)は33%ほどです。
もともとアプリケーション自体がフレームワークべったりに書かれていたためにテストコードが書きづらく、当初は新たに追加したクラスをメインにテストコードを書いてました。
現在はソースコードを徐々にフレームワークから切り離して行く過程で、既存のコードにもテストコードを書くようになっています。
6%/半年くらいのペースでカバレッジは上げていきたいのですが、なかなか難しいところです。
今回はざっくりしすぎた内容でしたね。。。
もうちょっと突っ込んだ話やTipsは次回のネタにでも取っておきます。