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でなくても近くに寄ったら是非お立寄りください。