ziguzagu.org

テストをTODO扱いにする

Test::MoreでテストをTODO扱いにすることが出来ます。どういうことかというと、

  • test自体は普通に行う。
  • 失敗してもそれはTODO扱いとして、トータルの結果では成功したことにする。

という感じ。

いくつかの機能が未実装の(というかほとんどなにもしてない)シャーペンモジュール(正しくはmechanical pencil、でも長いから嫌)があるとします。

package Pencil;

use strict;
use warnings;

sub new {
    my $class = shift;
    return bless {}, $class;
}

sub leads {
    # TODO
}

sub supply_leads {
    # TODO
}

1;

で、こいつをテストするわけですが、実装していない部分のテストも書く、でも失敗数にカウントされるのは嫌です。なので、未実装部分のテストをTODOにします。

#!/usr/bin/perl
use strict;
use warnings;

use Test::More tests => 3;
use Pencil;

my $pencil = Pencil->new();
isa_ok($pencil, 'Pencil');

TODO: {
    local $TODO = 'continuum not yet harnessed';
    ok(my $remain  = $pencil->leads());
    ok(my $success = $pencil->supply_leads());
}

TODOブロックで囲み、ブロック内で$TODOにまだTODOだよ的メッセージを代入。すると…、

[omae@colinux]% prove -v pencil.t                              [~/perl/test/02]
pencil....1..3
ok 1 - The object isa Pencil
not ok 2 # TODO continuum not yet harnessed
###   Failed (TODO) test in pencil.t at line 13.
not ok 3 # TODO continuum not yet harnessed
###   Failed (TODO) test in pencil.t at line 14.
ok
All tests successful.
Files=1, Tests=3,  0 wallclock secs ( 0.06 cusr +  0.03 csys =  0.09 CPU)

not ok だけど、TODOなので失敗して当たりまえ扱いとなり、“All tests successful.“となります。間違えて、というかもう実装済み、でもテストスクリプトは変更せずに実行して成功しちゃった場合は、

[omae@colinux]% prove -v pencil.t                              [~/perl/test/02]
pencil....1..3
ok 1 - The object isa Pencil
ok 2 # TODO continuum not yet harnessed
ok 3 # TODO continuum not yet harnessed
ok
        2/3 unexpectedly succeeded
All tests successful (2 subtests UNEXPECTEDLY SUCCEEDED).
Files=1, Tests=3,  0 wallclock secs ( 0.05 cusr +  0.03 csys =  0.08 CPU)

2/3のテストが予想外に成功しちゃった、と表示されます。

便利そうで走ですが、いちいち自分でTODOブロックを移動したり、消したり、追加したりが以外に面倒くさそうな気配もします…。

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