岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

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」との組み合わせもありますし、想定しなければならないケースは山ほどあります。先は長いですねー。

現時点の実装

現時点の実装は、こんな感じです。

Webアプリ側に書くべきコードがフレームワーク側に書かれているなど、ひどい実装ですが、テストはすべて成功します。

あとはテストをがしがし書いて、内部実装をリファクタリングしていくだけ。がんばれ俺。