はじめに
Web APIを使って様々なサービスと連携するというアーキテクチャはすっかり定着した感があります。みなさんも,Web APIを使ってデータをやりとりするアプリケーションを書く機会も増えているのではないでしょうか。
Web APIを使うアプリケーションの開発では,テストやデバッグをする際のAPIアクセスが悩みどころとなります。本物のサーバを使ったのではテストデータの初期化などに手間がかかりますし,逆にHTTPアクセス自体をスタブやモックを使って間接化してしまうとそれが本当に有効なテストなのか不安が残ってしまいます。
筆者も,仕事やプライベートでのコーディングでこのような悩みに何度も遭遇しました。これらを解決するために開発したのがwwです(wwと書いて'double-web'と読みます)。
ダミーWebサーバ作成ライブラリww(Double Web)
wwは,Webサービスの簡単な偽物を容易に作るためのライブラリです。次のような機能を備えています。
- 軽量WebサービスフレームワークSinatra(原悠さんによるRuby Freaks Loungeでの紹介記事)を使って簡単なWebサービスAPIを作成できる。
- 実際にWebサーバとして動作する。アプリケーション側でHTTPライブラリに細工する必要がない。
- 対象となる外部サービスとのやりとりを目視で確認できる。
- 事前に期待するリクエストを定義したり(モック),呼び出し後にリクエストを検証したり(スパイ)できる。
モック? スパイ? ダブル?
開発中やデバッグの際に,本番とは別のサーバを使うなどして,外部の環境に影響を与えないようにすることは一般的な開発手法の一つです。特に,テスト駆動での開発では,自動化されたテストを使ってプログラムを繰り返し動しながら開発を進めるため,外部サービスへ影響を与えないことがとても重要なポイントとなります。そのため,これまでも外部サービスを一時的に偽装する手段として,「モック」や「スタブ」といった手法が用いられてきました。
この「偽装」手段は流派によって微妙に呼び方や扱いが異なります。コミュニケーションを円滑にするため,『xUnit Test Patterns』では,これらの名前と役割を定義しています。本稿でもこの定義に従うため,ここで簡単に説明しておきます。
- ダブル(Double)
- モックやスタブ,ダミー,スパイなど,実際の環境から切り離してテスト可能にするための手法の総称です。wwの名前も「WebのDouble」ということでここからとっています。
- スタブ(Stub)
- 自動化テストからの呼び出しを単純に置き換えるための手法です。実際に呼び出されたときに,固定値など簡単な応答をします。呼ばれ方の検証などには関知しません。
- モック(Mock)
- 自動化テストとコンポーネント間で,相互の呼び出しを検証するための手法です。呼ばれ方や,呼ばれる順番などを検証します。また,モックを定義するということは「そのテストで呼び出される」はずであることを意味します。そのため,一度も呼び出されていない場合にその旨を通知することもあります。
- スパイ(Spy)
- 自動化テストから呼び出されたことを事後に検証するための情報をとっておく手法です。簡単な応答をしたあとに,実際の呼ばれ方も検証したい場合に使います。
より詳しい情報は,以下のURLから入手できます。

