Archive for the '技術' Category

Selenium RCでTestRunnerのデフォルトの速度を設定する

Selenium RCを使ってテストを自動実行させるときに、ブラウザが自動的に起動してTestRunnerが実行されるのですが、この時、コントロールパネルにある速度調整のスライダーは、一番左にあって最速の設定になってしまいます。
これはバグだと思うのですが、Selenium IDEやCoreで実行するとすべて正常終了するのに、RCで実行するとwaitFor*コマンド等であるエレメントが認識されるまで待機するようにしてあげても、そのエレメントにアクセスした時点でそのエレメントが存在しないというようなエラーが発生する場合があります。この場合、TestRunnerの速度スライダーを手動で少し遅くしてあげれば、大抵の場合は、うまく通るようになるようです。それでも通らない場合は、本当にAjax等で何かを待たないといけない場合なので、waitFor*を入れてあげる必要があります。
で、毎回このスライダーを動かす手動操作が入るのは面倒なので、その速度を指定してやりたいのですが、どうも現時点では、RCのコマンドラインパラメータでは指定できないようです。リファレンスには、setSpeedというコマンドが使えるように書いてあるのですが、これを指定するとIDEでもRCでもエラーになってそこで止まってしまいます。さて、どうしようと思い、現時点では直接ソースをいじるしかないと思い、それでやっつけてしまったので、とりあえずメモしておきます。尚、これはSeleneseではなく、JavaやPerl等のプログラミング言語インターフェイスを介せば簡単にsetSpeed相当のコールが使えるはずです。
以下、手順です(jarコマンドを使うのでJDKが必要):
1. まず、selenium-server.jarファイルからcore/scripts/selenium-testrunner.jsというファイルを取り出します。
jar -xvf selenium-server.jar /core/scripts/selenium-testrunner.js
2. runIntervalという変数に値を代入している箇所を見つけます。このメモを書いている時点では、次の2箇所です。
2-1.
変更前:
var runInterval = 0;
変更後:
var runInterval = 100;
2-2.
変更前:
this.runInterval = 0;
変更後:
this.runInterval = 100;
この修正だけでも一応速度は落ちますが、スライダーの表示が左端にあるままなので、ちょっと気持ち悪いので、下記の場所を修正します(他にもオプションがあります。使用しているのはこちら)。
変更前:

objectExtend(HtmlTestRunnerControlPanel.prototype, {
initialize: function() {
this._acquireQueryString();
this.runInterval = 100;

this.speedController = new Control.Slider(‘speedHandle’, ‘speedTrack’, {
range: $R(0, 1000),
onSlide: fnBindAsEventListener(this.setRunInterval, this),
onChange: fnBindAsEventListener(this.setRunInterval, this)
});

this._parseQueryParameter();
},

変更後:

objectExtend(HtmlTestRunnerControlPanel.prototype, {
initialize: function() {
this._acquireQueryString();

this.runInterval = 100;

this.speedController = new Control.Slider(‘speedHandle’, ‘speedTrack’, {
range: $R(0, 1000),
sliderValue: 100,
onSlide: fnBindAsEventListener(this.setRunInterval, this),
onChange: fnBindAsEventListener(this.setRunInterval, this)
});

this._parseQueryParameter();
},

3. [...]

Seleniumでコメントを入れる方法

Selenium IDEでは、Commentを挿入できますが、これはHTMLの通常のコメントとして保存されるだけで、TestRunnerでテストを実行するときには、当然のことながら表示されません。XPathやDOMオブジェクトでテストターゲットを指定してしまうとテストを作成したときには、何をチェックしているか明白なつもりでも少し時間が経過してから見直すと一見しただけでは一体何をチェックしていたのかわからにくくなってしまうことはよくありそうです。
Seleniumのユーザフォーラムをチェックしていたら、やはりその話題とその解決案が下記に記されていました。
Comment command
ちょっとスレッドが長いので要約・整理すると、

Selenium IDEではコメントを挿入すると通常のHTMLコメントとしてしか保存しない。読み込むときも通常のHTMLコメントをテストのコメントとして表示する。
TestRunnerでは、カラムが3つより少ない行は無視する。
これらの性質を利用して、TestRunnerを走らせるときにHTMLのコメントをカラムが1つだけの行に変換して挿入してやれば、テスト実行時や結果ファイルでもIDEで入れたコメントが表に出る。

ということで、下記のスクリプトをSelenium Coreのuser-extensions.js(現在使用していなければこの名前で保存)に追加してやれば、上記のようにIDEで入れたコメントがTestRunnerでも表示されるようになります。Selenium RCの場合は、コマンドラインの引数でユーザエクステンションファイルを指定してやれば、同様の結果を得られます。
フォーラムで指摘されていた修正も反映済みです。
user-extensions.zip

Selenium と使うと便利なユーティリティ

またSeleniumの話ですが、前のエントリでも書いたとおり、TDDで使う分にはソース側を変えれば良いので特に問題にはならないのですが、既存のWebアプリに対してリグレッションテストを作成しようとすると今のバージョンでは、結構致命的になりかねない制限があります。
リファレンスに次のように書いてあります。
In some cases, Selenium will be unable to intercept a call to window.open (if the call occurs during or before the “onLoad” event, for example).
今私がテストを作成しているアプリケーションも結構古いもので、ページの切り替え時にJavascriptのAlertでポップアップウィンドウを出しているようなのですが、これのOKボタンを押すことが今のSeleniumだとどう転んでも出来ないのです。
でも、そこで手動操作を交えないといけないとなるとかなり魅力半減になってしまうのも事実で、少しの変更でバグが沢山出てしまうようなつくりの悪くなってしまったソースをリグレッションテストを通すために修正するというのも本末転倒のような話になってしまいかねません。
解決方法としては、Selenium RCを使用して.netプログラムにテストを変換して(テストの部分の変換はIDEがほぼ自動的にやってくれます)、Seleniumだけではどうしても手が出ない部分は、C#の力技で無理やり操作してしまうというのが一つの方法ですが、これだと開発者でない人にも何とかテストが作成できるというストーリーから離れていってしまうなあと考えあぐね、何か他の操作自動化するツールと組み合わせてできないかなと思って見つけたのがこれです。
UWSC
これもブラウザ操作等ができるのですが、その辺はSeleniumの方がずっと出来がよいと思いますが、SeleniumがJavascriptベースのために対応できない部分を補完するのには、結構最適な感じ(通常のWindowsプログラムなのでJavascriptの部分でかち合うことはない)です。私の場合、何とかこのユーティリティを組み合わせることで、Seleniumで閉じれなかったポップアップを閉じれるようになり、ほぼテストを自動化することに成功しました。このツールはオープンソースではありませんが、無償で提供してくださっているので大変ありがたいです。WindowsのAPIやCOM呼び出しもできるので頑張ればかなり強力なツールだと思います。ちょっと困った問題が、UIが全部日本語なんですよね。こちらの人にこれを使えとはちょっと言えないので、何か同等のツールを探さないといけないかも知れません。WinBatchなんかも使えるのかも知れませんが有料ですし、何かいいツールをご存知の方はぜひ教えてください。
とりあえず、Seleniumでのテスト自動化をしようとして、JavascriptのアラートウィンドウをSeleniumで閉じれなくて使用を断念しそうな方は、大いに試す価値があると思います。

Selenium は使えそう

食べ物の話題ばかりだとちょっと知性を疑われかねないので、一応本職関連の話をたまには書きます。
先週、遅ればせながらSeleniumというWebサイトのテスト自動化ツールがあるのを知って、今仕事で移行作業中のサイトの動的コンテンツのRegression Test Suiteを作成してみました。
Selenium IDEというもののおかげで非常にテストケースを作成しやすくなっていることがわかり、オープンソースやっぱすごいなと感心した後、その作者は日本の方であることを知り、さらに感心。インターネットの進歩のおかげで国際的なコラボレーションの垣根は秒進分歩で低くなって行っていることを改めて実感しました。
で、大方、Firefoxで通るようになったテストケースをIEで実行してみると通らないのが一杯出てきて、調べてみると、VerifyTextPresentは特に、表組みを使ってレイアウトされている場合は、IEだと個別にしか認識できないようで、<td>タグに対応して1つのテストケースを作成する必要があるみたい。Firefoxだと行単位で1つのテキストとしてみなしてくれるのだが、これはどちらがいいとは言えないので、仕方ないところか。仕方ないので、表の一つ一つの要素単位で検証するようにテストケースのコマンドを分割して両ブラウザでOKとなった。
しかし、なぜか下記のようなxpath表記はIEだとfalseになってしまう場合があり、今のところ理由は不明。HTMLのできが悪いのかも知れませんが。
<tr>
<td>verifyElementPresent</td>
<td>//h1/IMG[@src='images/image3.gif']</td>
<td></td>
</tr>
それと、これは今のところ制限らしいが、target=_blankでオープンされたウィンドウはSelectWindowできない。テストドリブン開発では、テストを先に書いてから開発にかかるので、こういう制限は問題にならないのはわかるが、既に開発されたサイトに対して適用するテストを書こうとするとこの辺は結構引っかかってしまう感じがする。
それにしても、まだまだバージョン0.8台ですから将来が期待できそうなツールです。今のままでも、ちょっとしたテストならこれで十分いけそうな感じがします。
とりあえず3日程度はまって使ってみた感想でした。

Better Gmail

Better Gmail(Gmailを便利にするスクリプトを集めてくれたもの)というのがあるのを知って試してみました。結構便利ですね。
でも、ラベルの色付けがFirefoxのタブを一旦クローズしたりしないと変更が反映されなかったりで、今ひとつ動作が釈然としない部分がありますね。というか私がGreasemonkeyスクリプトの動きをきちんと理解していないのかも知れませんが。
でも、使い勝手が少しでも向上することは間違いないです。GMailを使っている人は使う価値ありと思います。

SharpDevelop 2.1

昨日のエントリでSharpDevelopのv1.1の使用感を書いてv2.1を試しているところと書いた直後なのだが、デバッグ機能に「プロセスにアタッチ」がないということに気がついた。で、よく本家のサイトを読んでみるとasp.netは本気でサポートしていないということらしい(というか優先順位を下げているという感じだが)。「プロセスにアタッチ」も中間ぐらいの優先順位で作業中のようなのでいつかは入ると思うが、しばらくは難しそうですね。
なので、結局はDbgCLR.exe(.NET SDKに付属のデバッガ)を起動して、aspnet_wp.exe(ASP.NETのワーカプロセス)にアタッチしてやる方法でデバッグするか、cassiniという.NETを使って書かれた簡易サーバをかませてIIS直でなく間接的に(擬似的に)デバッグするという手を使うことになるようです。
clrdbg.exeもなかなかしっかりしたデバッガなのでそんなに文句はないのですが、SharpDevelopのデバッガも立派なものなので、IDEとしては統合環境内で閉じたデバッグができないのはASP.NET向けの開発環境としては、ちょっと魅力薄となってしまうのは否めない感じですね。
Tool->Optionからは、まだUIの言語に日本語の選択肢は入っていないようで(まだ、別途日本語版サイトから入れる形なのかな?)、日本語GUIはまだ試していません。でも、エディタはShift_JISを選択してちゃんと表示編集ができて、この辺はv1.1よりはぐっとよくなった感じ。でも、IMEの入力はあまりきちんと制御できていないようで、日本語を入力するときは少し違和感あり。これも何か回避策はあるのかも知れないけど、ソースに日本語を入力することは、とりあえずそんなに必要ないのでまた後日調べます。
と、とりあえず1日使ってみての感想でした。

Windows環境でも開発環境はだいぶ無料化の傾向にある?

別のエントリで、Windows環境で個人で開発環境を整えるには高くつきすぎると書いたのだが、Microsoftも開発ツールは無料版をずい分提供していることに気がついた。でもよーく機能制限やらを見ると相変わらずせこく有料版とは差別化してあって、やはり本格的に使おうとすると無料版ではちときつそうな感じ。こんなに色々な版を作ったり宣伝したりするためにかけている費用を削って有料版の値段を下げてしまった方がMicrosoftにとってもユーザにとっても得だと思うのだが、そうできなくなっているところに今のMicrosoft社の構造的な問題が見えるような気がする。
でも、少なくとも小規模なプログラム開発であれば、それなりに開発環境がそろうというのは、昔に比べれば大きな進歩ではある。
と思って検索してみると色々とオープンソースの開発環境があるのに今さら気付いた。
SharpDevelop
SharpDevelopというのはオープンソースの.net用のIDEということで、これはすごいと思って早速使ってみた。とりあえず作業していたプログラムが.net 1.0で開発されたものだったので、SharpDevelop 1.1というのを試してみた。UIは日本語も選択できるようになっているが、日本語を選択すると異様に不安定になるので(例外エラー頻発でとても使い物にならなかった。使ったマシンがかなり非力だったせいもあると思うが、それを加味してもちょっとという感じ)、英語UIのまま使用した。エディタで使用する文字エンコードを指定できるので、英語UIでも日本語ファイルの表示は可能。しかし、編集しようとするとちょっとカーソル位置が変になったりで問題ありという 感じでやはり本格的な使用には堪えられそうにはなかった。1.1は2006年の2月で止まっているようなので、仕方ないかも。で、よく見てみると2.0でも1.1はサポートしているので、最初から2.1を試せばよかった。
で、2.1を早速ダウンロードして試してみる。1.1よりはだいぶ安定している様子だが、やはりたまに例外エラーは発生してやや不安にはさせる。もう少し使ってみてから感想を書きたいと思う。
今日はこの辺まで。

Apache 2.x用のmod_fcgi.dllは全滅

2006/11/28にWindows環境でApache 2.2をインストールしてRuby on Railsをfcgiで動かそうとしていたときに、結局はApache 2.2は2.0からもヘッダ定義等が変更されて、2.0用のモジュールはバイナリ互換ではなくなってしまったのが原因で四苦八苦していたときの話し。
せっかく書き留めていたので、一応参考記録として残しておこうと思います。
そもそも、モジュールは下記の場所からダウンロードしたのだが、今日(2/23)確認してみると2.2用のDLLがあるので、今はそれを使えば問題ないんでしょう(試してません)。
http://www.apachelounge.com/download/
やはりオープンソースはソースからコンパイルが基本なのかなと再確認。Windows環境でバイナリが流通の基本というのに慣らされてしまっていることを改めて痛感。開発者のはしくれとしては、やはりLinux環境でソースからコンパイルするという基本に戻るのが正解かなとも思いますが... やっぱ、個人でWindowsの開発環境を整備するのはコストが結構かかりすぎですよね。
============
fcgidはApache 2.2用と書いてあったがなぜか動作せず。Loadmoduleではこけなくなったが、Apacheでcrashしてしまう模様。
gem install fcgi
をやると

Building native extensions. This could take a while…
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Provided configuration options:
–with-opt-dir
–without-opt-dir
–with-opt-include
–without-opt-include=${opt-dir}/include
–with-opt-lib
–without-opt-lib=${opt-dir}/lib
–with-make-prog
–without-make-prog
–srcdir=.
–curdir
–ruby=/usr/bin/ruby1.8
–with-fcgi-dir
–without-fcgi-dir
–with-fcgi-include=${fcgi-dir}/include
–with-fcgi-lib=${fcgi-dir}/lib
ERROR: While executing gem … (RuntimeError)
ERROR: Failed [...]

Media Semantics 社の Character Builder

ちょっと使う機会があったのでせっかくなので一応記録。
Media Semantics 社のホームページからCharacter Builder 3.0.152をダウンロードしてインストール。
喋らせるのにText To Speech (TTS)のランタイムが必要というので、同じダウンロードページから Microsoft Mike and Mary もダウンロードしてインストール。
日本語をしゃべらせようとしたが、喋らせるテキストに日本語は入力できてもまったく認識せず。Microsoftの日本語TTSもインストールしてみたがどうもうまく認識してくれない。
何かまだ足らないんだろうがいま特に必要というわけでもないので、またの機会に調べようかと思う。
で、結局英語TTSにローマ字等で工夫して外人が日本語を話すように挨拶程度だけ喋らせたのがこれ。手振りなども入れられるのだが、どうもバグなのか指定した箇所で指定したジェスチャーをしないことが多いのはちょっとがっかり。
下記のリンクをクリックすると一言二言だけ挨拶します。こういうアニメーションがFLASH等を知らなくても簡単に作成できてしまうのはすごい。
Character Builderのテストファイル

Pages (4): « First ... « 1 2 3 [4]