テストの実行
テストを実行するに当たって、まず最初にTestSampleアプリケーションを作成します。
$ catalyst.pl TestSample
Catalystでテストを実行する方法として、make testで実行する方法とproveコマンドを使用する方法を紹介します。
make test
アプリケーションのディレクトリ以下には、「Makefile.PL」というファイルが作成されています。これはMakefileを作成するためのPerlスクリプトになっており、テストやアプリケーションの配布などで使用します。
makeを使ってテストを実行するには、次のような手順で行います。
$ cd TestSample $ perl Makefile.PL $ make $ make test
この方法は、テストファイルを追加した場合にMakefileを再作成する必要があり、頻繁にコードを編集する開発時にはあまり向いているとは言えません。
prove
proveコマンドは、Test::Harnessモジュールに付属するコマンドです。
$ prove --lib テストディレクトリ
先ほど作成したTestSampleのテストを実行するには、アプリケーションのディレクトリ直下で、次のように実行します。このとき指定したテストディレクトリ以下のファイルをファイル名でソートした順に実行します。
$ cd TestSample $ prove --lib t
proveコマンドを使用した場合には、テストファイルを追加した場合でも動的に読み込まれるため、makeを使用する場合に比べてより簡単にテストを実行できます。
上記のように実行した場合、Catalystのデバッグメッセージが表示されて、テストの結果が見づらくなってしまいますが、環境変数CATALYST_DEBUGを0に設定することで、デバッグメッセージを出さないようにできます。この場合の出力結果は、次のようになります。
また、proveコマンドで実行した場合にはエラーが発生した箇所が赤色で表示されるなど、見た目にも分かりやすくなります。
proveコマンドには次のようなオプションを指定できます。
| オプション | 省略表記 | 説明 |
| --lib | -l | libディレクトリを指定 |
| --verbose | -v | 1つ1つのテスト結果を表示 |
| --shuffle | -s | テストファイルをランダムに実行 |
| --QUIET | -Q | テスト結果のサマリーのみを表示 |
| --reverse | 逆順で実行 | |
| --recurse | -r | テストディレクトリを再帰的にたどってテストを実行 |
テストファイル
それでは、テストファイルの中身を見ていくことにしましょう。まずは最初から用意されている01app.tファイルを見ていくことにしますが、生成されるテストファイルはCatalyst::Develのバージョンによって次のように違いがあります。
#!/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' );
#!/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は与えられた条件が真の場合にテスト成功、偽の場合にはテスト失敗としてレポートします。例えば次のようにテストを記述します。
ok( $user->age >= 20, 'check adult' ); ok( $user->name eq 'admin', 'check user name' );
ここでは、ユーザーの年齢と名前をチェックしています。'check adult'や'check user name'はテスト名で、テストの結果が偽の場合などでレポートされる場合に出力されます。例えば年齢が20未満の値の場合には、次のようにレポートされます。
t/01app.t .......... 1/? # Failed test 'check adult' # at t/01app.t line 9. # Looks like you failed 1 test of 4.
is、isnt
is、isntでは、渡された値が想定する値と等しいか、等しくないかを判定します。
is( $invidation_code, 1234, 'valid invitation code' ); isnt( $user->name, '', 'need user name' );
use_ok、require_ok
use_okとrequire_okは、それぞれuse、require宣言をした結果を判定します。use_okはテストファイルのBEGINブロックに記述され、テスト対象のアプリケーションクラスやコンポーネントなどを指定します。
その他のメソッド
上記で紹介したもの以外にも、一部ではありますが、次のようなメソッドが用意されています。詳細はTest::Moreを参照ください。
| メソッド名 | 説明 |
| like | 指定した正規表現にマッチする場合に真、それ以外は偽として判定する |
| unlike | likeの逆で正規表現にマッチしない場合に真 |
| cmp_ok | 比較する値と比較オペレータを指定して判定する |
| can_ok | クラスにメソッドが定義されているか判定する |
| isa_ok | 渡されたオブジェクトが指定されたクラスかどうか判定する |
| new_ok | 渡されたクラスがnewできるかどうか判定する |
| diag | メッセージを表示する |


