概要
やり方は、以下の手順。
- Test::Mojo->newする。
- Test::TCPのserver側で、Mojo::Server::Daemonを使用して一時的なWebサーバを立ち上げる。
- Test::TCPのclient側で、PhantomJSのコマンドを実行。引数にポート番号を渡す。
- PhantomJSのスクリプト内でポート番号を受け取って、Webサーバにアクセスする。
PhantomJSのスクリプト
PhantomJSのスクリプトは例えば以下のようになる。
t/scenario1.js
var System = require('system');
var port = System.args[1];
var page = require('webpage').create();
page.open('http://127.0.0.1:'+port+'/', function() {
page.render('test.png');
phantom.exit();
});
コマンドライン引数でポート番号を受け取り、
トップページのスクリーンショットを取るスクリプトとなっている。
テストコード(Perl)
テストコードは以下のようになる。
t/basic.t
use strict;
use warnings;
use File::Basename;
use Mojo::Server::Daemon;
use Test::TCP;
use Test::More;
use Test::Mojo;
my $t = Test::Mojo->new('SampleApp');
# Webサーバ設定
my $server = Test::TCP->new(
code => sub {
my $port = shift;
my $daemon = Mojo::Server::Daemon->new(listen => ['http://*:'.$port]);
$daemon->app($t->app);
$daemon->run;
}
);
# サーバのListenポートを取得
my $port = $server->port;
# PhantomJSのコマンドを実行
my $file = dirname(__FILE__) . '/scenario1.js';
`phantomjs $file $port`;
# 実行後のDBの状態を調べたりしてテストする
ok 1;
done_testing();
テスト実行
以下のコマンドで実行。
$ prove -l t/basic.t
テストを実行すると、実行したディレクトリにトップページのスクリーンショットファイルが生成される。
用途
Javascriptの動作テストをするときにやりたかった。
PhantomJSスクリプト内でHTMLのチェックなどはしないで、
Perl側で最終的なDBの状態をチェックするような方法を取った。
HTMLチェックをするなら、PhantomJSからHTMLを返してもらって、
Mojo::DOM::HTMLとTest::Moreでチェックする方法を選ぶ。
PhantomJSは止まらない場合があるので、
タイムアウトを設定して実行したほうが良い。
タイムアウトした場合は、テスト失敗になるように。