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

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

テストコードでも -w をつけたほうがよさげ

File::Spec の catfile の引数の続きみたいな話。

おかしいのは、普通に
prove -I lib
とか
perl -I lib t/001_hoge.t
みたいにすると、さっきのメッセージは出ず、モジュールディレクトリ上で、
make test
を実行するとさっきのエラーが出る、というところ。

なんで、prove したときは警告でないのかなー、と思ってたら、gfx さんのトコにこんな記事が(gfx さんと tokuhirom さんのコメントも熱くて、なかなか面白い話でした)
Use -w in applications, use warnings in modules

正しくは「アプリケーションでは #!行に-wと書き,モジュールではuse warningsを使う」である。
(中略)
つまり,use warningsの効果はレキシカルなので,読み込むモジュールにとっては効果がないのだ。

なるほど!
use warnings だとパッケージ単位でしか有効にならないもんね。

つまり前のやつでは、shebang 行に「-w」を付けないと、File::Spec で警告が有効にならないのね。前回のコードに、-w を付けてみます。

#!/usr/bin/perl -w

use strict;
use warnings;

use Test::More;
use File::Spec::Functions qw(catfile);

is( catfile("/tmp", undef), "/tmp/" );

done_testing();

すると、

tsucchi@over[103]% prove a.pl
a.pl .. Use of uninitialized value $file in concatenation (.) or string at /usr/local/lib/perl5/5.10.1/File/Spec/Unix.pm line 102.
a.pl .. ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.00 usr  0.03 sys +  0.00 cusr  0.05 csys =  0.08 CPU)
Result: PASS

と、ちゃんと prove でも警告が出ます。make test では暗黙のうちに -w がついてるのかなぁ?ここは謎のままです。(明日調べてみよう) 一応ざっくり調べました → prove と make test の違い

とりあえず今日の結論。

モジュールのテストコードには shebang に「-w」を付けとくのがよさげです。じゃないと、prove したときは警告出ないのに、make test で警告が出てびっくりするから。

これって常識なのかな?