SHOEISHA iD

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

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

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

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

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

Catalystでテストを作成・実行

テストの実行

 テストを実行するに当たって、まず最初にTestSampleアプリケーションを作成します。

[リスト2]TestSampleアプリケーションを作成
$ catalyst.pl TestSample

 Catalystでテストを実行する方法として、make testで実行する方法とproveコマンドを使用する方法を紹介します。

make test

 アプリケーションのディレクトリ以下には、「Makefile.PL」というファイルが作成されています。これはMakefileを作成するためのPerlスクリプトになっており、テストやアプリケーションの配布などで使用します。

 makeを使ってテストを実行するには、次のような手順で行います。

[リスト3]makeでテストを実行
$ cd TestSample
$ perl Makefile.PL
$ make
$ make test

 この方法は、テストファイルを追加した場合にMakefileを再作成する必要があり、頻繁にコードを編集する開発時にはあまり向いているとは言えません。

prove

 proveコマンドは、Test::Harnessモジュールに付属するコマンドです。

[リスト4]proveコマンド
$ prove --lib テストディレクトリ

 先ほど作成したTestSampleのテストを実行するには、アプリケーションのディレクトリ直下で、次のように実行します。このとき指定したテストディレクトリ以下のファイルをファイル名でソートした順に実行します。

[リスト5]proveでTestSampleアプリケーションのテストを実行
$ cd TestSample
$ prove --lib t

 proveコマンドを使用した場合には、テストファイルを追加した場合でも動的に読み込まれるため、makeを使用する場合に比べてより簡単にテストを実行できます。

 上記のように実行した場合、Catalystのデバッグメッセージが表示されて、テストの結果が見づらくなってしまいますが、環境変数CATALYST_DEBUGを0に設定することで、デバッグメッセージを出さないようにできます。この場合の出力結果は、次のようになります。

デバッグメッセージを非表示にしてproveでテストを実行
デバッグメッセージを非表示にしてproveでテストを実行

 また、proveコマンドで実行した場合にはエラーが発生した箇所が赤色で表示されるなど、見た目にも分かりやすくなります。

テストに失敗した場合
テストに失敗した場合

 proveコマンドには次のようなオプションを指定できます。

proveコマンドの主要オプション
オプション 省略表記 説明
--lib -l libディレクトリを指定
--verbose -v 1つ1つのテスト結果を表示
--shuffle -s テストファイルをランダムに実行
--QUIET -Q テスト結果のサマリーのみを表示
--reverse   逆順で実行
--recurse -r テストディレクトリを再帰的にたどってテストを実行

テストファイル

 それでは、テストファイルの中身を見ていくことにしましょう。まずは最初から用意されている01app.tファイルを見ていくことにしますが、生成されるテストファイルはCatalyst::Develのバージョンによって次のように違いがあります。

[リスト6]Catalyst::Devel1.21以前の01app.t
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 2;

BEGIN { use_ok 'Catalyst::Test', 'TestSample' }

ok( request('/')->is_success, 'Request should succeed' );
[リスト7]Catalyst::Devel1.22以降の01app.t
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;

BEGIN { use_ok 'Catalyst::Test', 'TestSample' }

ok( request('/')->is_success, 'Request should succeed' );

done_testing();

 1.21以前の場合には、「use Test::More tests => 2」の行で、実行するテストの数(テストプラン)を指定していますが、1.22以降ではテスト数の指定はなく、最後の行に「done_testing()」が呼び出されています。

 テスト数を指定する場合には、実際に記述するテストの数と一致させる必要があり、間違っている場合にはエラーメッセージが表示されてしまうのですが、リスト6のように記述することで実際に記述したテスト数とテストプランの対応を気にしなくてすむようになります。

 テストファイルもPerlのスクリプトファイルとして記述されているため、さまざまなモジュールを使用できますが、以降では代表的な3つのテストモジュールと、それらによって提供されるメソッドを説明します。

Test::More

 Test::Moreでは、基本的な成功/失敗条件を判定し、その結果をレポートするためのメソッドが用意されています。判定メソッドには条件以外にテスト名を記述できるので、どのテストで失敗したかを把握しやすくなっています。

ok

 okは与えられた条件が真の場合にテスト成功、偽の場合にはテスト失敗としてレポートします。例えば次のようにテストを記述します。

[リスト8]okの例
ok( $user->age >= 20, 'check adult' );
ok( $user->name eq 'admin', 'check user name' );

 ここでは、ユーザーの年齢と名前をチェックしています。'check adult'や'check user name'はテスト名で、テストの結果が偽の場合などでレポートされる場合に出力されます。例えば年齢が20未満の値の場合には、次のようにレポートされます。

[リスト9]okでテスト結果が偽となった場合のレポート例
t/01app.t .......... 1/?
#   Failed test 'check adult'
#   at t/01app.t line 9.
# Looks like you failed 1 test of 4.
is、isnt

 isisntでは、渡された値が想定する値と等しいか、等しくないかを判定します。

[リスト10]is、isntの例
is( $invidation_code, 1234, 'valid invitation code' );
isnt( $user->name, '', 'need user name' );
use_ok、require_ok

 use_okrequire_okは、それぞれuserequire宣言をした結果を判定します。use_okはテストファイルのBEGINブロックに記述され、テスト対象のアプリケーションクラスやコンポーネントなどを指定します。

その他のメソッド

 上記で紹介したもの以外にも、一部ではありますが、次のようなメソッドが用意されています。詳細はTest::Moreを参照ください。

Test::Moreのメソッド(一部)
メソッド名 説明
like 指定した正規表現にマッチする場合に真、それ以外は偽として判定する
unlike likeの逆で正規表現にマッチしない場合に真
cmp_ok 比較する値と比較オペレータを指定して判定する
can_ok クラスにメソッドが定義されているか判定する
isa_ok 渡されたオブジェクトが指定されたクラスかどうか判定する
new_ok 渡されたクラスがnewできるかどうか判定する
diag メッセージを表示する

次のページ
Catalyst::Test

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー