Perlのテストコードを書く

イマドキのプログラミング言語では、単体テスト(モジュールや関数単位のテスト)を支援する様々なライブラリやフレームワークが標準で提供される事が多くなってきていますが、当然Perlにもテスト用のモジュールが用意されています。

Perlにおけるテスト用モジュールは大きく分けると、以下の2種類が有ります。

  • テストコードの自動起動や、結果の収集/結果のサマリーレポートを行う「Test::Harness」と、その関連モジュール
  • 名前が「Test::」で始まる、各種テスト結果の判定を行うモジュール群

ここでは後者のテスト結果を判定するモジュール群について解説します。


標準モジュールTest::Simpleを使うと「ok」という関数が使えるようになります。このok関数はPerlにおける最もシンプルなテスト用の関数で、この関数にテスト結果の成否を引き渡す事でテスト結果を標準出力へ出力します。

以下にサンプルのモジュールと、そのモジュールをテストするためのコード例をok関数の使い方と共に示します。

SampleModuleCode.pm

    1	package SampleModuleCode;
    2	
    3	use strict;
    4	use warnings;
    5	
    6	require Exporter;
    7	our @ISA = qw(Exporter);
    8	our @EXPORT = qw(func);
    9	
   10	sub func {
   11	    my $param = shift;
   12	
   13	    if (defined($param)) {
   14		return $param;
   15	    } else {
   16		die 'No!Param!';
   17	    }
   18	}
   19	1;

SampleTestCode.t

    1	#!/usr/bin/perl
    2	
    3	use strict;
    4	use warnings;
    5	
    6	use Test::Simple tests => 2;
    7	
    8	use SampleModuleCode;
    9	
   10	ok(func(1) == 1, 'Test Code No.1 - normal test pattern');
   11	
   12	eval {
   13	    func();
   14	};
   15	
   16	my $string = $@;
   17	
   18	ok($string =~ /No!Param!/, 'Test Code No.2 - exception test pattern');

実行結果

$ perl SampleTestCode.t
1..2
ok 1 - Test Code No.1 - normal test pattern
ok 2 - Test Code No.2 - exception test pattern

このテストコード(SampleTestCode.t)を理解する上でのポイントは以下の通りです。

  1. ファイル名:
  2. Perlではテストコードのファイル名は拡張子に.tを付けます。各種テスト用のモジュールがこの拡張子を意識して設計されているので、拡張子は必ず付けましょう。

  3. 6行目:「use Test::Simple」に続いて、テストの件数を指定(tests => 2)
  4. Perlでテストコードを書くための最も基本的なモジュールがTest::Simpleです。Test::Simpleをuse指定する事でテスト結果を判定し、報告するためのok関数が使えるようになります。

    また、テストの数を予め宣言する事で、テストの実行数と宣言した数が相違した際にテスト全体を失敗と判定する事が出来ます。テスト数が最終的に決まっていない時は、「use Test::Simple qw(no_plan)」と指定する事でテスト数を省略する事が出来ます。

  5. 10行目:ok関数に引数としてテスト内容と、その説明を渡す
  6. Test::Simpleが提供するok関数は、最初の引数としてテスト内容を受け取ります。通常は、テスト対象の関数の戻り値が想定した物と同値か?という条件式を記述します。条件式が真であればテスト成功となり、偽であればテスト失敗となります。テスト結果は詳細は後で説明しますが、TAPというプロトコルに従って、標準出力へ出力されます。

    また、2番目の引数のテストの説明は書いた方がテスト結果を見た時に分かりやすいので必ず何か書いた方がいいでしょう。内容が分かるメッセージを記述しましょう。

  7. 12行目:テスト対象のモジュール内でdieする時はテストコード内でevalする事
  8. テストするモジュールの中でdieしてしまうと、当然の事ながらテストコード自体がdieしてしまうので、モジュールの例外処理を試験する時は必ずevalで結果をラッピングする必要が有ります。

    例外(die)をテストする時には標準モジュールではありませんが、Test::Exceptionという便利なモジュールが有りますので、こちらを利用した方が良いようです。

  9. 実行結果
  10. テストコードを実行すると、最初にテスト数を「1..n」の形式で出力した後、それぞれのテスト結果を表示していきます(「ok」又は「not ok」の表示に続いて、テスト番号とテスト内容を表すメッセージ)。

    この最初にテスト数を表示し、次にテスト結果を出力する形式は、TAP(Test Anything Protocol)というプロトコルで決められた形式です。

    TAPの詳細や、そのメリットは別記事で紹介します。また、ok関数は実際にはテスト結果の判定はしておらず、判定結果の真偽値を受け取る、レポート専用関数になっていますが、Test::Moreなどのテスト用モジュールではもっと便利な関数が使えるようになります。これも別記事で紹介します。


→Perl To The Peopleのインデックスページへ戻る

トラックバックURL

このエントリーのトラックバックURL:
http://ash.roova.jp/mt/mt-tb.cgi/83

コメントする