LoginSignup
2
2

More than 5 years have passed since last update.

Test::MojoでビルドされたアプリにPhantomJSでアクセスする

Posted at

概要

やり方は、以下の手順。

  1. Test::Mojo->newする。
  2. Test::TCPのserver側で、Mojo::Server::Daemonを使用して一時的なWebサーバを立ち上げる。
  3. Test::TCPのclient側で、PhantomJSのコマンドを実行。引数にポート番号を渡す。
  4. 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は止まらない場合があるので、
タイムアウトを設定して実行したほうが良い。
タイムアウトした場合は、テスト失敗になるように。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2