【Perl】 Test::WWW::Simpleがインストールできない件
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
Perlbrewで最新のPerl環境を構築した後は、大抵、いろいろなCPANモジュールを追加でインストールしますが、そのなかでも、テスト自動化のために欠かせないモジュールとして、Bundle::Testは是非ともインストールしておきたいところです。これは様々なテスト用モジュールをバンドルしたもので、Test::WarnやDevel::Cover、Test::Deepなど、テストで特に良く使われると思われるモジュールを一度にインストールすることができます。
さて、先ほども新たなPerl環境を構築し、このBundle::Testをインストールしてみたのですが、インストールされるモジュールのなかで、Test::WWW::Simpleだけ、インストール時のテストに失敗してしまい、インストールすることができません。エラーの内容は以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# Waiting for test webserver to spin up # starting Mojolicious server Use of inherited AUTOLOAD for non-method main::shagadelic() is deprecated at t/15ss_cache.t line 21. Undefined subroutine &main::shagadelic called at /home/atomitech/perl5/perlbrew/perls/perl-5.14.2/lib/site_perl/5.14.2/Mojolicious.pm line 46. Mojolicious::AUTOLOAD('daemon') called at t/15ss_cache.t line 21 # Failed test 'Fetch of http://localhost:3000/ failed: 500 Can't connect to localhost:3000 (接続を拒否されました)' # at blib/lib/Test/WWW/Simple.pm line 99. # Failed test 'Fetch of http://localhost:3000/ failed: 500 Can't connect to localhost:3000 (接続を拒否されました)' # at blib/lib/Test/WWW/Simple.pm line 99. # Failed test 'cached from last get [http://localhost:3000/] [/bbbbb/ should match]' # at blib/lib/Test/WWW/Simple.pm line 99. Wide character in print at /home/atomitech/perl5/perlbrew/perls/perl-5.14.2/lib/5.14.2/Test/Builder.pm line 1759, <> line 29. # got: "Can't connect to localhost:3000 (接続を拒否されました)\x{0a}\x{0a}LWP:"... # length: 205 # doesn't match '(?^:bbbbb)' # Failed test 'still cached [http://localhost:3000/] [/bbbbb/ should match]' # at blib/lib/Test/WWW/Simple.pm line 99. Wide character in print at /home/atomitech/perl5/perlbrew/perls/perl-5.14.2/lib/5.14.2/Test/Builder.pm line 1759, <> line 29. # got: "Can't connect to localhost:3000 (接続を拒否されました)\x{0a}\x{0a}LWP:"... # length: 205 # doesn't match '(?^:bbbbb)' # Failed test 'Fetch of http://localhost:3000/ failed: 500 Can't connect to localhost:3000 (接続を拒否されました)' # at blib/lib/Test/WWW/Simple.pm line 99. # Failed test 'return to last cached value [http://localhost:3000/] [/ccccc/ should match]' # at blib/lib/Test/WWW/Simple.pm line 99. Wide character in print at /home/atomitech/perl5/perlbrew/perls/perl-5.14.2/lib/5.14.2/Test/Builder.pm line 1759, <> line 29. # got: "Can't connect to localhost:3000 (接続を拒否されました)\x{0a}\x{0a}LWP:"... # length: 205 # doesn't match '(?^:ccccc)' # Failed test 'Fetch of http://localhost:3000/ failed: 500 Can't connect to localhost:3000 (接続を拒否されました)' # at blib/lib/Test/WWW/Simple.pm line 99. # Looks like you failed 7 tests of 9. # Failed test 'working output as expected' # at t/15ss_cache.t line 41. # Structures begin differing at: # $got->[1] = 'not ok 1 - Fetch of http://localhost:3000/ failed: 500 Can't connect to localhost:3000 (接続を拒否されました) # ' # $expected->[1] = 'ok 1 - initial value OK [http://localhost:3000/] [/aaaaa/ should match] # ' # Shutting down test webserver # Looks like you failed 1 test of 1. t/15ss_cache.t .... Dubious, test returned 1 (wstat 256, 0x100) Failed 1/1 subtests |
少し詳しく見てみると、どうやらテスト用にMojoliciousサーバを起動しようとして失敗し、結果、その後のテストにも失敗している模様です。
エラーメッセージをもう一度詳しく見てみると、
1 2 3 4 |
Use of inherited AUTOLOAD for non-method main::shagadelic() is deprecated at t/15ss_cache.t line 21. Undefined subroutine &main::shagadelic called at /home/atomitech/perl5/perlbrew/perls/perl-5.14.2/lib/site_perl/5.14.2/Mojolicious.pm line 46. Mojolicious::AUTOLOAD('daemon') called at t/15ss_cache.t line 21 |
どうやら、shagadelic
という存在しないサブルーチンを呼び出していることが原因のようです。なお、Mojolicious側でAUTOLOAD
サブルーチンを定義しているため、AUTOLOADの警告も併せて出力されています。
Test::WWW::Simpleの、該当するテストコードの方を見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
my $pid = fork; if ($pid == 0) { diag "starting Mojolicious server"; my @values = qw(aaaaa bbbbb ccccc ddddd eeeee fffff ggggg); get "/" => sub { shift->render_text(shift @values) }; get "/stop" => sub { shift->render_text("ok!"); diag 'stopping Mojolicious server'; kill 9,$$ }; shagadelic('daemon'); } |
プロセスをfork
した後、子プロセス側でMojoliciousサーバをセットアップして起動する、という内容のようです。また、shagadelic('daemon')
の行で、サーバをデーモンモードで起動しようとしています。
MojoliciousのChangesを確認すると、以下の記述がありました。
1 2 3 4 5 |
0.999925 2010-06-07 (中略) - Switched to app->start instead of shagadelic as default way to start Mojolicious::Lite apps in the documentation. |
上記によると、Mojoliciousのバージョン0.999925以降では、shagadelic
サブルーチンの代わりにapp->start
で起動する必要があるようです。ちなみに、現在のMojoliciousのバージョンは2.95ですので、Test::WWW::Simpleのテストコードを以下のように修正した上で、再度テストを行ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
(差分) $ diff -uwb 15ss_cache.t.orig 15ss_cache.t --- 15ss_cache.t.orig 2012-05-20 07:53:58.411995082 +0900 +++ 15ss_cache.t 2012-05-20 07:54:03.527048133 +0900 @@ -18,7 +18,7 @@ diag 'stopping Mojolicious server'; kill 9,$$ }; - shagadelic('daemon'); + app->start('daemon'); } else { diag "Waiting for test webserver to spin up"; (再テスト) $ prove -b t/15ss_cache.t t/15ss_cache.t .. # Waiting for test webserver to spin up # starting Mojolicious server t/15ss_cache.t .. 1/1 # Shutting down test webserver # stopping Mojolicious server t/15ss_cache.t .. ok All tests successful. Files=1, Tests=1, 8 wallclock secs ( 0.02 usr 0.01 sys + 0.05 cusr 0.81 csys = 0.89 CPU) Result: PASS |
テストが成功しました。Test::WWW::Simpleのテストスクリプト自身の問題だと判明しましたので、改めてモジュールをインストールします。
1 2 3 |
$ cpanm --force Test::WWW::Simple $ cpanm Bundle::Test |
これで、モジュールを無事インストールすることができました。
以上、Test::WWW::Simpleモジュールのインストールに関する話題をご紹介しました。