データファイルを利用するテスト
ファイル探索型のテストはテスト対象のモジュールが増えてもコードを書き換える必要がない点ではすぐれていますが,
このように既存のデータファイルを利用して件数を調べるモジュールとしては拙作のTest::UseAllModulesなどがありますが,
use strict;
use warnings;
use Test::More;
use LWP::UserAgent;
use HTTP::Status 'status_message';
use YAML::Tiny;
my $conf = shift or die "USAGE: prove $0 :: <config>.yaml > /dev/null";
my @urls = @{ YAML::Tiny::LoadFile($conf) };
plan tests => scalar @urls;
my $ua = LWP::UserAgent->new(timeout => 3);
for my $url (@urls) {
my $res = $ua->head($url);
ok $res->is_success or diag "$url: ".status_message($res->code);
}
- ※2
ここでは正常系の出力を/dev/
nullに捨てることを前提にしていますが, 奥一穂氏作のcronlogのようなツールを使えばproveの正否に応じてもう少し柔軟な運用を行うこともできるでしょう。より本格的な監視を行いたい場合はNagios等の専用ツールを使ってください。
Test::Base
インギー・
当初はTest::Chunksという名前で公開されていたこのモジュールは,
たとえば,
#!perl
use strict;
use warnings;
use Test::Base;
use LWP::Simple;
plan tests => scalar blocks;
sub url { get($_) }
sub regexp { qr/(?six:$_)/ }
run_like 'input' => 'expected';
__DATA__
=== search.cpan.org
--- input url
http://search.cpan.org/
--- expected regexp
<title>The[ ]CPAN[ ]Search[ ]Site.*</title>
=== gihyo.jp
--- input url
http://gihyo.jp/dev/serial/01/modern-perl/
--- expected regexp
<title>.+gihyo\.jp.+</title>
Test::Baseは裏でソースフィルタが走っていることを含めてさまざまな仕掛けが施されているので通常の書き方とはやや異なる部分もありますが,
テストブロックの数はblocksというコマンドの返り値を調べればわかるので
また,
use strict;
use warnings;
package MyTest;
use Test::Base -Base;
package MyTest::Filter;
use Test::Base::Filter -base;
use LWP::Simple;
sub url { get($_[0]) }
sub regexp { qr/(?six:$_[0])/ }
1;
テストスクリプトからこのように呼び出すと,
#!perl
use strict;
use warnings;
use MyTest;
__DATA__
=== search.cpan.org
--- input url
http://search.cpan.org/
--- expected regexp
<title>The[ ]CPAN[ ]Search[ ]Site.*</title>
=== gihyo.jp
--- input url
http://gihyo.jp/dev/serial/01/modern-perl/
--- expected regexp
<title>.+gihyo\.jp.+</title>
より高度な使い方を知りたい方は一世を風靡したPlaggerのテストコードがTest::Baseを多用しているので参考にしてみるとよいでしょう。PlaggerのテストではinputブロックにYAMLの設定を渡して,
さらにテストの再利用性を高めるために
Test::Baseのようなデータ本位のテストは簡単で便利ですし,
次回はそのような場合にも対応できるフレームワークを見ていきます。