BlazeDSとAMFでWebとデスクトップのアプリケーションを構築する
現在のRIAアーキテクチャにおいて、クライアント/サーバーの通信は重要な位置を占めています。本稿では、James WardとShashank TiwariがアドビによるオープンソースのBlazeDSメッセージングサーバーの世界へ飛び込みます。
- Java,

作者 Jeff Xiong, Mike Williams, Josh Price, 翻訳者 岡田 英久 投稿日 2007年9月26日 午前10時50分
Q: 一般的なオンラインストアでは、買い物を完了するために多くのプロセスでユーザからの入力を必要とします。ソフトウェア開発者は自分の実装の品質と正しさをどうやって確認すればよいでしょうか?
それは、生活のためにWEBアプリケーションを開発している人たちがよくぶつかる疑問です。アプリケーションの機能をテストすることができれば本当に便利です。でもどうやってそれを実現すればよいでしょう?
Selenium(source)はThoughtWorksによって書かれたWEBアプリケーション専門のテスティングツールです。Seleniumのテストは実際のユーザがやるのと同じように直接ブラウザ上で実行されます。SeleniumはWindows、Linux、Mac上のInternet Explorer、Mozilla、Firefoxで動作します。
実際に動作しているSeleniumをオンラインデモ(source)で確認してみてください。右上の角にある「All」ボタンをクリックしてテストケースを実行します。うまくいけば、テストにパスしてきれいな緑色のバーが表示されるはずです。actionはassertよりも淡い緑色で表示されることに注目してください。これは何故かというと、actionはverifyコマンドやassertコマンドのように実際に何かをテストしているわけではないからです。 assertが失敗すると、失敗したコマンドは赤くなり、Seleniumは処理を中止します。一方verifyコマンドが失敗すると、やはり赤くなりますがテストは中止されません。

SeleniumのテストケースとテストスイートはHTMLで記述します。実際それらはただのHTMLの<table>要素に過ぎません。テストスイートの各行は次に示すようにテストケースへの参照です。
<tr><td><a href="MyTest.html">MyTest</a></td></tr>
テストケースは「Selenese」と呼ばれる形式で書かれたHTMLドキュメントとして表現され、そこにはコマンドと二つの引数のための十分なスペースをもった3カラムのテーブルがあります。典型的なテストケースは次のようになります。

「All」ボタンを押すなどしてテストを開始すると、SeleniumのテストランナーがHTMLのテストケースドキュメントを解釈し、一番下のフレームに表示されるWEBアプリケーションを動かします。
ユーザのアクションをシミュレートすることで、Seleniumはユーザインターフェースを通じたアプリケーションのテストを可能にします。もちろん単体テストの代わりにはなりませんが、私たちはWEBアプリケーションの受け入れテストを自動化するためによく使用します。定期的な再帰テストを自動化するために継続的インテグレーションにおけるビルドに組み込むこともできます。もっと深くSeleniumを知りたければ、オンラインドキュメント「Selenium: Usage」を参照(サイト・英語)してください。
Ajax(Asynchronous JavaScript and XMLの略)は、インタラクティブなWEBアプリケーションを制作するための開発テクニックです。ページの背後にあるサーバと小さなデータをやりとりすることでユーザが変更を行うたびにWEBページ全体をリロードする必要をなくし、WEBページの反応をより良く感じさせることを意図しています。これは WEBページの双方向性や速度、ユーザビリティが高まることを意味します。

「Loading」というメッセージはAjaxで表示されている
Ajaxの技術的な定義はそういうことですが、大部分の人にとってのAjaxとはGMailやFlickrのように動作するWEBページのことです。リンクをクリックしてもページのリロードが起こらず、代わりにブラウザはサーバと通信を行い、表示中のページの一部だけを更新します。この、リンクをクリックしてから結果を確認するまでの待ち時間がことをややこしくするのです。
テキストフィールドとボタンを一つずつもっているWEBページがあるとしましょう。テキストフィールドの初期値は「oldValue」です。ボタンをクリックするとAjaxの魔法が発動して、テキストフィールドの値はページがリロードされることなく「newValue」に変わります。私たちはどうやってこれをテストすればいいでしょう? 明らかなアプローチは、ページを開いてボタンをクリックし、テキストフィールドの値を確認することです。でも Seleniumを使ってそれを行うと、テストケースは失敗してしまうのです。

テストが失敗する理由は恐らくそんなに明白ではありません。Ajax呼び出しは非同期な性質をもっており、結果はサーバからすぐに返ってくるわけではありません。だからフィールドの値はボタンをクリックした数秒後に変更されたのですが、Seleniumはすぐに値をチェックして古い値を見てしまったのです。では、Seleniumが結果を待つことを知らないのなら、私たちが素晴らしいAjaxの効果をテストされた状態で手に入れるにはどうすればよいのでしょうか?
どうやってSeleniumに結果を待たせればよいでしょう? この問題を解決する方法の一つはclickの代わりにclickAndWaitコマンドを使うことです。この「AndWait」というサフィックスは、Seleniumがページのリロードを待つ必要があることを示しています。これはうまく動作するように思えるかもしれませんが、ここには落とし穴があります。ページはリロードされないので、clickAndWaitはSeleniumを永遠に待たせ続けることになります。これでは駄目なのは明らかです。
もう一つの可能性はclickとassertValueの間に小休止をはさむことです。サーバが応答するのに十分な時間を与えるため、間で5秒間止めてみましょう。このアプローチなら大抵の場合はうまく動作しますが、サーバが応答に5秒以上かけると失敗してしまいます。これは様々な理由によって起こり得ます。ネットワークの遅延やテストマシンの過負荷など。結果を確認する前の一時停止期間をどんどん延ばしていってもよいですが、そうするとテストの実行もどんどん遅くなります。だからこれもベストな解決策ではありません。ちゃんと動くことが保証されませんし、テストは必要以上に遅くなってしまいますから。
ありがたいことに、Seleniumはまさに私たちが求めていることを行うためのサポートを提供してくれています。表示中のページでフィールド値が変更される場合、waitForValueコマンドを使えば、期待している値が表示されるまでSeleniumを待たせることができます。
なので、失敗しているテストを成功させるため、失敗するassertValueコマンドを次のように置き換えなければなりません。

このコマンドを実行すると、Seleniumは現在のテストケースの実行を一時停止し、期待している値を待ちます。「newValue」という文字列がテキストフィールドに表示されると、停止していたテストが再開します。もし期待している値のスペルを間違うと、 Seleniumは30秒間待ってタイムアウトするので、覚えておいてください。
あなたが多分すでに予想しているとおり、Ajaxの作用をテストするために利用できるコマンドはたくさんあります。例えば、Ajaxで更新されたプレーンテキストをチェックしたいならwaitForText、現在ページのタイトルをチェックしたいならwaitForTitle、HTML要素が削除されたことを検証したいならwaitForElementNotPresentなど。実は、Selenium Accessor(サイト・英語)それぞれに対して対応するwaitForXxxxコマンドとwaitForNotXxxxコマンドがあります。何かをチェックためのverifyXxxxやassertXxxxがあるなら、非同期効果をテストするためのwaitForXxxxが必ず存在します。
あらかじめ準備されているwaitForXxxxやwaitForNotXxxxといったコマンドが自分のニーズを満たしてくれないときはどうすればいいでしょうか? そういう場合のためにwaitForConditionがあります。これを使えば、JavaScriptで書かれたBoolean式を定義して、その式を評価した結果がtrueになるまでSeleniumを待たせることができます。
waitForCondition script timeout (in ms)
これは、もっと複雑なAjax作用をテストするときに役に立つはずです。
実は、Seleniumのソースコードの中を漁れば、waitForConditionを使って実装された事前定義のwaitForXxxxとwaitForNotXxxxシリーズが全部見つかります。Grig Gheorghiu氏が、このトピックについて「Ajax testing with Selenium using waitForCondition(source)」という素晴らしいブログエントリを書いています。彼がエントリを書いたとき、waitForConditionはただのSeleniumのユーザ拡張に過ぎませんでした(サイト・英語)が、今やそれはSeleniumコアの一部となっています。
この手短な記事の中で、私たちはSeleniumというWEB受け入れテストツールを紹介しました。また、waitForXxxxというSeleniumのコマンドを使ったAjaxアプリケーションのテストの仕方について議論し、非同期なテキストの更新というシンプルなAjax作用をSeleniumでテストする方法を実例で示しました。
waitForXxxxについてもっと知りたければ、In Place Editorやオートコンプリート、ドラッグ・アンド・ドロップなどの一般的なAjax作用をテストする方法を教えてくれるサンプルテストケース(サイト・英語)がSeleniumの開発者によって提供されています。これらのサンプルはscript.aculo.usで作成されています。すでによくご存知かもしれませんが、script.aculo.usは有名なAjaxライブラリです。Jeff Xiong ThoughtWorks勤務。アプリケーション・デベロッパーとして大規模エンタープライズアプリケーションの開発や異種システムの統合に4年の経験をもつ。
Mike Williams 15年の業界経験をもつシニア・デベロッパー。Javaの経験のほか、動的スクリプト言語の熱心なユーザでもある。
Josh Price ThoughtWorks勤務。デベロッパー。JavaとJ2EEによる8年間のエンタープライズシステム構築経験がある。
原文はこちらです:http://www.infoq.com/articles/testing-ajax-selenium
(このArticleは2006年10月2日にリリースされました)
現在のRIAアーキテクチャにおいて、クライアント/サーバーの通信は重要な位置を占めています。本稿では、James WardとShashank TiwariがアドビによるオープンソースのBlazeDSメッセージングサーバーの世界へ飛び込みます。
ウィルス対策ソフトや情報漏えい防止用のソフトは、いわば影の存在です。ユーザの操作性やGUIを工夫する以上に、いかに目立たない存在となるかにその技術を注ぎ込んでいます。ここでは日立ソフトが開発した「秘文」の事例を紹介します。
Google Chartは、チャートを作成するためのWebサービスです。本稿では、Google Chartのインターフェースと、Rubyコードから簡単にチャートを生成することができるgchartrbライブラリの説明をします。
全二回からなるこの記事では、ダイナミックビジネスアプリケーション(Dynamic Business Applications:DBAs)の開発についての全体的な眺望を、アーキテクチャと方法論の観点から見ていくことになります。我々のゴールは、「ビジネスの変化や、その他に必要とされる変更に対して、いかにして容易に適応できるアプリケーションを構築していくか」を導きだすことです。
本稿では、Adrien Louis氏がESBベースのSOAに対する2つの接続形態についての賛否について説明しています。その2つとは、会社での単一のESB対「部門毎」に相互接続するESBによるシステムです。
誕生から2年を経てCometは「何が出来るのか」という議論から、「いかに実現するか」という議論に関心が移ってきたように見えます。そこで本稿では同じくJavaOneで数多く取り上げられたNetBeans 6.1とGlassFish v3を使いながら、サンプルを交えてCometを解説していく事にします。
この記事では、WSS3とMOSS 2007に難しい設定など一切せず、すぐに利用可能なWebサービスと、Javaと.NETからそのWebサービスを消費する方法に目を向けます。
この記事の始まりは、知的で思慮深い人たちの魅力的なグループが食事会を終えて話をしているところです。話はレトロスペクティブ(振り返り)プロセスの要であるプライムディレクティブ(最初の指示)に及んでいます。
No comments
返信