はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

PerlでxUnitライクにテストを書く

f:id:secret_hamuhamu:20150426020452p:plain
Perlで、xUnitライクにテストを書いてみたいと思う。
PHPUnitJUnitのようにね。
Test::Classというモジュールを使う。

環境構成


テスト対象

get_nameを持つだけの何の変哲もないクラス Human.pm

package Human;

use strict;
use warnings;

sub new {
    my $class = shift;
    my $name  = shift;

    my $self = {
        name => $name,
    };

    return bless $self, $class;
}

sub get_name {
    my $self = shift;

    $self->{name};
}

1;

テストクラス

テストクラスのHumanTest.pm
Test::Classモジュールを継承して使うので、Test::Classは、ダウンロードしておくこと。

use strict;
use warnings;

HumanTest->runtests;

package HumanTest;
use base qw( Test::Class );
use Test::More;
use Human;

sub startup : Test(startup) {
    diag 'running startup';
}

sub shutdown : Test(shutdown) {
    diag 'running shutdown';
}

sub setup : Test(setup) {
    my $self = shift;

    $self->{num} = 0;
    diag 'running setup';
}

sub teardown  : Test(teardown) {
    diag 'running teardown';
}


sub get_name :Tests {
    subtest '日本語' => sub {
        my $human = Human->new('たけし');

        is $human->get_name, 'たけし';
    };

    subtest '英語' => sub {
        my $human = Human->new('Mike');

        is $human->get_name, 'Mike';
    };
}

sub get_name2 :Tests {
    my $self = shift;

    subtest '数値' => sub {
        my $human = Human->new($self->{num});

        is $human->get_name, 0;
    };
}

1;

解説

HumanTest->runtests; で、テストを実行している。
Humantest.pmでテストを実行しなくても他のPerlから呼び出してテストを実行することも出来る。

Test(setup) とか Test(startup) とかはテストを実行すると挙動がわかるので割愛。
DB接続やファイル読み込みなどの初期化に用いる事が多い。

sub get_name :Testsget_name がテストメソッド名で、 :Tests が属性である。
属性を指定することで、このメソッドはテスト用のメソッドであるということを定義している。

テスト実行

$ prove -v HumanTest.pm

HumanTest.pm .. # running startup
#
# HumanTest->get_name
# running setup

    # Subtest: 日本語
    ok 1 - get name
    1..1
ok 1 - 日本語
    # Subtest: 英語
    ok 1 - get name
    1..1
ok 2 - 英語
# running teardown
#
# HumanTest->get_name2
# running setup
    # Subtest: 数値
    ok 1 - get name2
    1..1
ok 3 - 数値
# running teardown
# running shutdown
1..3
ok
All tests successful.
Files=1, Tests

いい感じにテストが動いている。
テスト実行結果から Test(setup) は、running setupを確認することでで、どのタイミンで実行されているかわかる。
その他のTest(~)系も同じく確認できる。

DBを扱うテストなどは、 setup を上手く使ってデータを初期化するなどできる。

最近読んだ本

Effective Perl 第2版

Effective Perl 第2版

Perlについて語ろう

Perlについて語ろう

Perl徹底攻略 (WEB+DB PRESS plus)

Perl徹底攻略 (WEB+DB PRESS plus)

モダンPerl入門 (CodeZine BOOKS)

モダンPerl入門 (CodeZine BOOKS)

Perlベストプラクティス

Perlベストプラクティス