しばらく読んでいなかった『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章に。