本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは,
本稿のサンプルコードは,
Perlにおけるテスト
読者のみなさんはテストを書いていますか。
Perlは昔からテストをとても大事にしてきた言語です。テストを書くために必要なテストモジュールはコアモジュールとしてPerl本体と一緒にインストールされていて,
今回はテストモジュールの使い方や,
なお,Perl 5.以降で動作するように書かれており,Perl 5.で動作確認を行いました。
また,use strictと,use warningsはすべて省略していますが,
テストモジュールの使い方
まずはテストモジュールの使い方とテストの実行方法を解説します。
Test::More──Perlのテストの基本
テストモジュールの中で最も基本的な機能を提供するモジュールがTest::Moreです。Test::MoreはコアモジュールとしてPerl本体と一緒にインストールされています。
Test::Moreを使ったテスト
最初のテストとして,
リスト1 length_
1: use Test::More;
2: is(length("perl"), 4, "length test");
3: is(length(undef), 0, "undef test");
4: done_testing;
1行目は,Test::Moreを使用するための宣言です。以降で使用するisという関数が使えるようになります。
2行目は,Test::Moreのis関数を使ってテストを実行しています。is関数は引数を3つ取り,length("perl")の戻り値と,length testを指定しています。
3行目では再びis関数を使って今度はlength(undef)と,0を比較しています。なお,length(undef)は実際にはundefを返すので,
最後の4行目では,Test::Moreのdone_関数を呼び出しています。
- 注1)
- 引数で与えられた文字列の文字数をカウントする関数です。
- 注2)
- テストの拡張子は
.plや.pmではなく,.tを使用します。
テストの実行
リスト1を通常のPerlのプログラムと同じように実行してください。
length_
$ perl length_test.t
ok 1 - length test ―(1)
not ok 2 - undef test ―(2)
# Failed test 'undef test' ┐
# at length_test.t line 3. |
# got: undef |―(3)
# expected: '0' ┘
1..2 ―(4)
# Looks like you failed 1 test of 2. ―(5)
テストの結果が出力されました。1行ずつ見ていきましょう。
okと出力されていますが,1)isに渡したテストの名前です。
not okと出力されていますが,
length_)got)expected)
すべてのテストが終わりdone_が実行されると,1..[テスト数]という形式で出力されます。
失敗したテストがあるとテストプログラムが終了するタイミングで,
このようにPerlでは,is関数は最も基本的なテストのための関数Test::Moreが提供するそのほかの機能を解説します。
like──正規表現によるテスト
likeは正規表現を使うテスト関数です。引数の2番目に正規表現へのリファレンスを渡す点がisと異なります。
like(
"perl-5.22.0.tar.gz",
qr/perl-5\.\d+\.\d+\.tar\.gz/,
"archive name test"
);
cmp_ ok──任意の演算子を使った比較テスト
cmp_は指定した演算子で比較を行うテスト関数です。数値の大小比較など,
cmp_ok(1 / 10, '<', 0.11, "division test");
is_ deeply──リファレンスのテスト
is_はリファレンス用のテスト関数です。2つのリファレンスをたどりながら比較を行います。
sub create_person {
return { name => $_[0], age => $_[1] }
}
is_deeply(
create_person( "James", "30" ),
{ age => "30", name => "James"},
"person object test"
);
リファレンスの先に一致しない箇所があるとテストが失敗し,