音楽とお酒とものづくりと

Web初心者の新人エンジニア(園児neer)奮闘記

TDD入門(テストを書いてみよう!&Test::SimpleとTest::Moreって?)

はじめに

これまでテストなんて1ミリも気にせず,やっつけでコーディングしていました.
が,しかし,テストを書くと幸せになれると聞いたので頑張って身につけようと一念発起.
めちゃくちゃ奥が深そうなので,段階的に,細かくアウトプットしていくつもりです.

TDDとは

Test Driven Development(テスト駆動開発)の略称.
プロダクトを作成する時,いきなりメインコードを書き始めるのではなく,プロダクトに必要と思われる機能のテストコードから書き始める開発手法.

テストから書くことによって様々な恩恵を得られるそう.たとえば,
・プロダクトの各機能は常に思った通りに動く
・冗長なコードが生じにくく,内部品質の向上につながる
などなど.

他にもたくさんあるそうですが,現段階で私自身が実感しているメリットはまだこれこれくらい.

テストを書いてみる

my $day=15;
print $day == 15 ? “ok!” : “no today is the 15th”;

実行します

perl -Ilib hoge.t

$dayの値が15であればokを,それ以外はnoを返します.

今回では内容が一致しているのでokが返ってきました.
試しに$dayの値を15以外でやってみると正しくnoが返ってくることがわかります.

Test::Simple

先ほどのコードを見て,まあテスト1個ならまだしも,いっぱいある時に全部printしていくのめんどくさ・・・てなりますよね.

そこでTest::Simpleを利用します

use Test::Simple;
my $day=15;
ok($day == 15);

先ほどprintでやっていたのがすべてok()に置き換わりました.
これで実行してみるとok 1 かnot ok 1が返ってきます.

またまた思うところとしては,これ,テスト数が少ない時だとまだマシですが,多くなったらどのテストが失敗したのかわかりにくいですよね.

そこで,ok()の第2引数にコメントを取ることができます.

use Test::Simple;
my $year=2016;
my $month=3;
my $day=14;

ok($year == 2016,"check year");
ok($month == 3,"check month");
ok($day == 15,"check day");

例えばこれで実行してみると,以下のようになります.

ok 1 - check year
ok 2 - check month
not ok 3 - check day
#   Failed test 'check day'
#   at test.t line 10.

なるほど,これでどのテストでエラーが起こったのかがわかりやすくなります.

さて,エラー箇所は特定できるようになりましたが,どういう結果になってテストが失敗したのかがわかりません.
今はハードコードで書いているため一目瞭然ですが,いろんなデータを処理しているとバグなどが原因で思った値が入っていないなんてことが起こりえます.

Test::More

そんな時はTest::Moreを使います.
名前の通り,Test::Simpleよりも機能がより多く使えるようになるそう.

use Test::More;
my $year=2016;
my $month=3;
my $day=14;


is($year,2016,"check year");
is($month,3,"check month");
is($day,15,"check day");

ok()関数ではなくis()関数を用いてそれぞれ第1引数にはチェックしたい値,第2引数に期待する値,第3引数にコメントを取ることができます.

これで実行すると

ok 1 - check year
ok 2 - check month
not ok 3 - check day
#   Failed test 'check day day'
#   at test.t line 10.
#          got: '14'
#     expected: '15'

3つめの日付のテストで失敗しており,さらに期待する値が15であったのに対し実際には14であった,ということが確認できるようになりました.

参考

以下の公式?サイトを参考にしました.和文に関して,エキサイト翻訳などにそのまま突っ込んだようなものしか見つからなかったので,内容は原文の翻訳をちょびっと意識しています.
Test::Tutorial - search.cpan.org