Perlでテストを書く

Perlでテストを書く

どうもー。
最近はひたすらRailsの開発ばっかりやってるので、
Perlの書き方を忘れないようにテストコードの書き方でも。。。
ちなみにRailsのアプリは今やっとログイン周りが仕上がった感じ。
Teams

本題に戻って、、今回は以前書いた素数を表示するプログラムの
テストコードを書きつつ、パッケージ化してみたいと思います。

今まで仕事でシステムのテストを自動化することは多くありました。
しかし、コードそのもののテストを自動化することってなかったんですよね。

背景としてはバッチ系の処理を書くことが多かったので、そんなに更新が入るコードって
なかったんです。
次の職場ではフロント系の開発もやることが増えてくると思うので、
この辺のテストコードのお作法は抑えておきたいですね。

ついでになぜテストを書くのかって話を立ち返ると、例えばずっと更新が入るコードが
あって、それになんかしらの修正を入れる度に、人が手でテストするのってアホらしい
じゃないですか。

なので機能毎に正常系、異常系の試験を書いておいて、
何か改修した時はそのテストコードを実行して、それがクリアできれば
その改修はこれまでの機能を有しているといえるわけですね。
#クソみたいなテスト書いてるとそう言えないけども

今回の実装としてはパッケージとしてUseできること、素数の計算ができることを
コア機能と捉えてテストコードを書いてみました。

元ネタのsosu.pl
[Perl]
#! /bin/perl -w
use warnings;
use strict;
use utf8;
binmode(STDOUT, “:utf8”);
#引数取得
my $hiki=$ARGV[0];
$hiki =~ /[^0-9]+|^$|^0/ and die “input data is please number!\n”;

#素数結果配列
my @s=(2,3);

#素数処理用一時変数
my $pnum=3;

#無限ループさせる
ROOT:while(1){
#処理する素数候補
$pnum+=2;

#これまでの素数で割り切れたら次のループへ
for(@s){
next ROOT if($pnum % $_ == 0);
}

#割り切れなければ
push @s,$pnum;

if(defined($s[$hiki-1])){
print $hiki . “個目の素数は” . $s[$hiki-1] . “\n”;
exit;
}
}
[/Perl]

早速ですが、今時点で確認できること、出来ないことにテストコードを書いてみましょう。

00_sosu.t
[Perl]
# 00_sosu.t
use strict;
use Test::More;
use lib ‘./’;
# plan ( tests => X )でテスト数を指定する必要がある
plan( tests=> 4);

#use出来るか
use_ok(“Sosu”);
use Sosu;

#素数計算できるか
my $s=Sosu->new;
can_ok($s,”calc”);

#想定する結果を返すか
is($s->calc(2),3,’2個目の素数が3か?’);
is($s->calc(5000),48611,’5000個目の素数が48611か?’);
[/Perl]

これを今時点で実行すると、、

[Shell]
Can’t locate Sosu.pm in @INC (@INC contains: ./ /Library/Perl/5.16/darwin-thread-multi-2level /Library/Perl/5.16 /Network/Library/Perl/5.16/darwin-thread-multi-2leel /Network/Library/Perl/5.16 /Library/Perl/Updates/5.16.2/darwin-thread-multi-2level /Library/Perl/Updates/5.16.2 /System/Library/Perl/5.16/darwin-thread-multi-2level /System/Library/Perl/5.16 /System/Library/Perl/Extras/5.16/darwin-thread-multi-2level /System/Library/Perl/Extras/5.16 .) at 00_sosu.t line 10.
BEGIN failed–compilation aborted at 00_sosu.t line 10.
[/Shell]
そもそも構文チェックの時点で怒られちゃいますね。
さて、これを通るようにしたコードがこちら。

Sosu.pm
[Perl]
#! /bin/perl -w
use warnings;
use strict;
use utf8;
binmode(STDOUT, “:utf8”);

package Sosu;
sub new {
my $self = shift;
bless {},$self;
}
sub calc {
#引数取得
my ($self,$hiki)=@_;
$hiki =~ /[^0-9]+|^$|^0/ and die “input data is please number!\n”;

#素数結果配列
my @s=(2,3);

#素数処理用一時変数
my $pnum=3;

#無限ループさせる
ROOT:while(1){
#処理する素数候補
$pnum+=2;

#これまでの素数で割り切れたら次のループへ
for(@s){
next ROOT if($pnum % $_ == 0);
}

#割り切れなければ
push @s,$pnum;

if(defined($s[$hiki-1])){
return $s[$hiki-1];
}
}
}
[/Perl]

テストを実行すると、こんな感じになりますね。

[Shell]
[TestCode]$prove 00_sosu.t
00_sosu.t .. ok
All tests successful.
Files=1, Tests=4, 1 wallclock secs ( 0.03 usr 0.00 sys + 1.19 cusr 0.00 csys = 1.22 CPU)
Result: PASS
[/Shell]

今回の実行はproveコマンドでやってみました。
こちらだとperlでの実行と比べてカラー表示なのでわかりやすいですよね。

あとは配置としてcpan形式で配置しているとmake testで自動でテストしてくれるので、
perlについてはcpan形式での開発が良いでしょう。

それではこんな感じで♥

facebook
Twitter
コメントは受け付けていません。
Social Share Buttons and Icons powered by Ultimatelysocial