月曜日, 1月 29, 2007

[Testing][Perl]Test::WWW::SeleniumでPerlからSelenium RCを操作する

Selenium IDEを使うとhtmlの各種プログラミング言語用のテストコードも出力してくれます。
Perlの場合はTest::WWW::Seleniumモジュールを利用します。

前記事「Selenium RCとSelenium IDEでWEBアプリのUIテストを簡単自動化」の操作で出力されるPerlコードは以下のようになります。

Selenium IDEによって出力されるコード

use strict;
use warnings;
use Time::HiRes qw(sleep);
use Test::WWW::Selenium;
use Test::More "no_plan";
use Test::Exception;

my $sel = Test::WWW::Selenium->new( host => "localhost",
                                    port => 4444,
                                    browser => "*firefox",
                                    browser_url => "http://localhost:4444" );

$sel->open_ok("/");
$sel->type_ok("q", "Perl");
$sel->click_ok("btnG");
$sel->wait_for_page_to_load_ok("30000");
$sel->is_text_present_ok("Perl の検索結果");


スクリプトはutf8で保存します。browser_urlがlocalhostになってしまうようなのでwww.google.co.jpに変更します。

スクリプト実行前にSelenium RCを起動しておきます。
java -jar selenium-server.jar


続いてテストスクリプトを実行します。
ok 1 - open, /
ok 2 - type, q, Perl
ok 3 - click, btnG
ok 4 - wait_for_page_to_load, 30000
not ok 5 - is_text_present, Perl の検索結果
# Failed test 'is_text_present, Perl の検索結果'
# at test_utf8.t line 19.
1..5
# Looks like you failed 1 test of 5.

最後のテストで失敗してしまいました。verboseモードを使って実行手順をトレースしてみまると以下のようなコードを送信しているようでした。
---> Requesting http://localhost:4444/selenium-server/driver/?cmd=isTextPresent&1=Perl%20%C3%A3%C2%81%C2%AE%C3%A6%C2%A4%C2%9C%C3%A7%C2%B4%C2%A2%C3%A7%C2%B5%C2%90%C3%A6%C2%9E%C2%9C&sessionId=1170055300866
Got result: OK,false


日本語の部分がおかしいようなのでコードを追ってみると以下のようにutf8フラグ付を前提としているようです。
URI::Escape::uri_escape_utf8(shift @args);

テストスクリプトにuse utf8をつけて再度実行してみます。
ok 1 - open, /
ok 2 - type, q, Perl
ok 3 - click, btnG
ok 4 - wait_for_page_to_load, 30000
ok 5 - is_text_present, Perl の検索結果
1..5

上手く実行できました。

このようにプログラムからテストを実行すると、テストに必要なデータの準備から後始末までを自動化できます。例えばユーザーの新規登録フローをテストするといったケースでは登録しようとするユーザーのデータがないことが前提になりますので、まずテストユーザのデータを削除してからブラウザを起動して登録フローのテストを実行することで繰り返しテストすることが可能です。DBがトランザクションをサポートしているものであれば最後にrollbackしてしまえば不要なデータも残らず快適です。

このあたりのノウハウは前項でも紹介したWEB+DB Pressで詳しく紹介されています。Perlは無いですが。。。


最終的なコード
use strict;
use warnings;
use Time::HiRes qw(sleep);
use Test::WWW::Selenium;
use Test::More "no_plan";
use Test::Exception;
use utf8;

my $sel = Test::WWW::Selenium->new( host => "localhost",
                                    port => 4444,
                                    browser => "*firefox",
                                    browser_url => "http://www.google.co.jp",
                                     );

$sel->open_ok("/");
$sel->type_ok("q", "Perl");
$sel->click_ok("btnG");
$sel->wait_for_page_to_load_ok("30000");

$sel->is_text_present_ok("Perl の検索結果");


0 件のコメント: