tetsunosukeのnotebook

tetsunosukeのメモです

Test::Unit,Test::Classモジュールを用いたUnitTestの行い方

Test::Classを使ってみた。

必要なのは以下の構成でのライブラリ

lib/Test/Class/MethodInfo.pm
        /Class.pm
   /Devel/SymDump/Export.pm
         /SymDump.pm
         

おためしなので以下の二つのファイルを作ってみた。

TestedModule.pm
testRunner.pl

TestedModule.pm:

package TestedModule;

use strict;
use warnings;

use lib 'lib';
use base qw(Test::Class);
use Test::More;

# テスト開始時に必ず実行する
sub setup : Test(setup)
{
	diag("====start====");
}

# テスト終了時に必ず実行する
sub teardown : Test(teardown)
{
	diag("====end====");
}

## たとえばテスト対象の関数をココに書く
sub mysub{
	sleep(1);
	# 3で割ったあまりを返す関数とかにしてみよう
	return shift(@_) % 3;
}


## テストの個数が決まっていない場合
sub test_mysub : Test(no_plan)
{
	# テストセットをずらずら並べていく
	# is ( サブルーチン, 予期される結果,メッセージ)
	is(mysub(10), 1, 'mod=1');
	is(mysub(9), 0,'mod=0');
	is(mysub(3), 0,'mod=0');	
	is(mysub(1), 2, 'mod=2');
}

1;

testRunner.pl:

use lib 'lib';
use Test::Class;
# テスト対象となるパッケージ
use TestedModule;

# テスト実行
Test::Class->runtests;


実行結果はこんな感じに。

# ====start====
ok 1 - mod=1
ok 2 - mod=0
ok 3 - mod=0
not ok 4 - mod=2
#     Failed test (TestedModule.pm at line 37)
#          got: '1'
#     expected: '2'
# ====end====
1..4
# Looks like you failed 1 test of 4.

予期される結果以外が返ってくるとエラーとして表示しているのがわかる。

Test::Unitを使ってみる

必要なのは以下の構成でのライブラリ

lib/Class/Inner.pm
   /Devel/SymDump/Export.pm
         /SymDump.pm
   /Error.pm
   /Test/Harness/
        /Harness.pm
        /Unit/
        /Unit.pm
        
  階層が深い部分は多すぎるんでパス
         
use lib 'lib';
use Test::Unit::Procedural;

## テスト環境の構築および実行
create_suite();
run_suite();

#開始時に呼ばれる関数	
sub set_up{
	print "==== start ==== \n";
}

#終了時に呼ばれる関数
sub tear_down{
	print "==== end ====\n";
}



## テスト対象となる関数
sub test_mysub{
	assert(mysub(10) == 1, 'mod=1');
	assert(mysub(9) == 0,'mod=0');
	assert(mysub(3) == 0,'mod=0');
	#sleep(3);
	assert(mysub(1) == 2, 'mod=2');
}



## 関数の実体を書く
sub mysub{
	#sleep(1);
	my $i=0;
	# 無駄にループ
	while($i < 1000){
		$i++;
		open(IN,"+> dummy.txt") || die $!;
		close(IN);
		unlink("dummy.txt");
	}
	# 3で割ったあまりを返す関数とかにしてみよう
	return shift(@_) % 3;
}

結果:

.==== start ====
==== end ====
F
Time:  2 wallclock secs ( 0.13 usr +  1.45 sys =  1.58 CPU)

!!!FAILURES!!!
Test Results:
Run: 1, Failures: 1, Errors: 0

There was 1 failure:
1) lib/Class/Inner.pm:116 - test_mysub(Class::Inner::__A0)
mod=2

Test was not successful.

時間が出るのが面白いね。