第8回 Ruby勉強会
1/24 20:00-
チームラボのRuby勉強会も、第8回となりました。
今回はテストのコードレビューです!
■テストはRuby on railsの特徴
テストの便利さはRuby on railsの大きな特徴で、テストの準備が最初から用意されています。
アプリケーションの雛形と同時に、テストの雛形も自動生成されます。
今回は、先週のプログラムを元に、テストのコードをレビューします!
あるシステムにユーザーを登録する・削除するという部分のテストで、モデルのテストを行います。
DBの構造を変化させた時などに、正しくない変化が及ぼされる範囲を、簡単に判断することができます。
Railのいいところは、最初から
・開発環境(ローカルPC)
・テスト環境(ローカルPC)
・本番環境(本番)
の3つを使うように想定されています。テストをするとDBが荒れるので、専用の
DBを用意させるのです。これで繰り返しのテストも気軽に行えます。
実際にコードを書いたエンジニアから、
「本体のコードよりテストコードの方が2-3倍も多く必要になる。これはだいぶつらい。またどこまで細かくテストを書くべきか、判断が
付かない。このノウハウは、本体プログラミングとまったく別の習熟が必要になる。」
Rubyに慣れたエンジニアからは、
「どんな開発環境でもテストは大事だが、Railsはテストとセットで提供されているフレームワーク。だからプログラムのコードを書く時
点で、テストがしやすいようにコードを書くことを心がけたほうがいい。
バグが発生したときにも、すぐに直してしまわず、まずバグを再現できるようなテストコードを書くこと。
またテストのしやすさのためには、メソッドを細かくすること。
理想は1メソッド1行(笑)」
(これはタダのジョーク。1メソッドが1行では、コードをまとめて関数化する意味がない。現実的には10行、上限は20行というところか。
)
「メソッドを細かくするメリットは?」
→メソッドを細かくすることでテストが容易になり、それぞれのメソッドの影響範囲が明確になる。パフォーマンスはある程度犠牲にな
るが、Rubyではさほどパフォーマンスが要求されないことが多いし、テストドリブン開発の基本でもある。
などの解説が出ました。
■Modelテスト開始!
テスト用のコードをすでに書いてあるプログラムを使って、Ecripse上でUnittestを実行します。
テストは、コードの上から順番ではなく、テスト用メソッド名のアルファベット順に実行されます。
テストランナーが、テスト用にデータの初期化など、準備をやってくれます。
Railsでは、rake というツールを使って、テストコード全体を実行することができます。
テスト用のDBが、デモ用の環境ではできてないなど、いくつか問題がありましたが、修正して無事テスト終了。
■Contollerテスト開始!
ある程度はControllerのテストコードが生成されています。
また、テストに便利なライブラリが豊富に用意されています。コントローラをgetで呼ぶ、postで呼ぶ、その結果のHTTPステータスの判定、
リダイレクト先の判定、コントローラのインスタンス変数の値の取得、etc…
これがRuby on Railsの大きな特徴で、JavaとRuby両方書く開発者からは、
「ここはもうホントに便利!」「ヤバい!」という声が飛びます。
「便利かもしれないが、いくつか独自な部分があるので、ここから入門した人はちょっと影響はあるかも..」
get,postを使って、パラメータがどうなっているかチェックするテストをしてします。
「今回のテストコード生成にかかったのはだいたい1日ぐらい」
という声に、速い!という声が飛びました。
実行して初回のエラーは1件。
追加の紹介:
インテグレーションテスト
「ひとつのControllerであれば今のテストでいいんだけど、Railsにはインテグレーションテストというものがあって、複数のController
を使うシナリオテストみたいなものも書くことができる」
mocks
「たとえば本番環境でしか用意できないデータ(たとえば、本番環境でないとインターネットに接続できないとか)をこのディレクトリ
においておくと、テスト時に自動で読んでくれる」
■コードレビュー1段目!
次は、勉強会でコードを書いた新人のレビューです。
例題として、サイコロプログラムを構築されました。
サイコロプログラムは、コードが実行されると
・1秒待って
・1-6の数字のどこかを選択し、
・数字に対応する文章を順番にif elsif elseで
呼び出す(3=「サンざんなお話!」とか)
というプログラムです。
これを先輩社員がリファクタリングしていきます。
「この場合はcase文を使うと、numを繰り返さずにすむので簡潔になります。」
「イチから書き直すなら、文章と数字をハッシュに入れて、ランダムの数字をdata.lengthで6以外も対応できるようにします。」
会場から「ここはハッシュよりリストの方が」というツッコミが入り、コードはさらに洗練されていきました。
■コードレビュー2段!
実際に業務で使ったちょっとしたプログラムで、
「任意でエラーコードを出してくれるhttpサーバー」
を作りました。
httpのURLが、/数字 だったら、数字をHTTPのステータスコードとして返します。
http://localhost/300だったら300番とか。
たった50行程度でテスト用ウェブサーバが作れること、それが単なるWindowsマシンで動くことに、会場からはどよめきの声が上がりました
。
■コードレビュー3段!
wordのテキスト(docファイル)内をマルチファイル検索するスクリプト
(日本語も正規表現も使える)
Windows の OLE経由で、MS-Wordを不可視で起動して呼び出すことで、Wordで書かれたファイルを検索する。
■コードレビュー4段!
BMI計算スクリプトのページ。
IEの中で、RubyがJavaScriptのように動く!
HTML(HTA)ページをGUIとして使えるので、バッチではない対話的プログラムを作るのに便利。
Windows環境で、ActiveScriptRubyをインストールした場合だけ動作する。
デバッグについては今回できなかったので、勉強会はもう1回追加で行われることになりました!