JSTAPdを使ってJavaScriptのクロスブラウザテストしてみた(IE含)
YAPCにてYappoさんの「Ajax Application Testing」を聴き興味をそそられました。
今回はクロスブラウザでのテスト自動化を実現したかったのでその辺りも試してみました。
http://yappo.github.com/talks/20101016-yapcasia2010-jstapd/
インストール
cpanm JSTAPd
テストをどう書くか
自分の場合はAjaxではなく生JSをテストしました。
いろいろ自由に書けますが、基本的には以下のように書けばOK。
- ????.t ファイルにテスト数とか、テストしたいJSをインクルードしたりとか書く。
- ????.js ファイルにテストJS書く。
デバッグをどうするか
基本、何かエラーがあっても表示上わかりません。
なのでFireBugなどで普通にJSデバッグする感じにするのがよいでしょう。
テスト用のjsは以下のようなURLになっていますのでここにブレークポイントを仕込んだり。
http://127.0.0.1:1978/____jstapd/contents/(テストファイル名)?session=xxxxxxxxxxxxxxx
CLIテスト
まずは以下の環境変数を設定します。
export JSTAP_AUTO_OPEN_COMMAND='open -a Safari %s'
で、あとは普通にproveすると自動でブラウザが立ち上がりCLIからテスト出来ます。
prove hoge
おおー
自動で複数ブラウザテスト(for Mac)
上記のようなことをするスクリプト書けばいいですね。
Macだと以下のような感じになりますかね。
use strict; my $dir=$ARGV[0]; my @browser = ( 'open -a Safari %s', 'open -a Firefox %s', 'open -a "Google Chrome" %s', ); for (@browser) { $ENV{JSTAP_AUTO_OPEN_COMMAND} = $_; system("prove $dir"); }
ぽこぽこ複数ブラウザが立ち上がって自動テストするさまがおもしろいw
自動で複数ブラウザテスト(for Windows XP)
IEでもテストしたいですよね!*1
つまりWindows上で環境構築する必要があります。
まずActivePerlだとJSTAPdをインストールするのが大変なので
Strawberry Perl で普通にcpanmインストールしてしまいましょう。
あと自分のサービスだと要件的にIE6,IE7,IE8でのテストも行う必要があるので
これも自動でテストしたいところです。
今回は IE Tester を使ってみます*2。
IE Testerはどこにインストールしてもいいです。
パスにスペースがある場合は
コマンドプロントの「dir -x」コマンドで表示される短縮ディレクトリを指定しましょう。
自分の環境だと以下のような感じになりました。
use strict; my $dir=$ARGV[0]; my @browser = ( 'D:/PROGRA~1/CORESE~1/IETester/IETester.exe -ie6 %s', 'D:/PROGRA~1/CORESE~1/IETester/IETester.exe -ie7 %s', 'D:/PROGRA~1/CORESE~1/IETester/IETester.exe -ie8 %s', ); for (@browser) { $ENV{JSTAP_AUTO_OPEN_COMMAND} = $_; system("prove $dir"); }
これでバッチリ!といいたいところですが、
proveが一つ終わるたびに「ウィンドウを閉じますか?」といちいち聞かれたり、
Runtime error が発生したりするのでCLIテストはいまいち...*3
IEはだまってデーモン立ち上げてブラウザ上でテストするのがいいかもしれませんね。
また一つ注意点がありまして、
IETesterの場合はオプションの「マルチプロセスモードで起動」というのを無効にしないと
CLIのテスト時に変なプロセスが残ってしまいますのでOFFにしておきましょう