アルパカとテストとAcmeモジュー
2011-12-25
パカテスとお略しください。色々タイトルが残念なmakamakaです。最後はテストの話です。
実はAcme truckの(心の)隣人であるTest trackにエクスパイア、じゃなくてインスパイアされての内容です。
本日のtest trackで登場したTest::Successfulは、Test::Builderのokメソッドを上書きして常にテストが通るようにするモジュールです。……それAcmeモジュールじゃん! Acme trackへの挑戦ですよ!?
てなわけで、迎え撃つはCPANモジュールAcme::Testです。指定したモジュールに対して必ずPASSするテストを自動的につくってくれます。
# MyLovelyModule.pm package MyLovelyModule; use strict; our $VERSION = '1.00'; sub new { bless {}, shift; } sub hello { print "Hello.\n" } 1;
というモジュールがあるとして、あとはそれに対するテストファイルをつくります。
# acme.t use Acme::Test qw(MyLovelyModule);
実行すると。
$ perl acme.t # Testing MyLovelyModule # [Public] Testing global scalar $MyLovelyModule::VERSION ok 1 - $VERSION available ok 2 - $VERSION initialized properly ok 3 - $VERSION content OK # [Public] Testing subroutine MyLovelyModule::hello() ok 4 - hello() passed expected parameters ok 5 - hello() catches faulty input ok 6 - hello() works as expected with no input ok 7 - hello() return value OK # [Public] Testing subroutine MyLovelyModule::new() ok 8 - new() passed expected parameters ok 9 - new() catches faulty input ok 10 - new() works as expected with no input ok 11 - new() return value OK 1..11
どーです? 個人的にはTest::Successfulの方がいいなあ。
あとねぇ、Acme系テストで好きだったのはAcme::Test::Weatherですね。マシンのIPアドレスから都市を判定して、天気をテストするという、素晴らしいモジュールです。残念ながら現在CPANにないモジュールに依存しているためインストールしにくいので、代わりにWWWW::HostipInfoを使ったパッチを後ろの方に掲載しておきます。
use Test::More; use Acme::Test::Weather; is_sunny(); done_testing; => not ok 1 - it's partly cloudy in Tokyo, Japan
この原稿を書いている今は曇りなので、is_sunnyは通りませんでした。気をとりなおしてちょっと書き換えます。
use Test::More; use Acme::Test::Weather; is_cloudy(); isnt_sunny(); isnt_raining(); isnt_snowing(); done_testing; => ok 1 - it's partly cloudy in Tokyo, Japan => ok 2 - it's partly cloudy in Tokyo, Japan => ok 3 - it's partly cloudy in Tokyo, Japan => ok 4 - it's partly cloudy in Tokyo, Japan 1..4
通りますね! 他にも温度をチェックする eq_celsius() などなかなか楽しいですね!
パッチはこちら。
--- lib/Acme/Test/Weather.pm.bak 2003-02-22 04:25:34.000000000 +0900 +++ lib/Acme/Test/Weather.pm 2011-12-28 15:41:33.000000000 +0900 @@ -64,7 +64,7 @@ use Sys::Hostname; use Socket; -use CAIDA::NetGeoClient; +use WWW::HostipInfo; use Geography::Countries; use Weather::Underground; @@ -73,10 +73,10 @@ my $test = Test::Builder->new(); -my $geo = CAIDA::NetGeoClient->new(); -my $record = $geo->getRecord($ip); +my $geo = WWW::HostipInfo->new(); +my $record = $geo->get_info($ip); -my $city = ucfirst(lc($record->{CITY})); +my $city = ucfirst(lc($record->city)); # If city is in the States use the state as # the region. Otherwise use Geography::Countries @@ -86,8 +86,8 @@ # Because things like 'Cambridge, US' cause # wunderground.com to spazz out :-( -my $region = ($record->{COUNTRY} eq "US") ? - ucfirst(lc($record->{STATE})) : country($record->{COUNTRY}); +my $region = ($record->country eq "US") ? + ucfirst(lc($record->region)) : country($record->country); my $place = "$city, $region";
というわけで、25日間にわたるAcme cognacも無事完走です! じゃあ、またね!