=encoding euc-jp =head1 名前 Test::Simple - テストを書くための基本的なユーティリティ =head1 概要 use Test::Simple tests => 1; ok( $foo eq $bar, 'foo is bar' ); =head1 概要 ** テストに馴染がないなら、まず、B! ** これは、CPANモジュールや、他の目的のためにテストを書くのに、 極めて簡単な、極めて基本的なモジュールです。もし、より複雑なテストを望むなら、 (置き換え可能な実装である)Test::Moreモジュールを使って下さい。 Perlのテストの基本的なユニットは、okです。テストしたいものそれぞれについて、 プログラムは、「ok」か、「not ok」を出力し、合格したか、失敗したかを示します。 ok()関数で、これを行います(下を見てください)。 唯一の他の強制は、行おうと計画しているテストが、いくつであるかを先に宣言しなければならないことです。 この宣言は、何かがテストの間に恐ろしい問題になり、テストのプログラムが中断するか、 テストをスキップするか、何かそういったものが起こる場合のためにあります。このようにします: use Test::Simple tests => 23; 計画が必要です。 =over 4 =item B ok( $foo eq $bar, $name ); ok( $foo eq $bar ); ok() には式が与えられています(この場合、C<$foo eq $bar>)。 与えられた式が、真なら、テストは合格です。 与えられた式が、偽なら、合格ではありません。 だいたいそれくらいです。 ok() は、テストの番号と一緒に、「ok」か「not ok」のどちらかを出力します (後を追い続けます)。 # This produces "ok 1 - Hell not yet frozen over" (or not ok) ok( get_temperature($hell) > 0, 'Hell not yet frozen over' ); もし、$nameを引数に与えるなら、$nameは、「ok/not ok」と一緒に出力され、 テストが失敗した場合に、テストを見つけるのが簡単になります(だた名前だけで探せます)。 また、こうしておけば、他の人が、あなたのテストが何のためにあるのかを理解するのが簡単になります。 テストの名前を用いることは、強く推奨されます。 全てのテストは、スカラーコンテキストで動きます。つまり、これは: ok( @stuff, 'I have some stuff' ); あなたの意図するように動きます(stuffが空なら失敗します)。 will do what you mean (fail if stuff is empty) =back Test::Simple は、「1..M」と言う形式で、テストの動く番号をプリントすることで、 始まります(つまり、「1..5」は、5つのテストを動かすという意味です)。 この、変わったフォーマットは、何かが恐ろしく間違っているような場合に、 実行中の計画がいくつあるかを、Test::Harnessに知らせます。 もし、全てのテストが合格すれば、Test::Simpleは、0で、終えます(これは普通です)。 何かが間違っていれば、間違ったか数で終了します。 計画したのより、少ない(または、多くの)テストが実行された場合、見あたらないもの(か余分なもの)が あるため、計画は失敗したとみなされます。 もし、テストが実行されなければ、Test::Simpleは、警告を投げて、 255をで終えます。 全てのテストがちゃんと完全にされた後でも、テストが死ねば それが、まだ失敗であると考えられ、255で終えます。 つまり、終了コードは… So the exit codes are... 0 全てのテストが成功 255 テストが死んだ any other number いくつ失敗したか(足りないもの、余計なものを含む) 254以上のテストが失敗した場合は、254として、報告されます。 このモジュールは、決して、完全なテストシステムであろうとはしません。 このモジュールは、ただ、あなたにテストを始めさせる切っ掛けにすぎません。 一旦テストを始めたならば、Lを見ることをお奨めします。 =head1 例 架空のFilmモジュールのための簡単な、.t ファイルの例をあげます。 use Test::Simple tests => 5; use Film; # What you're testing. my $btaste = Film->new({ Title => 'Bad Taste', Director => 'Peter Jackson', Rating => 'R', NumExplodingSheep => 1 }); ok( defined($btaste) and ref $btaste eq 'Film', 'new() works' ); ok( $btaste->Title eq 'Bad Taste', 'Title() get' ); ok( $btaste->Director eq 'Peter Jackson', 'Director() get' ); ok( $btaste->Rating eq 'R', 'Rating() get' ); ok( $btaste->NumExplodingSheep == 1, 'NumExplodingSheep() get' ); これは、このように出力します: 1..5 ok 1 - new() works ok 2 - Title() get ok 3 - Director() get not ok 4 - Rating() get # Failed test (t/film.t at line 14) ok 5 - NumExplodingSheep() get # Looks like you failed 1 tests of 5 Film::Rating()メソッドが壊れている事を示しています。 =head1 警告 Test::Simpleは、その終了コードで、最大で254の失敗を報告するだけです。 このことが問題になるのなら、おそらく、莫大なテストscriptなのでしょう。 そのテストscriptを複数のファイルに分割して下さい。 (もしくは、終了状態として、符号なしの短い整数を使うUNIXの人々を非難して下さい) VMSの終了コードはそれ以外の世界とは、もっと、もっと違っており、 自分のやり方を得ているPerlは恐ろしくその終了コードを押しつぶすので、 VMSでは、次のように動きます。 0 SS$_NORMAL 全てのテストは成功 4 SS$_ABORT 何かが間違っています 残念なことに、これ以上切り分けできません。 =head1 注意 Test::Simpleは、perl 5.004まで、B<はっきりと>テストされます。 Test::Simple は、perl 5.8.0 以上で、スレッドセーフです。 =head1 経緯 このモジュールは、ある夜、Tony Bowden と一緒に、彼の家のキッチンで、 私の抱えていた新しいテストのモジュールに本当に複雑な特徴を書くという問題について話している途中に、思いつきました。 彼は、主な問題は、これらのエッジケースを処理することではなく、 人々がテストを書くのを嫌っている事につきると見ていました。 必要とされているのは、テストから、全てのきつい仕事を取り出した、実に、本当に、学びやすい、 全く簡単なモジュールでした。Paul Johnsonは、同時にこのアイディアを持っていました(が、不幸なことに、かれは、Tonyのキッチンにいなかった)。 これこそが、そのまったく簡単なテストのモジュールです。 =head1 SEE ALSO =over 4 =item L テストの機能がより多い!Test::Simpleを卒業したら、Test::Moreを見てください。 Test::Simpleは、Test::Moreで、100%互換性があります。 (たとえば、プログラムで、Test::Simpleの代わりに、Test::Moreを使うことが出来ますし、それはそのまま動きます。) =item L オリジナルのPerlのテストモジュール。 =item L ユニットテストを入念にします。 =item L, L あなたのコード中に、テストを含めます! =item L テストプログラムの出力を解釈します。 =back =head1 著者 (原文まま) Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern Eschwern@pobox.comE, wardrobe by Calvin Klein. =head1 著作権 (原文まま) Copyright 2001 by Michael G Schwern Eschwern@pobox.comE. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See F