ziguzagu.org

テストをスキップする

数日間が空いたけど、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関数でそれを状況に応じて設定することが出来るわけですな。

なんかあんまり実用的じゃないサンプルのような気がする…。

Perl Testing: A Developer's Notebook (Developers Notebook)