ここ最近の僕の開発で指標になっているのは「システムとしてのクオリティを上げるか」であり、それって当然のごとく行われているかもしれなくて、いわゆる Quality Assurance = QA なんて言葉があったり、某社では Test Engineer の方がいたりするわけです。ただ、あまりにも僕としては「ずさんな」ところが多々あると考えています。「よしAを変更した → デプロイ → Bがエラー出てる」なんてことがないように「機能が望むように動作しているか」をテストコードで担保しようと努めている次第です。例えば、先日サービス内で使用している Flickr API の一部メソッドが正常に機能しない( どんなに一般的な語彙で探しても検索結果が空で返ってくる )なんてことがありましたが、テストコードのおかげで問題の切り分け、つまり、これは本当に Web API が壊れているのだ!ということがテストスクリプトを走らせるだけで分かって「あ〜 テスト書いててよかったですね」と改めて思いました( Flickr API はその後、開発者同士のメーリングリストに投げかけたところ、同じ症状で悩んでいる人、さらには中の人も現れ、直してくれました )。
前置きが長くなりましたが、こうしたテストも含め開発周辺の便利なリソースやツールで最近使っているものを紹介してみます。ちなみに使用言語はPerl、Web Application Framework に Mojolicious を使った、公称月間1億PV以上のWebサービス / モバイルアプリのバックエンド例で、僕一人が開発を担当しています。
GitHub Private Repository
Git レポジトリに GitHub の Private Repository を利用。そもそも開発、運用にまつわるリソースはなるべく出来るものに関してはアウトソースする方針にしています。アウトソースと言っても人を使うのではなく便利なサービスに委譲する形です。そのためにどのサービスを使うかは慎重に身構えつつ、時にはノリで選ぶ感じです。GitHub は無料で使う分には Public Repository しか持てないので、月額$12の Small プランの契約をして10個の Private Repository が持てる状態になっています。Git の Repository と クールな UI を構築したりマネージするコストを考えるとアリじゃないか!と考えています。
Carton v0.9.15
Perl における Ruby の Bundler に相当するのが Carton です。「v1.0.0 が出るまで API の変更の可能性がある!」... けれど、現行 CPAN に上がっている v0.9.15 を使っています。モジュールのバージョンまで面倒を見て依存性を解決して環境をつくることが可能です。例えば分かりやすい例を挙げると Mojolicious が最近メジャーバージョンアップして 3.xx 系から 4.xx 系にアップグレードしたのですが、どーしても 3.xx 系を使いたいよねぇ〜 なんて時は cpanfile でバージョン指定しちゃうことが出来ます。
requires 'Mojolicious', '== 3.97';
この cpanfile を用意して
$ carton install
するといい具合に 3.97 がプロジェクトのディレクトリ内に入ります。
この Carton で入れたモジュールとコアモジュールだけを使ってアプリを起動するには
$ carton exec -- mojo generate app MyApp
とかやります。現在、本番のアプリケーションも全てこの「carton exec」経由で立ち上げています。Perlbrewやplenvなどをで同じバージョンのPerlをインストールすれば「同じ環境である」という再現性が非常に高くなるので、下手に依存問題などで悩まなくて済んでよいです。
Harriet
テストの際に重宝しています。作者 tokuhiriomの記事を見ればどんなものか分かるかと思います。
テストを走らせるコマンド prove の Plugin になるのが便利で、.proverc に以下を追加しています。
-PHarriet=t/harriet/
今回対象となるアプリは、実際に立ち上げる時に dsn 情報や memcached のアドレスなどをPerlスクリプトの設定ファイルから読み出すのですが、テストの際には Harriet で有効になった環境変数の情報を元に設定を動的につくっています。これでアプリを通常使うのと同じようにテストでも API 呼び出しが出来ますね。
Test::Mojo
Mojolicious に付属の Test モジュール。コントローラをテストするのに使います。こんな感じの使い勝手です。
my $t = Mojo::Test->new('MyApp::Web'); $t->get_ok('/')->status_is(200); $t->post_ok('/new', form => { title => 'title', body => 'body' } )->status_is(200);
Mojolicious クラスを継承しているモジュールを指定して何も考えずにそのままテスト書けます。
Travis CI
GitHub と連動して CI を行う Travis CI を Private Repository に対応させるってことで課金して、最近使いはじめました。高めの印象ある $129/月 でしたが使ってみて価値ありだったので!
レポジトリトップの .travis.yml の設定の元、git push したら自動的に環境を Travis CI 側で構築してテストを走らせてくれます。テストがコケた、通るようになった、などの適切なタイミングでメールなりなんなりの通知が来ます。
職質テックトーク
本来は New Relic とか Cinnamon について触れたいところですが、力つきたのでこの辺で。
そういえば、moznion が職質テックトークというのをやるらしく、そして、僕が、第1回のゲストに呼ばれているらしいので11日(木)19時30分から1時間程度、生放送にお付き合いください〜
来るYAPC::Asia 2013 の件とか YAPC::NA 行って来た的な 内容になるかもよ。よろしく〜