騒がしい未来

サッカーやインターネット、旅行、日々のお仕事など、普段思ったことををつらつらと書いていく、高須正和のブログサイトです。 さいきんはtwitterばかり。

第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回追加で行われることになりました!