nDiki : Perl テストスクリプトの書き方

Perl テストスクリプトの書き方

Perl ではコンパイル時に発見できない/発生しないエラーを含むプログラムを書いてしまいやすい。

robust なプログラムを開発するには、テストファースト開発といった開発手法を用いることや、リグレッションテストの整備したりするといったことが重要である。

Perl では標準でテストスクリプトの作成や実行を支援するモジュールが用意されており、これらを利用することで効率的にテストを行うことができる。

以下、準備中。

Test::More

Perl でテストスクリプトを書く際の基本となるモジュールが Test::More である。

通常はこのモジュールで定義されているテストサブルーチン(ok、is、……)を使用して、テストケースを書くことで Test::Harnessプロトコル (TAP) に準拠したテスト結果を出力するテストスクリプトを書くことができる。

例については「Test::More」を参照(まだちょっぴり)。

テストファースト開発

まずテストを書いてからコードを書く。

「t/パッケージ名.t」という(あるいはその他の)名前でテストファイルを作成する (→ Test::More)

 perl Makefile.PL
 make test

テストで fail することを確認したら、コードを書く。 テストを ok になるようにする。

1つのテストスクリプトのみを実行する

テストスクリプトの数が増えてくると、テスト時間が長くなってくる。 短いサイクルで テスト-コーディングを繰り返したい時など、1つのテストスクリプトのみ実行したい場合は、make を実行する時のコマンドライン引数で、TEST_FILES マクロ (変数) を上書きする形で指定する。

GNU Make の場合は以下のようにする。

 make test TEST_FILES=t/target.t

テストファイル名

ExtUtils::MakeMaker では test.pl または t/*.t がテストスクリプトとして認識される。

スポンサード リンク

2006年12月15日 (金)

Perl テストスクリプトの中で標準エラー出力を一時的に止める

make test で実行するテストスクリプトの中で、標準エラー出力を止めたい場合がある (わざとエラーを起こす時など)。

Perl 5.8.8 の ExtUtils/MM_Unix.pm を参考に

  {
    local *STDERR_COPY;
    my $duped = 0;
    $duped = 1 if open(STDERR_COPY, '>&STDERR');
    open(STDERR, '> ' . File::Spec->devnull()) if $duped;
    my $result = `$command`;
    my $status = $?;
    open(STDERR, '>&STDERR_COPY') if $duped;
  }
  warn "This message is printed to STDERR\n";

としてみた。 LinuxWin32 ではとりあえずうまくいって動いている。

追記

(open が2引数なのは、当時古い Perl バージョンでも動くように書いたから)


[ Perl テストスクリプトの書き方 ]

スポンサード リンク
[ 12月15日全て ]

2013年10月22日 (火)

Capture::Tiny で Perl テストスクリプトの中で標準エラー出力を一時的に止める

意図的に出していて問題のない標準エラー出力への警告などをテスト実行(prove)時には出さないようにしたいというのはままある。で話題になった時にずいぶん昔にやった方法を紹介したりするのだけれど、まあ毎回自前で dup するのもということで CPAN モジュール探した。

期待する標準エラー出力への出力かどうかのテストをするなら Test:: 系をだけれど、ここでは単純に抑制したいだけなので Capture::Tiny で良いかな。

なお標準エラー出力をまるっと止めると、出ることが意図されていない警告にも気がつかなくなるので注意を。

 #!/usr/bin/perl

 use warnings;
 use strict;

 use Test::More;
 use Capture::Tiny qw/capture_stderr/;

 sub warn_function {
   warn "WARN FUNCTION";
   return 1;
 }

 sub warn_command {
   `echo "WARN COMMAND" >&2`;
   return 1;
 }

 sub uuv_function {
   my $undef_var;

   # Use of uninitialized value
   return $undef_var ne "dog";
 }

 subtest capture_stderr => sub {
   capture_stderr sub {
     ok warn_function;
   };

   capture_stderr sub {
     ok warn_command;
   };

   capture_stderr sub {
     ok uuv_function;
   };

 };

 done_testing;

[ Perl テストスクリプトの書き方 ]

[ 10月22日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

follow us in feedly

月別インデックス
Process Time: 0.053713s / load averages: 0.32, 0.34, 0.33
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker