エンジニア的なネタを毎週書くブログ

東京でWebサービスの開発をしています 【英語版やってみました】http://taichiw-e.hatenablog.com/

継続的デリバリー 「第1部 基礎」感想

継続的デリバリーを読んでいます。

ようやく導入と第1部を読み終えたところなのですが、既に諸々目からうろこのことが書かれていました。
一気に全部 とは行きませんが、すこしずつ自分たちのプロダクトに取り入れて行きたいことばかりです。

なお、私のモチベーションは、「とにかくメンドクサイことはしたくない」です。
2回以上同じ事をしたくないので、

・色んなパターンを(手動で)テストする
・自分のブランチでやったテストを、マージ後もう一度(手動で)やる
・開発環境でやったテストを本番環境でもう一度(手動で)やる
・前回のリリースでしたテストを、次のバージョンのリリース後にもう一度(手動で)やる
・数台のサーバに対して同じリリース作業を(手動で)やる
・リリースのたびに同じような手順書を書いたり、同じような準備をしたり(手動で)する

こういうのが全部嫌いなので、やらなくて済む方法を絶賛探しております。

以下、第1部を読んでいて、気になった点を抜き出しました。

あらゆる変更はフィードバックプロセスを引き起こさなければならない

コード、設定、ホスト環境、データ のどれかが変更されたらそのせいでアプリケーションの振る舞いが変化する可能性があるので、この4つのコンポーネントを管理下におき、
どれか一つでも変更があった場合にはそれを確かめるようにしなくてはならない。

システム設定も「自動でテスト」されなければならない

まだまだウチのプロダクトはコードのテストが整備されている、レベルです。
設定ファイルやマスターデータも自動で継続的にテストされなければならない、という発想が今までありませんでした。

例えば設定ファイルの自動テストでは、以下の様な事が必要のようです。

テスト1:
設定にある外部サービスへの参照が適切であることを保証する。
少なくともpingを打つことはできるはず。

テスト2:
アプリケーションがインストールされた後で実際にスモークテストを実行し、期待通りに作動することを確認する。
これには、設定が正しいかどうかに依存する機能を含める必要がある

理想的には、これらの結果が期待値通りでなければ、インストールやデプロイを失敗させる。

property fileの管理は、バージョン管理から怪しいので、ぜひトライしたいところです。

CIで実行すべきテストは3つ。ユニットテストコンポーネントテスト、受け入れテスト。

ユニットテスト
メソッドや関数単位。通常はDBやファイルシステムはスタブ化されていて実行しない。
全てのテストが10分以内に終わるべき

コンポーネントテスト:
アプリケーション内にあるいくつかのコンポーネントの振る舞いをテストする。
DBやファイルシステム、他のシステムをコールする。

受け入れテスト:
ビジネスによって定められた受け入れ基準をアプリケーションが満たしていることをテストする。
機能以外に、キャパシティや可用性、セキュリティが受け入れ基準に含まれることがある。

まず、こういう分け方で捉えていなかったので参考になりました。
今まで自分の中では、「単体テストユニットテスト)」と「結合テスト」しかなかったのですが、
コンポーネントテストと受け入れテストを分けることでそれぞれでテストすべきものがスッキリしました。

また、受け入れテストには、単に機能要件だけでなく、
キャパシティや可用性、セキュリティなどの事項も含まれ、これらも自動でテストされる必要があると。
この辺、手動ですらきちんとはできていないので、今後要検討です。

また、今のうちのプロダクトではユニットテストがDBと密結合してしまっていたり、
複数のpublicなメソッドをまたがるようなユニットテストがあったりする(中で呼ばれているメソッドをモックにしてしまうとテストにならないから)、
これはユニットテストコンポーネントテストを明確に分けることでうまく整理されそう。
10分以上かかっている総ユニットテストの速度アップも図れそうです。

理想的には、プロジェクトが始まった時から、テスターが開発者やユーザーと協力して自動テストを書く。

これに近いアイディアは以前にチーム内から出ていたこともあったのですが、なかなか明確に試せていなかったことの一つ。
プログラマーと別の人がテストを作ることで要件の取り違えなどを防ぎやすくなるし、
自動テストになっていれば、マージ後や、本番でのリリース時の確認にもそのまま使えます。
モヤモヤとそれっぽいことは考えていたのですが、本に書かれていたことで自身になりました。これはぜひ試そうと思います。
詳しくは第8章に書いてあるそうなので、楽しみ!

引き続き、中を読んだらブログ書きます。