tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

STDIN を使うテスト

前回の続き。

ブクマコメで、id:kits さんより、

STDINは local *STDIN = *DATA; もできそう。

とのご指摘。確かに出来そうなので試してみました。

#!/usr/bin/perl
use strict;
use warnings;
use Test::More "no_plan";

sub add {
  my $result = 0;
  while( <STDIN> ) {
    chomp;
    $result += $_;
  }
  return $result;
}

{
  local *STDIN;
  *STDIN = *DATA;
  is(add, 3);
}

__DATA__
1
2

で、実行。

tsucchi@immature[101]% perl a.pl
ok 1
1..1

大丈夫みたいです。

  • Test::Base に慣れている人
  • 追加のモジュールを入れたくない/入れられない場合
  • 試さなきゃいけないテストパターンが少ない場合

の場合はこっちのほうが良さげですね。

オイラの場合は、

  • Test::Base に慣れてない...
  • 追加のモジュールは基本的に入れ放題
  • 入力パターンが1個しかないことはめったに無い

ので、前回のやり方の方が好きかな。あとは「入力とそれに対する結果はなるべく近くに置きたい」ってのもある。

まあ Perl なので、「やり方はいろいろある」ということですね。

追記(2009/01/25)
  • 入力パターンが1個しかないことはめったに無い

って書いたけど、「1個な場合もあるなぁ」、と思いました。

シナリオベースのテストの場合です。

シナリオテストな場合、シナリオ毎にテストファイルを作るはず。で、テストファイル内の入力量は比較的沢山、でも普通なら1シナリオ1パターンだから、データの種類は1つだけ。

なので、この場合は、__DATA__ に書いて、STDIN を捻じ曲げて __DATA__ を読むのが一番いいかな、と思いました。記述が一番シンプルになるだろうから。

それにしても、何となく書いた仕事メモだったのに、すごく勉強になりました。id:kits さんに感謝!