アルパカとテストと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も無事完走です! じゃあ、またね!