2007年4月12日
スクレイピングツールを使って自動化テスト:WWW::Mechanizeの利用
SEの進地です。
スクレイピング(Scraping)とはWebページを取得し、タグを解析し、必要な情報を抽出して利用すること、およびその技術です。こうしたスクレイピングを支援するツールはRSSやWebサービスAPIを提供していないサイトの情報も組み合わせてマッシュアップするWeb 2.0ライクなサービスの構築にも利用できますが、自動化テスト用のツールとしても非常に優秀です。
今回は強力なスクレイピングツールの一つであるWWW::Mechanize(mechと呼称されることもあり)を使ったWebシステムの自動化テスト技法について書いていきます。
WWW::Mechanizeの利用環境
WWW::Mechanizeは元々はPerlのモジュールとしてCPAN(http://www.cpan.org/)で配布されていましたが、現在ではRuby、Pythonにもモジュールが提供され、利用できるようになっています。
・Perl
http://search.cpan.org/~petdance/WWW-Mechanize-1.22/
・Ruby
http://mechanize.rubyforge.org/
・Python
http://wwwsearch.sourceforge.net/mechanize/
以下ではPerl版を取り上げて、WWW::Mechanizeを利用したWebの自動化テストの作成を行います。
テスト対象のシステムとテストシナリオ
テスト対象のシステムとして弊社のお問い合わせフォーム(https://www.ark-web.jp/contact/)を考えます。
そしてテストシナリオとしてまずはシンプルに下記を考えてみます。
個人情報保護のチェックが正しく動いているかを確認するシナリオになります。
1.お問い合わせフォーム(https://www.ark-web.jp/contact/)にアクセスする
2.フォームに「お名前」、「メールアドレス」、「ご希望アクション」、「お問い合わせ内容」、「アークウェブをどちらで知りましたか?」の各値を入力/選択してフォームを送信(Submit)する
3.エラー画面が表示され「個人情報保護方針への同意を入力してください。」というメッセージが表示されることを確認する
テストスクリプトの作成
テストシナリオに沿ってスクリプトを記述していきます。
1.お問い合わせフォーム(https://www.ark-web.jp/contact/)にアクセスする
use WWW::Mechanize;
our $ENTRY_POINT = 'https://www.ark-web.jp/contact/';
my $mech = new WWW::Mechanize;
$mech->get($ENTRY_POINT);
if ( ! $mech->success ) {
die "$! -- fail to access $ENTRY_POINT";
}
WWW::Mechanizeオブジェクトを生成し、getメソッドでお問い合わせフォームにアクセスします。アクセスしたいリソースのURLはgetメソッドの引数として指定します。WWW::Mechanizeオブジェクトの生成がブラウザの起動、getメソッドへのURLの指定がブラウザのアドレスバーにURLを指定するようなイメージを持ってもらうとわかりやすいと思います。
直前の操作の成功/失敗を$mech->successで取得できるので、フォームへのアクセスが成功したかどうかを調べています。
2.フォームに「お名前」、「メールアドレス」、「ご希望アクション」、「お問い合わせ内容」、「アークウェブをどちらで知りましたか?」の各値を入力/選択してフォームを送信(Submit)する
use Jcode;
$mech->submit_form(
fields => {
name => Jcode::convert('名前', 'sjis'),
email => Jcode::convert('hoge@example.com', 'sjis'),
action => Jcode::convert('担当者に来て欲しい', 'sjis'),
content => Jcode::convert('はじめまして。○×会社の○○です。\n\n今日は弊社で検討している・・・', 'sjis'),
where => Jcode::convert('知人の紹介', 'sjis')
}
);
if ( ! $mech->success ) {
die "$! -- fail to submit\n";
}
submit_formメソッドはWWW::Mechanizeが現在取得しているページ上のフォームを送信(Submit)するメソッドで、この時に同時に幾つかのパラメータを指定することができます。ここでは、fieldsパラメータを使用して「お名前」、「メールアドレス」、「ご希望アクション」、「お問い合わせ内容」、「アークウェブをどちらで知りましたか?」の各項目の値を指定しています。こうすることで、各項目をフォームに指定した状態での送信が行われます。fieldsパラメータの様式は
fields => {
フォームフィールド名1 => フォームフィールド名1に指定する値,
フォームフィールド名2 => フォームフィールド名2に指定する値,
:
}
となっており、各項目のフォームフィールド名はHTMLのソースを確認して調べ、指定します(※1)。
スクリプトの文字コードがEUC-JPで、お問い合わせフォームの文字コードがShift_JISであるため、指定する値は全てShift_JISにJcodeを使って文字コード変換しています(※2)。
3.エラー画面が表示され「個人情報保護方針への同意を入力してください。」というメッセージが表示されることを確認する
my $result = Jcode::convert($mech->content, 'euc');
if ( is_error_page($result) && $result =~ /個人情報保護方針への同意を入力してください。/) {
print "Success\n";
} else {
print "Fail\n";
}
sub is_error_page {
my $text = shift;
if ( $text =~ /エラー/ && $text =~ /err.gif/ ) {
return 1;
} else {
return 0;
}
}
contentメソッドで現在WWW::Mechanizeオブジェクトが取得しているリソースのテキストを取得できます。この場合はsubmit_form実行後のページのHTMLソースがcontentメソッドで取得できます。
後は、取得したHTMLソースから、このページがエラー画面であるか(is_error_page関数)、そして、「個人情報保護方針への同意を入力してください。」という文字列があるかを文字列検索でチェックしています。スクリプトの文字コードがEUC-JPで取得したHTMLソースの文字コードがShift_JISであるため、文字列検索前にHTMLソースの文字コードをEUC-JPに変換しています。
完全なスクリプトは下記で参照できます(ソースは若干整理しています)。
アークウェブお問い合わせフォーム個人情報保護チェックテストスクリプト
このスクリプトを実行すると結果が期待通りなら"Success"と失敗なら"Fail"とコンソール上に表示されます。
WWW::Mechanizeによる自動化テストの強み
スクレイピングツールであるWWW::Mechanizeを利用した自動化テストのシンプルな例を作成してみました。WWW::Mechanizeは一つのHTTPクライアント、ブラウザのように扱うことができるため、これを上手く利用することで従来ブラウザによって手動で行っていたテストをスクリプト化することができます。
Webの自動化テストツールとしてはSelenium(http://www.openqa.org/selenium/)が有名ですが、Seleniumと比べてスクリプト化するメリットは下記になるかと思います。
- 夜間に(cronなどで)自動実行させておき、異常があった時にメールなどで通知することもできる
- スクリプトが利用できるので取得結果を柔軟に解析できる
また、上手くテストスクリプトを設計すれば、類似テストの作成、リソース上の変更があった際の追随を容易にすることができます。例えば、例ではis_error_page関数でページ内に"エラー"と"err.gif"という文字列の存在をもってエラーページであるとの判定をしていますが、エラーページ内の文言変更などで違うロジックで判定しなくてはいけなくなった場合はis_error_page関数のロジックを書き換えるだけでよいようにしています。
まとめ
スクレイピングツールがテストツールとしても利用できることを簡単な例で示しました。しかし、今回示したようにただ単に一つの単純なシナリオを通すだけであれば実はSeleniumを利用した方がテストの作成は簡単です。スクリプトによる自動化テストは
- 大量の類似テストの実行
- 複雑な手順のテストの実行
- ページ上以外のリソースとの連携(例えばDBとの連携)
が実施できないとそのメリットが完全には活かされません。
また、適切にコード設計しない状態では初期作成コスト、保守コストともにSeleniumを上回ってしまいます(※3)。案件の特性によってはSeleniumの利用がより適切というケースも当然あることに注意が必要です。
次回以降は、こうしたメリット/デメリットを意識した自動化スクリプトの作成、テスト技法について述べていきたいと思います。
※1
WWW::Mechanizeにはフォームフィールド名を調べなくてもブラウザ上に表示されている可視の入力項目に対して上から順に値を指定できるset_visibleというメソッドもあります。ただし、厳密には見えるままではなく、HTMLソース上での登場順であるため、TABLEレイアウトなどがされている場合は値を指定する順番に注意が必要です。
※2
特にラジオボタン、セレクトボタン、チェックボックスなど予め選択時の値が決まっている様式の項目で、値が日本語で指定されている場合、文字コードを統一していないとWWW::Mechanizeは存在していない値が指定されたとしてErrorを吐いて処理をやめますので、文字コードの統一には気を配る必要があります。最初からスクリプトの文字コードを取得対象のページの文字コードと同一にしておけばこうした処理は不要になります。
※3
大抵、初期作成コストはSeleniumのそれを上回ります。
カテゴリー: テスト(システム開発)
タグ:
« 前の記事:JSChartを使ってPukiWiki上でグラフ(円グラフなど)を表示する
» 次の記事:ecoったー(eco.tter):Twitter×プチeco行動のマッシュアップサービス
アークウェブの本
Zen Cartによるオンラインショップ構築・運用テクニック―オープンソース徹底活用
内容充実のZen Cart公式本(v1.3対応)がついに発表です。アークウェブのスタッフをはじめZen-Cart.JPの中心メンバーが共著で執筆しました。続きを読む
新着はてブ
カテゴリー
- Shopify(ショピファイ)オンラインショップ構築
- NGO・NPO向け情報
- スマートフォン
- だれもが使えるウェブコンクール
- mixiアプリ
- OpenSocial (システム開発)
- アークウェブのCSR
- A-Form, A-Member, A-Reserve(MTプラグイン)
- Ruby on Rails(システム開発)
- necoったー
- Miqqle
- WebSig24/7
- ecoったー
- ビッグイシュー(The Big Issue)
- CSR(企業の社会的責任)
- マッシュアップ
- RIA (システム開発)
- セキュリティ(システム開発)
- 唐松(アクセス解析)
- Ajax (システム開発)
- テスト(システム開発)
- データベース
- PukiWiki
- Web 2.0
- SEO・サーチエンジン最適化
- XP・アジャイル(システム開発)
- Web・ITニュースクリップ
- Webアクセシビリティ
- Webデザイン
- SEM・サーチエンジン広告
- Webユーザビリティ
- CMS・MovableType
- Zen Cart(オンラインショップ構築)
- Snippy(SNS・ソーシャルブックマーク)
- アークウェブ
- オープンソース
- CMS(コンテンツマネジメント・システム)
- Webマーケティング
- AMP
- SNS