テストコードでも -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 で警告が出てびっくりするから。
これって常識なのかな?