継続的リリースとテスト自動化
2011-07-01 rails, redmine, ruby, agile, test
携わらせていただいた案件が契約期間満了になりました。そこで学んだ事、感じたことをまとめておきたいと思います。
今回の案件は「アジャイルでいくぞ、オー!」的なプロジェクトでは無かったのですが、いくつかのプラクティスが自然に行われていました。 なかでも重要さを痛感させられたのは、
- 継続的リリース
- テスト自動化
の2点です。
継続的リリース
基本的に1ヶ月をタイムボックス(スプリントとも言う)とし、リリース前にどのフィーチャー/バグフィックスを盛り込むかを検討しました。バグフィックス以外の新機能については、事前にリリース日を決めておくのではないので開発者のプレッシャーも少ないように感じました。
タイムボックスの長さについては開発規模にもよりますが、今回については1ヶ月がちょうど良かったと思います。だいたい月の2週目ぐらいに次のリリースに盛り込むべきものは何かをプロジェクトメンバー全員で決定し、最後の1週間で最終テストとリリース準備を行う。開発・テスト・リリースそれぞれ十分な時間を確保できたのではと思います。
メリット
- 小規模リリースを定期的に行う事で開発のリズム感が得られる
- リリース日ありきではないので開発者のプレッシャーが少ない
- ユーザーにとっても定期的に機能が追加されるので嬉しい
テスト自動化
Rails環境だったため、RSpec / Cucumber を用いてそれぞれ単体テスト・ユーザーテストを書きました。さすがにテストファーストまではいきませんでしたが、「機能を実現するコードとそれを検証するコードはペアであるべき」という認識が開発メンバーに浸透していたように思います。
最初Cucumberの中身を見たときは「これが動くのか!」とちょっと感動しましたが、プロジェクトが進むにつれ日本語で文章を書くのが億劫に感じました。Steakなどは同じユーザーテストでもRubyコードな分、開発者には楽なのかもしれませんね。
僕は恥ずかしながらこれまでテストコードなるものは書いたことは無かったのですが、前述の継続的リリースをするに当たっては必須作業であることを認識しました。日々の作業においてもリポジトリにpushする前にかならずrakeコマンドでRSpec/Cucumberを実行し、デグレしていないことを確認していました。
また、テストが有ることでリファクタリングが行い易いですね。振る舞いを変えずに中身をきれいにできることがなんと素晴らしいことか!
テスト自動化のメリットに関してはWeb上でも色々載ってますが、それを身を持って感じれたことがよかったです。
メリット
- 「動く」コードができる
- 何度でも実行できる
- リファクタリングしやすくなる、する気にさせる
- リリース前の不安が無くなる
デメリット
- テストに時間が掛かる場合がある(それでも人間がやることに比べたら何万倍も早いのですが)
- テストの内容が正しいかは別問題(レビューの必要あり)
その他
- 見積ポーカー (参考: 見積ポーカーをやってみた | Risin)
- Redmineの使いこなし
今後の課題
- RSpec におけるmock/stub
- これらを駆使する事で、よりControllerとModelの疎結合が出来るのでしょうが、理解度が低いままでした。
- Git
- ローカルリポジトリ内でブランチ・マージとか。奥が深いので少しずつ覚えていきたいです。