2006年11月9日木曜日

[Perl] Test::More でテスト

CPAN の Test::More は、テストスクリプトの作成や実行を支援するモジュールで Test-Simple に同胞されています。
簡単なモジュールを用意して実施してみます。

シナリオ
id, name の属性を持つクラス
テストは、
モジュールのロード
オブジェクト生成
id, name にデータセット
id, name のデータ取得してチェック

・モジュール作成
[Perl] モジュールの自動作成 で書いたとおり Module::Starter を利用すると lib/ 配下に
モジュール、t/ 配下にテストプランの雛形が用意されているので、これをカスタマイズ。
$ module-starter --module=User
$ cd User/lib
$ vi User.pm
package User;

use strict;
use warnings;
use base qw/Class::Accessor::Fast/;

__PACKAGE__->mk_accessors(qw/id name/);

1;
__END__

・テストプラン作成
$ cd User/t
$ vi 00.load.t
use Test::More tests => 1; # テストプランは1つ

BEGIN {
use_ok( 'User' ); # モジュール User がのロードできるかチェック
}

diag( "Testing User $User::VERSION, Perl $], $^X" );

$ vi 01.methods.t
use Test::More qw(no_plan); #テストプランが決まってない
use User;

can_ok(User, qw(id name)); # メソッドを実行できるかチェック

my $user = User->new();
ok $user; # $user が定義されているかチェック
$user->id(9999);
is $user->id, "9999"; # $user->id が 9999 であるかチェック
$user->name(isoya9);
is $user->name, "isoya9"; # $user->name が isoya9 であるかチェック


・テスト
個別にテストを実行する場合
$ perl 00.load.t
1..1
ok 1 - use User;
# Testing User , Perl 5.008005, /usr/bin/perl

$ perl 01.methods.t
ok 1 - User->can(...)
ok 2
ok 3
ok 4
1..4

prove コマンドでまとめてテストを実行する場合
$ prove -r
./01-methods....ok
./00-load.......# Testing User , Perl 5.008005, /usr/bin/perl
./00-load.......ok
All tests successful.
Files=2, Tests=5, 0 wallclock secs ( 0.05 cusr + 0.04 csys = 0.09 CPU)

make して make test する場合
$ perl Makefile.PL
$ make
$ make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')"
t/*.t
t/00.load.......ok 1/1Use of uninitialized value in concatenation (.) or string at t/00.load.t line 7.
# Testing User , Perl 5.008005, /usr/bin/perl
t/00.load.......ok
t/01.methods....ok
All tests successful.
Files=2, Tests=5, 0 wallclock secs ( 0.08 cusr + 0.05 csys = 0.13 CPU)


モジュールが出来上がってからテストプランを書くのは面倒なので、
モジュール作りながらデバッグついでに書いたほうが効率的かもしれません。

0 件のコメント: