PerlのTest::More入門の入門

■ 目次

  1. 概要
  2. PerlのTest::Moreについて
  3. 使い方
  4. もう少し使ってみる①
  5. もう少し使ってみる②
  6. 参考

■ 概要

PerlのTest::Moreについて簡単にまとめます
入門の入門なので短く簡潔に
perl3

■ PerlのTest::Moreについて

Perlでテストするためのデファクトスタンダードとも言えるモジュールです

ちなみに

  • Test::Simple(Test::Moreよりも機能を絞った簡素なモジュール)
  • Test::Most(Test::Moreでは機能が物足りないと思った人向けのモジュール)

もありますがこだわりがないのならばとりあえずTest::Moreで良いかと思います

■ 使い方

Test::Moreを使ったテスト例
一般的にテストファイルはtディレクトリに入れてファイル名は*.tらしい

$ cat t/MoreTest1.t
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;

my $flag = 1;
ok($flag); # 真ならok

# テストはここまでというおまじない
done_testing;
# done_testingにたどり着く前にテストが終わってしまった場合は
# 「宣言部がない」というエラーを出すことも可能

テストを行う

$ perl t/MoreTest1.t
ok 1
1..1

proveを使ってテストを行うのが主流みたい

$ prove -v t/MoreTest1.t
t/MoreTest1.t ..
ok 1
1..1
ok
All tests successful.
Files=1, Tests=1,  1 wallclock secs ( 0.02 usr  0.01 sys +  0.01 cusr  0.00 csys =  0.04 CPU)
Result: PASS

proveとは

  • テストをまとめて実行するためのツール
  • Test::Harnessをインストールすることでインストール
  • prove t/*.tと書くと複数のテストファイルをまとめて実行できる
  • TAP::Formatter::JUnit、TAP::Harness::JUnitやcloverを使うとJenkinsと連携してでコードカバレッジを表示できる

proveのオプションについて参考:prove についてのおさらい

■ もう少し使ってみる①

$ cat t/MoreTest2.t
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;

my @array = (1,3,5);

# TODOブロックの中でこけても許される
# こけてもexitコードが0になる
TODO: {
    # TODOを使っている理由を書く
    local $TODO = "URI::Geller not finished";

    fail('TODO fail test'); # ここを通るとNGになる
}

# このブロックはとばす
SKIP: {
    eval { require HTML::Lint };
    # スキップする理由を書く
    skip "HTML::Lint not installed", 2 if $@;
}

# テストのブロックを明示する、descriptionが必須なのでわかりやすい
subtest 'ok test' => sub {
    my $flag = 1;
    ok($flag); # 真ならok
};

done_testing; # テストここまで

実行
perl1

■ もう少し使ってみる②

テスト対象のモジュールを用意

$ cat Hoge.pm
#!/usr/bin/perl
package Hoge;
use strict;
use warnings;
use Test::More;

sub new {
    my ($class, %args) = @_;
    bless \%args, $class;
}
sub sum {
    my ($self, @array) = @_;
    my $total = 0;

    foreach my $num (@array) {
        $total += $num;
    }
    return $total;
}
1;

テストスクリプト

$ cat t/HogeTest.t
#!/usr/bin/perl
use strict;
use warnings;
use Test::More; # Tese::Moreを読み込む
use_ok('Hoge'); # モジュールが読み込めるか

subtest 'hoge sum test' => sub {
    my $obj = Hoge->new;
    isa_ok($obj, 'Hoge');

    my $got = $obj->sum(3, 2, 3);
    is($got, 8);
};

done_testing;

実行

$ prove -v t/HogeTest.t
t/HogeTest.t ..
ok 1 - use Hoge;
    # Subtest: hoge sum test
    ok 1 - An object of class 'Hoge' isa 'Hoge'
    ok 2
    1..2
ok 2 - hoge sum test
1..2
ok
All tests successful.
Files=1, Tests=2,  0 wallclock secs ( 0.02 usr  0.01 sys +  0.01 cusr  0.00 csys =  0.04 CPU)
Result: PASS

■ 参考


Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です