目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

テスト駆動開発入門をPerlで写経してみた。1

xUnitチックにテストが書けるTest::Classなるものがあることを技評の記事*1で知ったので、試してみました。
どうせ試してみるなら、『テスト駆動開発入門』の写経がいいかなと思いやってみました。RubyPythonはやったけどPerlは写経していなかったし、それにPerlのクラスは慣れていないのでちょうどいい機会です。

下準備

gcc

とりあえず、gccとdmakeをcpan経由でインストールしておきます。確かこのコマンドだけでインストールできたはず…。

> cpan gcc
Module::Starter

Makefileをいちいち書くのは面倒なのでModule::Starterを入れておきます。

> cpan Module::Starter
> cpan Module::Starter::PBP

初期設定としてひな形を作っておきます。

> perl -MModule::Starter::PBP=setup

%HOME%\.module-starter\configを適当に直します。

author:  masasuzu
email:   ***************@gmail.com

デフォルトのままだと実行時にエラーが出るでモジュールの$VERSIONをパッケージ変数に修正します。
修正するファイルは %HOME%\.module-starter\PBP\Module.pm

修正前

use version; $VERSION = qv('0.0.3');

修正後

use version;
our $VERSION = qv('0.0.3');
Test::Pod::Coverage

必須ではありませんが、module-staterでPODカバレッジテストを作ってくれるので、インストールしておきます。

> ppm install Test::Pod::Coverage
Test::Class

Test::ClassはWindows環境のせいかよく分からないのですが、テストが失敗してインストールできなかったので、cpan経由ではなくppmからインストールしました。

> ppm install Test::Class

スケルトン作成

コマンド一個でスケルトンを作成してくれます。便利ですね。

> module-starter --module=Money

lib/Money.pm

Mooseで書くかどうか迷ったんですけど、基本に返ろうと言うことで標準的な?クラスで書きました。
内容に関しては特筆すべきことはなさそうです。

package Money;
use strict;
use warnings;

use version;
our $VERSION = qv('0.0.3');

1;

package Dollar;
use strict;
use warnings;

sub new {
    my ($class, $opts) =(@_);
    return bless $opts, $class;
}

sub times {
    my ($self, $multiplier) = (@_);
    $self->{amount} *= $multiplier;
}

1;

t/01money.t

Perlの標準的なテストスクリプトの命名規則がよく分からなかったので、スクリプト名は適当です。
これも特筆すべきところはありません。強いて言うならば、コンストラクタの引数をハッシュリファレンスを渡すように変更しているくらいです。

use strict;
use warnings;

use Test::Class;

Test::Class->runtests;

package TestMoney;
use strict;
use warnings;

use base 'Test::Class';

use Money;
use Test::More;

sub test_multiplication : Test {
    my $five = new Dollar({amount => 5});
    $five->times(2);
    is(10, $five->{amount});
}

1;

テスト実行

テストスクリプトをそのまま実行してもいいのですが、どうせCPAN形式で書かれているのでmake testで実行します。

> perl Makefile.PL
> dmake
> dmake test
結果
E:\home\Develop\TDD\perl\Money>dmake test
D:\Perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib\lib', 'blib\arch')" t/*.t
t/00.load.t ....... 1/1 # Testing Money 0.0.3
t/00.load.t ....... ok
t/01money.t ....... ok
t/perlcritic.t .... ok
t/pod-coverage.t .. ok
t/pod.t ........... ok
All tests successful.
Files=5, Tests=5,  4 wallclock secs ( 0.08 usr +  0.08 sys =  0.16 CPU)
Result: PASS

テスト駆動開発入門

テスト駆動開発入門

  • 作者: ケントベック,Kent Beck,長瀬嘉秀,テクノロジックアート
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2003/09
  • メディア: 単行本
  • 購入: 43人 クリック: 1,002回
  • この商品を含むブログ (153件) を見る

*1:http://gihyo.jp/dev/serial/01/modern-perl/0030