あいつの日誌β

働きながら旅しています。

preview テスト駆動開発のススメ

preview テスト駆動開発のススメ

hachiojipm#14に行ってきました。そこでテスト駆動開発のハンズオンをしたいという話をしてきました。
というわけで実際にどんな事をやろうとしているのか、というのをお知らせです。

まあ単純なWebアプリを作りながらテストを書いていくハンズオンみたいな事をすると思います。

雛形作成

% module-setup MyApp
% cd MyApp

MyApp/lib 以下を Perl Module である事を認識できるようにしておきます。

% PERL5LIB=$HOME/project/MyApp/lib:$PERL5LIB

Data::Model

ディレクトリ作成

% mkdir -p lib/Collection 

製品モデルを用意します。

% vi lib/MyApp/Product.pm
package MyApp::Product;
use strict;
use warnings;

my @products = ( 
    {   
        id => 1,
        name => 'Mac Book Pro',
        description => 'Apple 13 inch Mac Book Pro Notebook',
        price => 1000,
    },  
    {   
        id => 2,
        name => 'iPad',
        description => 'Apple 64GB 3G iPad',
        price => 899,
    }   
);

1;

テストを作成します。

% vi t/product.t
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use MyApp::Product;

subtest 'get all products' => sub {
    my @products = MyApp::Product->all();
    ok(scalar @products == 2); 
};

subtest 'find product' => sub {
    my $product = MyApp::Product->find(2);
    ok($product->{name} eq 'iPad');
};

done_testing();

テスト実行

もちろん失敗

% prove
t/00_compile.t .. ok   
t/product.t ..... 1/? Can't locate object method "all" via package "MyApp::Product" at t/product.t l
ine 8.
...

実装

メソッドを追加

package MyApp::Product;
use strict;
use warnings;

my @products = ( 
    {   
        id => 1,
        name => 'Mac Book Pro',
        description => 'Apple 13 inch Mac Book Pro Notebook',
        price => 1000,
    },  
    {   
        id => 2,
        name => 'iPad',
        description => 'Apple 64GB 3G iPad',
        price => 899,
    }   
);

sub all { return @products; }

sub find {
    my ($class, $id) = @_; 

    for my $product ( $class->all ) { 
        if ( $product->{id} == $id ) { 
            return $product;
        }   
    }   
    return;
}

1;

テスト実行。成功

:! prove -vl t/product.t                                                          
t/product.t .. 
    ok 1
    1..1
ok 1 - get all products
    ok 1
    1..1
ok 2 - find product
1..2
ok
All tests successful.
Files=1, Tests=2,  1 wallclock secs ( 0.06 usr  0.02 sys +  0.04 cusr  0.01 csys =  0.13 CPU)
Result: PASS

まとめ

実際に私がテストを書くのでそのテストに成功するように実装してもらってテスト駆動開発を体験してもらおうかなあと思っています。

という事で興味がある人は遊びにきてね。

テスト駆動開発のススメ

3/17でなくても近くに寄ったら是非お立寄りください。