数日間が空いたけど、PerlTesting再開。
条件に合わせてテストをスキップしたい場合があったりします。たとえば、
- 依存モジュールがインストールされてなかったらスキップ
- とあるOSだったらスキップ
- ネットワークにつながってなかったらスキップ
などなど。そういう時はskip関数を使います。
テストするモジュール。
package Phrase;
use strict;
use warnings;
sub new {
my ($class, $text) = @_;
bless \$text, $class;
}
sub text {
my $self = shift;
return $$self;
}
sub as_dutch {
my $self = shift;
require WWW::Babelfish;
return WWW::Babelfish->new->translate(
source => 'English',
destination => 'Dutch',
text => $self->text(),
);
}
1;
WWW::Babelfishはモジュールのようで(いい加減…)、サンプルでは英語→オランダ語翻訳です。そしてテストスクリプト。
#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 3;
use Phrase;
my $phrase = Phrase->new('Good morning!');
isa_ok($phrase, 'Phrase');
is($phrase->text(), 'Good morning!',
"text() access workds");
SKIP: {
eval 'use WWW::Babelfish::uso';
skip('because WWW::Babelfish required for as_dutch()', 1) if $@;
is($phrase->as_dutch, 'Goede ochtend!',
"successfully translated to Dutch");
}
:skip():第1引数の処理を第2引数の回数失敗したらテストをスキップする。
WWW::Babelfishをインストールしてない環境でテストしてみると…、
[omae@colinux]% prove -v phrase.t [~/perl/test/02]
phrase....1..3
ok 1 - The object isa Phrase
ok 2 - text() access workds
ok 3 # skip because WWW::Babelfish required for as_dutch()
ok
1/3 skipped: because WWW::Babelfish required for as_dutch()
All tests successful, 1 subtest skipped.
Files=1, Tests=3, 0 wallclock secs ( 0.03 cusr + 0.09 csys = 0.12 CPU)
スキップしました。perldoc -m Test::Moreしたら、skip関数内では、
last SKIP;
としてあるので、必ずラベル名はSKIPにします。また、全部のテストをスキップするためにplan関数なるものもあったりします。
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
if ([localtime]->[6] != 2) {
plan(skip_all => 'only run these tests on Tuesday');
}
else {
plan(tests => 1);
}
require Tuesday;
my $day = Tuesday->new();
ok($day->coat(), 'we brought our coat');
火曜日だけテストとしてそれ以外の日はテストしません。ここまでのサンプルでは、use Test::Moreの直後にtestsとかno_planとか指定してきましたが、plan関数でそれを状況に応じて設定することが出来るわけですな。
なんかあんまり実用的じゃないサンプルのような気がする…。