最近使ったPerlのテスト系モジュール

最近Perlを書いていて,便利なテスト系モジュールをいくつか使ったのでメモ.

Test::Moreのsubtestメソッド

RSpecのitメソッドみたいな感じ.
テストをブロックに分けてそれぞれのブロックに名前を付けることができるイメージ.

use Test::More;

subtest "description" => sub {
    # テスト書く
}; 

Test::Mock::LWP::Conditional

LWP::UserAgentのリクエストスタブ.
LWP::UserAgentで任意のURLに対応するレスポンスを指定できる.

    my $res = HTTP::Response->new(200);
    $res->content("インターネット");
    Test::Mock::LWP::Conditional->stub_request("www.internet.com" => $res);
    
    # 以降,LWP::UserAgentで"www.internet.com"をGETしたらステータスコード200でcontentが"インターネット"で返ってくる

Test::MockObject::Extends

既存のクラスに含まれるメソッドをMockに置き換える.(Test::Mockは既存のクラスをMockに置き換える)

    # インスタンスメソッドをMockに置き換え
    my $internet = Net::Internet->new;
    my $mock = Test::MockObject::Extends->new($internet);
    $mock->set_always("service", +{ hatena => "www.hatena.ne.jp" });

    is $mock->service->{hatena}, "www.hatena.ne.jp";

    # newの引数にクラス名を指定することで,クラスメソッドを置き換えることもできる
    my $mock = Test::MockObject::Extends->new("Net::Internet");
    $mock->set_always("static_service", +{ twitter => "twitter.com" });

    is $mock->static_service->{hatena}, "twitter.com";

Test::Exception

croakやdieで投げた例外をテストできるモジュール.

    # doメソッドがcroak "No Such Internetを含むエラーメッセージ"を投げるかどうかテスト
    throws_ok {
        my $internet = Net::Internet->do("Facebook");
    } qr(No Such Internet);

Test::Mock::Guard

Mockオブジェクトを作成するモジュール.
Test::MockObjectよりもシンプル.

    # Net::InternetクラスをMock化する
    my $mock = mock_guard 'Net::Internet',
        +{
            do => sub { 
                my $self = shift;
                return +{ SAO => 'SwordArtOnline' };
             },
        };

    my $internet = Net::Internet->new;
    is $internet->do->{SAO}, 'SwordArtOnline';

Kyoto.pm Tech Talk #02に参加してきた

id:shibayu36 さん主催のKyoto.pm Tech Talk #02に参加してきた.
インターン終了から1年ぶりにはてなを訪れたことになる.
久々にはてなの社員の方々や今年度のインターン参加者の方々とお話ができてテンション上がった.
(実はインターン以来Perl触ってない)

id:motemenさんが紹介されていたDBIx::Liteはメソッドチェーンできて便利そう.
あとは,Text::Hatenaってずっと放置されてると思ってたけど,実ははてな記法パーサは何種類かあって最新のものをid:onishiさんが紹介してた.

自分も何か発表したいと思ったけど,Perlは全然書いてなかったので,代わりに先月作ったDailyCodingについてLTした.
スライドはこっちKyoto.pm #02 DailyCoding - プログラマのための暇つぶしサービス
Web系の人たちよりも競技系の人たちのほうがウケは良い気がする.

懇親会では,インターン生が持ってるAndroid端末をおもちゃ呼ばわりする簡単なお仕事をしたり,ルビーに土下座するルビーストが居たり,変わり果てた某社員様が居たり,id:pokutunaさんと一緒に現インターン生に先輩風吹かせたり,なかなかインターネットっぽくて楽しかった.
f:id:y_uuki:20120823035250p:plain
f:id:y_uuki:20120823035303p:plain
※ルビーストです
f:id:y_uuki:20120823035255p:plain
※社員様です