ziguzagu.org

warn/die/exceptionのテスト

しばらく読んでいなかった『PerlTesting』再開。

2章の最後に出てくるwan/die/exceptionのテスト。

Test::Warn

warnで出力されるメッセージをテスト。文字列系テストなのでTest::Moreのisとかlikeと同じようなものがTest::Warnにはあります。

#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 8;
use Test::Warn;

sub add_positives {
    my ($l, $r) = @_;
    warn "first argument ($l) was negative" if $l < 0;
    warn "second argument ($r) was negative" if $r < 0;
    return $l + $r;
}

warning_is { is(add_positives(8, -3), 5) }
    "second argument (-3) was negative";

warnings_are { is(add_positives(-8, -3), -11) }
    [
        'first argument (-8) was negative',
        'second argument (-3) was negative'
    ];

warnings_like { is(add_positives(8, -3), 5) } qr/negative/;

warnings_like { is(add_positives(-8, -3), -11) }
    [ qr/first.*negative/, qr/second.*negative/ ];

サンプルそのまま。なんかメッセージを完全コピペしなきゃis/areはまともに使えなさそうでイヤ。

Test::Exception

dieとかErrorモジュールを使った例外処理のテスト。

#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 5;
use Test::Exception;
use Error;

sub add_positives {
    my ($l, $r) = @_;

    die "first and second argumetns were negative" if $l < 0 and $r < 0;
    throw Error::Simple("first argument ($l) was negative") if $l < 0;
    throw Error::Simple("second argument ($r) was negative") if $r < 0;
    return $l + $r;
}

throws_ok { add_positives(-7,  6) } 'Error::Simple';
throws_ok { add_positives( 3, -9) } 'Error::Simple';
lives_ok { add_positives(4, 6) } 'no exception here!';
dies_ok { add_positives(-2, -3) } 'dies_ok';
lives_and {is add_positives(1, 8), 9 } '1+8 = 9';

:throws_ok:Exceptionが発生したらok。 :lives_ok:Exceptionが発生しない、もしくはdieしなかったらok。 :dies_ok:dieしたらok。 :lives_and:Exceptionが発生せずに、指定のテストが成功したらok。

dies_okとlives_ok、これがほしかった。

以上で2章終了。2章で出てきたモジュールで基本的なテストは大体かけてしまえそうだ。。。

引き続き『PerlHacks』に浮気しつつ、明日から第3章に。