Happy Testing Perl

第1回Perlにおけるテストの概要/TAPとは

モバイルファクトリーの松野です。 今回から数回にわたって、Perl におけるテスト手法についてリレー形式で詳細に解説していきたいとおもいます。 今回は初回ですので、ざっくりと概論になります。

Perlの世界におけるテストの重要性

Perlの世界においてはテスト(test)は大変重要視されています。 その特徴がよく表れているのがCPAN Testersではないでしょうか。

CPAN Testers

Perlといえば何はなくともCPANなわけですが、CPANでモジュールを探していると、図1のように、⁠CPAN Testers」という項目があることに気付きます。

図1 CPAN Testers
図1 CPAN Testers

世界中のPerl Mongersが、自分のマシンでテストを動かして、その結果をCPANに送っているのです。これにより、様々なOS/CPU/versionのPerlでテストがされています。貴方も気軽にCPAN Testersの一員となることができるので、ぜひやってみてください。普段便利に使わせてもらっているPerlの世界にぜひとも恩返ししてみましょう。 CPANの新着モジュールを監視して、アップロードされたモジュールをすかさずテストしてくれているテスターの方がいますので、かならず1回以上はテストレポートがもらえます;-)

テスト回数は多ければ多いほうが良い

テストがこけたりすると「ちゃんとテストしろよR*****」などとDISられることになりますので、テストはちゃんと動かしてからアップロードしないといけません。 ましてや、テストコードが皆無だったりすると、誰も使ってくれないかもしれませんし、場合によっては痛烈にDISられることもあります。かくいう私もテストがすくないとそのモジュールを使うのをやめてしまうことが多いです。 さてこのようにテストに力をいれているPerlですから、テストに関する仕組みがいろいろと考案されています。CPANにあがっているモジュールのうち、⁠Test::*」という名前空間にあるモジュールが239個もあるのです。 とはいえ、この中でメンテナンスされていて、人気があるモジュールは一部にすぎませんので、おじけづくことはありません。今人気のモジュールについてはこの連載の次回以後で紹介するので安心してください。

最もシンプルなTest::Simple

さて本題です。PerlのTestモジュールのうちで最も単純なものがTest::Simpleです。 これは非常に簡単に使うことができます。

use Test::Simple tests => 1; # テスト数の設定
ok(1+1==2);                  # 実際のテスト

ね、簡単でしょう。 このテストでは、1+1が2であることをテストしています。 このスクリプトを動かすと出力は

1..1
ok 1

のようになり、テストが成功していることがわかります。

これを

use Test::Simple tests => 1;
ok(1+1==3);                  # orz

のように変更すると

1..1
not ok 1
#   Failed test at hoge.pl line 2.
# Looks like you failed 1 test of 1.

のようになって、残念無念です。

proveとTest::Harness

テストスクリプトが1個だけならば、1個ずつ動かしていればいいのですが、数が多くなってくるとこのようなテストを1個ずつ動かしていたら大変です。そこで、テストをまとめて実行するためのツールがあります。 それがprove[1]です。

prove t/*.t

のように実行すると

図2
図2

のようにテストの実行結果が表示されます。 proveによって複数のテストを実行した際のサマリが、非常にわかりやすくなります。 このproveというスクリプトは、Test::Harnessというモジュールを使っています。CPAN モジュールのテストなどもこのTest::Harenssを使っています。

TAP

Test::Harness はテストの結果をとりまとめてくれるわけですが、どうやってまとめているのでしょうか。その秘密はTAPにあります。

TAPは

1..1
ok 1

のような出力を出すというすごく単純なプロトコルです。最初の行が、何回テストをするかの計画を表していて、それ以後はテストの結果です。 成功なら「ok⁠⁠、失敗なら「not ok」と表示するだけの単純さです。 この*シンプルさ*というのが重要です。これだけシンプルなので、他のプログラミング言語との連携も簡単です。実際に Perl以外のプログラミング言語でTAP形式でテスト結果を出力するバインディングがいろいろあります。

C言語ならlibtapというものがあります。

PythonならPyTAPがあります。

PHPにもSimpleTestのTAP拡張があります。他にもあります。

それぞれのライブラリはわずか数十行程度で記述されています。数十行で表現できるのだから、どうみてもシンプルなプロトコルです。本当にありがとうございました。

プロトコルの詳細は仕様書を読むと良いでしょう。

Test::More

Test::Simpleはシンプルでたいへんすばらしいものなのですが、シンプルすぎて実践的ではないです。もっと機能が欲しいです。よって、Perl MongerはTest::Moreを使います。

use Test::More tests => 2;
ok(1+1==2);
is 1+1, 2;

okはTest::Simpleと同じように使えます。さらにいくつかの便利な機能が追加されています。

is($x, $y)$xが$yと等しいか
like($got, qr/expected/)正規表現にマッチしているか
cmp_ok($got, '<', $expected)比較
is_deeply($got, $expected)ネストした構造のデータが等しいかどうか

この他にもいくつかの便利な機能があります。 この他の機能に関しては氷魚さんがTest::Moreのドキュメントを日本語訳してくれているので、下記の URL から参照してみてください。

というわけで今回は

  • perl におけるテストの重視され具合
  • 一番基本的なテスト用モジュールTest::Simple
  • prove
  • TAP
  • Test::More

についてお話しました。次回以後はより具体的な内容に入っていきます。

Happy testing!

おすすめ記事

記事・ニュース一覧