Catalyst::Manual::Cookbook::Test

さらに分割。
テストについては外部からリクエストを送って、みたいな方法しかない?ようなので、内部のモジュール、特にモデル部分のテストをどうやってやるかが問題。
そこは普通のPerlモジュールと同じ方法でできるのかね。

http://search.cpan.org/~jrockway/Catalyst-Manual-5.700701/lib/Catalyst/Manual/Cookbook.pod#Testing
テストはWebアプリケーションの開発プロセスに不可欠な要素だ。テストは複数人での開発とコードの変更を容易にする。

Testing

Catalystは開発中のテストと本番環境にデプロイする前のテストをやりやすくする。
Catalyst::Testは同じテストをローカル(外部のデーモンを除く)とリモートのHTTPサーバに対して行えるようにする。

  • Tests

ケルトンアプリケーションのt/ディレクトリを説明しよう。

    mundus:~/MyApp chansen$ ls -l t/
    total 24
    -rw-r--r--  1 chansen  chansen   95 18 Dec 20:50 01app.t
    -rw-r--r--  1 chansen  chansen  190 18 Dec 20:50 02pod.t
    -rw-r--r--  1 chansen  chansen  213 18 Dec 20:50 03podcoverage.t
    • 01app.t

アプリケーションをロードし、コンパイルし、正常なレスポンスを返すことをテストする。

    • 02pod.t

すべてのPODが正常であることをテストする。TEST_PODがtrueの場合のみ実行される。

    • 03podcoverage.t

すべてのメソッド/関数にPODがあることをテストする。TEST_PODがtrueの場合のみ実行される。

  • Creating tests
    mundus:~/MyApp chansen$ cat t/01app.t | perl -ne 'printf( "%2d  %s", $., $_ )'
    1  use Test::More tests => 2;
    2  use_ok( Catalyst::Test, 'MyApp' );
    3
    4  ok( request('/')->is_success );

1行目は何個のテストを実行するか指定する。ここでは2つ。2行目はアプリケーションをテストモードでテストしてロードする。4行目はアプリケーションが正常に応答するか確認する。
Catalyst::Testは二つの関数、requestとgetをエクスポートする。それぞれ3種類の異なる引数を取る。

    • 相対URLまたは絶対URL
    request('/my/path');
    request('http://www.host.com/my/path');
    request( URI->new('http://www.host.com/my/path') );
    request( HTTP::Request->new( GET => 'http://www.host.com/my/path') );

requestはHTTP::Responseのインスタンスを返し、getはレスポンスのコンテンツ(body)を返す。

  • Running tests locally
    mundus:~/MyApp chansen$ CATALYST_DEBUG=0 TEST_POD=1 prove --lib lib/ t/
    t/01app............ok                                                        
    t/02pod............ok                                                        
    t/03podcoverage....ok                                                        
    All tests successful.
    Files=3, Tests=4,  2 wallclock secs ( 1.60 cusr +  0.36 csys =  1.96 CPU)

CATALYST_DEBUG=0でデバッグを無効にする。有効になってるとテストの間にデバッグログが表示されてしまう。
TEST_POD=1はPODチェックとカバレッジを有効にする。
proveはテストを簡単に実行するためのツール。

  • Running tests remotely
    mundus:~/MyApp chansen$ CATALYST_SERVER=http://localhost:3000/ prove --lib lib/ t/01app.t
    t/01app....ok                                                                
    All tests successful.
    Files=1, Tests=2,  0 wallclock secs ( 0.40 cusr +  0.01 csys =  0.41 CPU)

CATALYST_SERVER=http://localhost:3000/はアプリケーションのデプロイ先の絶対URLを指定する。CGIFastCGIではホストとスクリプトへのパスを指定することになるかもしれない。

Test::WWW::Mechanize::Catalystをちゃんと調べておこう。これはHTML、フォーム、リンクを簡単にテストできるようにする。簡単な例。

    use Test::More tests => 6;
    use_ok( Test::WWW::Mechanize::Catalyst, 'MyApp' );

    my $mech = Test::WWW::Mechanize::Catalyst->new;
    $mech->get_ok("http://localhost/", 'Got index page');
    $mech->title_like( qr/^MyApp on Catalyst/, 'Got right index title' );
    ok( $mech->find_link( text_regex => qr/^Wiki/i ), 'Found link to Wiki' );
    ok( $mech->find_link( text_regex => qr/^Mailing-List/i ), 'Found link to Mailing-List' );
    ok( $mech->find_link( text_regex => qr/^IRC channel/i ), 'Found link to IRC channel' );
  • Further Reading

Catalyst::Test
Test::WWW::Mechanize::Catalyst
Test::WWW::Mechanize
WWW::Mechanize
LWP::UserAgent
HTML::Form
HTML::Message
HTML::Request
HTTP::Request::Common
HTTP::Response
HTTP::Status
URI
Test::More
Test::Pod
Test::Pod::Coverage
prove(Test::Harness)

  • More Information

Catalyst::Plugin::Authorization::Roles - Role based authorization for Catalyst based on Catalyst::Plugin::Authentication - metacpan.org
Catalyst::Plugin::Authorization::ACL - ACL support for Catalyst applications. - metacpan.org