Pinto公開に向けて #20 ― HTTPレイヤからのTDD
あらすじ
Pintoというソーシャルブックマークサービス、およびPintoBeansというWebアプリケーションフレームワークをRubyで開発中です。その際に気づいたことや工夫した点などを、備忘録を兼ねて書いています。その20回目です。
HTTPレイヤのテストこそ重要
第19回では、HTTPレスポンスヘッダのテストを考えてみたわけですが、もっと考えると、RackによるHTTPリクエストのエミュレートで良しとするのは中途半端じゃないんじゃないか、という気がしてきました。Rackだって、いつ開発が止まるか分からないわけで、より信頼できるHTTPのレイヤからテストを書くほうが適切なんじゃないか。
Webアプリの実装で重視すべきは、どういうアーキテクチャを採用するかではなくて、どういうHTTPリクエストにどういうHTTPレスポンスを返すかですよね。ストレージがDBだろうがファイルだろうが、何かを保存するのは、所期のHTTPレスポンスを返すためでしょう。だとしたら、力を入れて書くべきなのは、HTTPレイヤのテストのはずです。内部実装は、あとでいくらでもリファクタリングできますし。
テストを書いてみた
そんなわけで、HTTPレイヤのテストを書いてみました。まだまだ途中ですが。
テストを実行すると、Net::HTTPで実際にWebサーバへのHTTPリクエストが行われます。テスト内容は、条件付きでないGETメソッドでトップページにアクセスされた場合は、「ステータスコードは300を返すべし」とか、「Cache-Controlヘッダは“max-age=21600”を返すべし」とか、そんな感じです。条件付きGETの場合は、ETagが正しければ304を返すとか。
「If-None-Match: *」や「If-None-Match: "hogehoge", "fugafuga"」のケースが抜けていますし、「If-Unmodified-Since」との組み合わせもありますし、想定しなければならないケースは山ほどあります。先は長いですねー。