SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Webアプリケーションフレームワーク「Catalyst」入門

初めてのCatalyst入門(9)
Catalystのテスト関連モジュール

Catalystでテストを作成・実行

Catalyst::Test

 Catalyst::Testでは、Catalystアプリケーションに対するリクエストを行い、そのレスポンスを用いてさまざまなテストを行うメソッドが用意されています。

 Catalyst::Testは、デフォルトではサーバを起動することなく、アプリケーションの動作をシミュレートしたリクエスト-レスポンスに対してテストを行いますが、環境変数「CATALYST_SERVER」を使用することでリモートサーバに対するテストを行うこともできます。リモートサーバに対してテストを行う場合には、次のように指定します。

[リスト11]192.168.123.57で動作するサーバに対するテストの実行例
$ CATALYST_SERVER=http://192.168.123.57:3000 prove --lib t

 Catalyst::Testに定義されているメソッド/関数には次のものがあります。

request

 requestメソッドと後述するgetメソッドでは、リクエスト先に関する情報を引数として渡してやると、対象となる接続先に対してリクエストを行い、レスポンスを受け取ります。

 引数には、文字列形式のURLやURIオブジェクト、そしてHTTP::Requestオブジェクトを渡すことができます。また、オプションとしてリクエスト時に使用するヘッダ情報をハッシュ参照として指定することもできますが、現在使用できる値はhostのみです。

 requestメソッドでは、リクエストの結果としてHTTP::Responseのオブジェクトを返します。

[リスト12]requestの例
# URLを文字列として指定
my $res = request('/user?name=John');
$res = request('http://example.com/user?name=John');
# hostヘッダを指定
$res = request('/user?name=John', { host => 'example.com' });
# URIオブジェクト
$res = request(URI->new('http://example.com/user?name=John'));
# HTTP::Requestオブジェクト
$res = request(HTTP::Request->new(GET => 'http://example.com/user?name=John'));

 HTTP::Responseオブジェクトを使用することで、コンテンツ以外にも、リダイレクトの判定やHTTPヘッダのテストなど、より詳しい条件を記述できます。requestメソッドは単独ではテストを記述することができないので、他のテストメソッドと合わせて使用します。

 requestメソッドを使用したテストは次のように記述します。

[リスト13]requestを使用したテストの例
# ステータスが2XXの場合
ok( request('/')->is_success, 'Request should succeed' );
# ステータスが4XX、5XXの場合
ok( request('/notfound')->is_error, 'Not found page' );
# リクエスト先がリダイレクトする場合(ステータスが3XX)
ok( request('/jump')->is_redirect, 'Redirect page' );
# HTTP::Request::CommonのPOSTメソッドを使用してパラメータを送信
use HTTP::Request::Common;
my $response = request( POST '/register', [
    name => 'john',
    age => 32
]);
# responseのコンテンツから正規表現で登録した値をテスト
my $content = $response->content;
like ($content, qr/john/, 'Check registered name');
like ($content, qr/32/, 'Check registered age');

 requestメソッドでは、デフォルトの呼び出し方をした場合にはHTTPのGETメソッドで送信されてしまいます。HTTPのPOSTメソッドを使用するには、上記の後半で記述しているように、HTTP::Request::Commonを使用します。

 この例では、HTTP::Request::Commonに定義されているPOST関数を用いてHTTP::Requestオブジェクトを作成し、requestメソッドに渡しています。そしてそのレスポンスに含まれる登録情報を、likeメソッドを使用して正規表現でチェックしています。

 HTTP::Request::Commonには、HTTPのメソッド名に対応する次のような関数が定義されています。

HTTP::Request::Commonの関数
関数名 引数仕様
GET $url
GET $url, Header => Value,...
HEAD $url
HEAD $url, Header => Value,...
PUT $url
PUT $url, Header => Value,...
PUT $url, Header => Value,..., Content => $content
DELETE $url
DELETE $url, Header => Value,...
POST $url
POST $url, Header => Value,...
POST $url, $form_ref, Header => Value,...
POST $url, Header => Value,..., Content -> $form_ref
POST $url, Header => Value,..., Content -> $content

 例えば、User-Agentによりビューを切り替えるようなアプリケーションの場合、次のようにUser-Agentを指定することで、テストを実行できます。

[リスト14]User-Agentを指定したGETの例
use HTTP::Request::Common;
ok(request( GET '/', User_Agent => 'DoCoMo/2.0')->is_success, 'DoCoMo test');
get

 getは、内部的にはrequestメソッドを呼び出しているので、引数については同じものを指定できます。requestメソッドとの違いは、戻り値がHTTP::Responseオブジェクトではなく、コンテンツ文字列になります。

 getメソッドも単独ではテストを記述することができないため、okなどのメソッドと合わせて使用します。

 次の例では、存在しないURLに対してリクエストを行い、戻ってきたコンテンツが'Page not found'と一致するかどうかをテストしています。

[リスト15]getを使用したテストの例
my $content = get('/notfound');
ok($content eq 'Page not found', 'not found page');
その他の関数

 上記で紹介したもの以外にも、次のような関数が用意されています。詳細はCatalyst::Testを参照ください。

Catalyst::Testの関数
関数名 説明
ctx_request requestとほぼ同じであるが、Catalystのコンテキストオブジェクトも返す
action_ok レスポンスのステータスコードが2xxの場合に真となる
action_redirect レスポンスのステータスコードが3xxの場合に真となる
action_notfound レスポンスのステータスコードが404の場合に真となる
content_like レスポンスのコンテンツが指定した正規表現にマッチする場合に真となる
contenttype_is レスポンスのContent-Typeをチェックする

次のページ
Test::WWW::Mechanize::Catalyst

この記事は参考になりましたか?

Webアプリケーションフレームワーク「Catalyst」入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 花田 善仁(ハナダ ヨシヒト)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5085 2010/05/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー