Canoo WebTest


作成されるテスト結果 - 以下のようなHTMLが作成されます。

 
 
 

Canoo WebTestとは

オープンソースのWeb自動テストツール

スイスのCanoo社が開発しているオープンソースのWeb自動テストツールです。別途ブラウザーを立ち上げるわけではなく、内部でHtmlUnitを呼び出してテストしますので比較的高速に動作します。
一応、XMLファイルを編集するだけでテストを作成できますので一応プログラム言語に精通していなくてもテストを作成実行が可能です。

どのようなユーザー向きか
Ant/Mavenが好き。Groovy言語が得意。HtmlUnitを使ってテストしている人
XML入力に慣れてないと不向きかもしれません。動作が速いのでチェック用にも向いています。
Firefoxが大好きな人は、Seleniumというテストツールがあります。

Antベース

Canoo WebTestの大きな特徴の1つがテストファイルがAnt形式のファイルであるという所です。

googleWebTest.xml

<project default="test">
<target name="test">
<webtest name="check that WebTest is Google's top 'WebTest' result">
<config browser="ff3"/> 
<invoke url="http://www.google.com/ncr" description="Go to Google (in English)"/>
<verifyTitle text="Google" />
<setInputField name="q" value="WebTest" />
<clickButton label="I'm Feeling Lucky" />
<verifyTitle text="Canoo WebTest" />
</webtest>
</target>
</project>
なので、Antが動く環境ならば、パスを通せば呼び出すことでき、またAntの各種機能を使ってテストの準備やテスト後の処理も行えます。

また、Groovy言語でもテストを書くことができます。

内部エンジンはHtmlUnit

内部エンジンでHtmlUnitを使っていますので、HtmlUnitで直接プログラムを書くよりは手間が省ける場合もあります。
Canoo社は、HtmlUnitの開発サイトのホスティングもしているぐらいなので、親和性は高いのではと思います。
一応、HtmlUnitはJavaScriptが動きますので(最新版のGWTとかは無理です) 動的なWebページのテストにも使えることがあります。


初めて使ってみる

インストール

Java Runtimeは当然としてAntは含まれていますので別に必要ありません。
2010年2月では最新安定版は、3.0(HtmlUnit 2.4)ですが、開発途中の最新版はr1802(HtmlUnit 2.7 snapshot)内包していました。
ダウンロードページからダウンロードできます。JavaScript使わないなら3.0で使うならたまに動くことを期待して開発版を使うのはどうでしょうか。

ダウンロードしたらファイルを展開して好きな場所に置きます。
私は、C:\java\lib\canoo3.0 としました。
そして、Windowsでしたら、環境設定 PathにC:\java\lib\canoo3.0\bin を通します。
あとは、コマンドプロンプトから、webtestとし実行したら

Buildfile: build.xml does not exist!
Build faild

と出るならインストールは成功です。

動かしてみる


動作させるには、テストスクリプトなどを書かないといけませんが、デフォルトのプロジェクトを作ってくれるコマンドがありますので、それを実行します。
実行した場所の下に指定したプロジェクト名でフォルダーができます。

C:\java\lib\canoo3.0\test> webtest -f c:\java\lib\canoo3.0\webtest.xml wt.createProject

すると、Project名を入れる画面になるので、何か(Test1)とか入れます。
するとTest1とかフォルダーができます。

 ちなみに、このコマンドはおそらく、テスト作成する度に実行しますので、batファイルを作って置いてテスト用のフォルダーに入れて置くと便利ですよ。
ただ、初期だといらないtestが多いので、別のテストをフォルダーごとコピーした方が楽なこともあります。


あとは、作成したTest1とかに移動して、webtestと入力するとテストが実行されブラウザーに結果が表示されます。

C:\java\lib\canoo3.0\test\Test1> webtest



最初はこんな感じで、最初の Google's top 'WebTest' result
とかも以下のようなエラーでテストが失敗していると思います。

TypeError: Cannot find function setEndPoint in object [object].

これは、デフォルトだとブラウザーがIE6なのが原因です。configにbrowser指定でff3(FireFox3)とかすると多少ましになります。(各テストごとに指定します)

<project default="test">
<target name="test">
<webtest name="check that WebTest is Google's top 'WebTest' result">
<config browser="ff3"/> 
<invoke url="http://www.google.com/ncr" description="Go to Google (in English)"/>
<verifyTitle text="Google" />
<setInputField name="q" value="WebTest" />
<clickButton label="I'm Feeling Lucky" />
<verifyTitle text="Canoo WebTest" />
</webtest>
</target>
</project>

これでも、以下のようなエラーメッセージとともに、最初のテスト失敗することでしょう。

Details
expected value Canoo WebTest
actual value WebTest - Google Search 

そこで、今度は、以下のようにしてJavaScriptを無効にします。すると最初のテストは通るようになると思います。

<project default="test">
<target name="test">
<webtest name="check that WebTest is Google's top 'WebTest' result">
<enableJavaScript enable="false"/>
<invoke url="http://www.google.com/ncr" description="Go to Google (in English)"/>
<verifyTitle text="Google" />
<setInputField name="q" value="WebTest" />
<clickButton label="I'm Feeling Lucky" />
<verifyTitle text="Canoo WebTest" />
</webtest>
</target>
</project>


あとは、マニュアルページのCore Stepsとかを見ながら自分のテストを作っていきます。


Canoo WebTestとJavaScript

JavaScriptはFF3の方が安定してるぽいです。
また、<enableJavaScript enable="false"/> で無効にすることもでき、テストの途中で、<enableJavaScript enable="true"/>にすることもできるみたいです。
(ただし、Script有効でページを読み込むとそれが原因で、途中のテストでエラー出ることがありました)

また、スクリプトエラー無視できますので、微妙にテスト通らないところはこれで回避するのもいいと思います。
<config>
<option name="ThrowExceptionOnScriptError" value="false"/>
</config>

動作したJavaScript

内部エンジンで使用しているJavaScriptは優秀なので単純なスクリプトならどのブラウザー設定でも動きます。
  • 戻る history.back() 
  • Actionを切り替えてSubmitする。forms[0].action='other_action';forms[0].submit()
  • hiddenの値を変更する

GWT(Google Web Toolkit)

対応していないので当然なのですが、最新版は動きません。(動くこともありますが)
GWTを含むコードはJavaScriptを無効にして、テストした方がいいかもしれません。
ただ、ブラウザー設定をFF3とかにするとかなり動くので、動作検証をすすめていきたいです。
(HttpUnit2.7でGWT2.0のテストパスしたという記述もありましたので)

基本的に、<sleeep>とかで読み込みを待たないと、読み終わる前に実行してしまい動作結果が変わることがあります。
動的に作成したフィールドはJavaScript offだと当然見えないので、既存のフィールドをWrapするようにGWTを改造するのがいいかもしれません。



CanooWebTestで使えるXPath

xpathを使うと、idやnameのないアイテムを簡単に選択できます。

       XPath
 clickLink  <a href="link.page"><img></a>  imgを含むa リンク  //a[img]
 clickLink  <a href="link.page"><img src='test.png'/></a>  img srcがtest.pngを含むa リンク  //a[img[@src='test.png']]
 clickButton  <input type="image"/>  typeがimageなインプット  //input[@type='image']
 clickButton  <input type="image" src="test.png"/>  typeがimageでsrcがtest.pngなインプット  //input[@type='image' and @src='test.png']
 clickButton  <button>hello</button>  テキストがhelloなボタン  //button[text()='hello']
 clickButton  <form action="edit_kaiin.jsp" method="post">
 <input type="hidden" name="_type" value="userInfo"/>
 <input type="image" src="images/submit.gif">
 </form>
 同フォーム中のhiddenの値がuserInfoのimageボタン  //form[input[@type='hidden' and @value='userInfo']]/input[@type='image']


その他メモ

hiddenの値の変更の仕方

<setInputField>だと
No suitable form found having field named とエラーが出ます。
<forceHiddenInputField>を使います。

日本語について

<verifyTitle>など比較する分には、問題なく使えました。
ただし、<setInputField>で指定した場合、化けました。
(ただし、私のWebアプリ側の受け取りの問題の可能性も否定できません)

パーラム付きのURL場合

XMLファイルなので、&を記述するとおかしくなります。
&amp;と記述します。

<invoke url="http://localhost/search?name=show&amp;value=basica"/>

XML編集用のDTDファイルの場所

別途 doc.zip  をダウンローのうえ、中のselftests/config の中にWebTest.dtdがある。
コピーしてDoctype宣言のProject.dtdと書き換えたらXML Editorで使えるようになります。(Ant Editorだと効きません)

厳格なDTDは記述が面倒?

サーバー名を別記述にする

サーバー名を手軽に置き換えたい場合、以下のようにAntの機能のPropertyを使って設定したものを、${プロパティー名}という方式で呼び出せます。

<property name="server" value="localhost:8080" />

<invoke url="http://${server}/search?name=show"/>
<invoke url="http://${server}/delate"/>

その他のStepの使い方など

公式ページの

その他

指定可能なブラウザーコンフィグ
IE6,IE7,FF2,FF3

不具合情報はここで見つかります。

テストサンプル


Comments