2008-12-30

仕事納め

だいぶご無沙汰しております。

さて、弊社は本日を持ちまして2008年の営業を終了するわけですが、
個人的に振り返ってみると、本当にアッという間の1年でした。

2007年夏頃から、現在の上司である
弊社取締役と会合を重ね、転職を決意し、
2007年9月過ぎに弊社代表取締役と初対面。

2008年初日から出社し(当時は四谷でした)、
気付けば2008年も終了です。

年初3名だった社員も、6名になり、
バイトも6,7人だったのが12名と増えています。

仕事も本当に色々と面白いことをしていて、
新しいことを経験し、焦り、てんぱりと色々ありましたが、
一言で言えば、非常に中身の濃い1年でした。
(簡単にまとめすぎましたか?)

僕は常に、自分の人生は、自分の判断で、責任をもって、
明るく楽しいものにする、したいという”想い”があるので、
今年の1年間を振り返ると、うまく判断できたのかなと自画自賛したくなったりします。

と、よくわからない流れになってしまいましたが、
2008年もあと二日。
師走の忙しい時期に、事故などに合われないよう、
皆様お気をつけて、よいお年をお迎えください。

弊社、2009年は更にスピード感をもって、
不景気など吹き飛ばして、頑張っていく所存でございますので、
今後ともご指導の程、宜しくお願い申し上げます。

2008-12-25

4.seleniumを使ってみよう その③

短期集中seleniumシリーズの第6回目です。
最終回の今回は、便利な使い方を紹介します。

4.6開発言語を使うメリット

テストコードを記述するときに、javaなどの開発言語を用いると、HTMLでは書けなかったような複雑なテスト項目にも、柔軟に対応したテストコードを書くことができます。

例1.繰り返し
20行あるはずのtable要素が、本当に20行表示されているかをチェックする場合、HTMLでテストコードを書くとなると、

assertElementPresent
//table[@id='test']//tr[1]



assertElementPresent
//table[@id='test']//tr[2]



・・・

と20行分書かなければなりませんが、開発言語を用いると、

for(int i=0;i<20;i++)
{
assertTrue(selenium.isElementPresent(“//table[@id='test']//tr[”+Integer.toString(i)+”]”));
}

とコンパクトにテストコードをまとめることができます。


例2.条件分岐
例えば、selenium.isTextPresent(“○×○×”)の戻り値はbooleanです。それなので、
if(selenium.isTextPresent(“○×○×”))
{
assertFalse(selenium.isElementPresent(“××××”));
}
のように、テストの条件分岐も書けます。

例3.変数の活用
テストに変数を取り入れることで動的なテストコードを書くことができます。
ページ遷移後のデータと遷移前のページのデータを比較したいときや、データの表示件数のような仕様が変わりそうな数値など、変数を用いると、テストコードを書きやすくなります。

例4.共通処理
あるページへログインするために、メールアドレスとパスワードの入力が必要だったとします。当然、ログインするユーザーによってメールアドレスとパスワードは違いますが、そのほかの処理、(ログインページを開く→メールアドレスとパスワードの入力をする→ログインボタンを押す)は共通処理になります。
同じ操作をしているのに、そのつど、IDEで操作し記録したものをコピー&ペーストするのは非効率です。
開発言語を使っているのならば、ログイン関数を用意してもっとすっきり書くことができます。

これら例1~4で説明したことを具体的に使って書いたテストコードが下です。
これはとあるソーシャルネットワーキングサービスの日記へのコメント一覧表示機能のテストです。コメント一覧に表示されるコメントの数は50 件、一覧に表示されるコメントの長さは20文字までという仕様のものを、リストで本当に50件、20文字で表示されているかをテストしています。

図7.テストする新着コメント一覧の画面



4.7デバッグ
テストコードを書く人ならば、エラーや失敗が出て、seleniumが中断されてしまった場合、
その原因が本当にテストしているWebページのエラーなのか、または、書いたテストコードが間違っているのかを確認しなければなりません。

4.7.1失敗とエラー
seleniumRCではテストがうまくいかなかったときは、二種類の表示があります。エラーと失敗です。
大まかな違いは、

  • エラー:テストコードに書いてあるとおりのテストをしようとしましたが、”何らかの問題”により、テストそのものを実行できませんでした。
  • 失敗:テストコードに書いてあるとおりのテストをしましたが、テストをした結果、期待した結果が得られませんでした。

です。

”何らかの問題”というのは例えば、locator名が間違っていて、seleniumRCがどこのテストをすればいいのかわからなくなっていることや、コマンドのつづり間違いで、何のテストをしたらいいのかわからないとうことがありえます。


4.7.2エラーor失敗が出てしまったら?

テストを行って、エラーor失敗が出てしまったら、赤枠の障害トレースを確認します。
そこにエラーor失敗の内容が出力され、ダブルクリックをすると、問題のあったテストコード部分に飛んでくれます。
テストコードが間違っているのか、Webアプリケーションの間違いなのかをここで確認しましょう。

図7を見てください。障害トレースの一番下の行をダブルクリックすると、エラーが起きたコマンドをフォーカスしてくれます。


図8.どこでエラーが起こっているのか



しかし、これではエラーが起こっていることがわかるだけで、どうして、エラーになっているかがわかりません。エラーの原因は一番上の行に書いてあります。図9参照。

今回の場合、「コメント削除ログ」というリンクが見つからないというエラーが起きています。



図9.エラーの原因

2008-12-23

後1週間

随分更新がご無沙汰してました。

後約1週間で2008も終わりですが、最近お客様先で導入作業をやっている事があります。
たまにソースコードを読んだり、動かして見るのはやはり楽しいものです。
後少しで導入作業も完了し、来月のどこかではアナウンス出来るかも知れませんのでご期待下さい。

最近、初めての新規採用の面接をやっております。
こんな会社ですが、かなりの数のご応募を頂き、全員と面談出来ず、また、判断するのも大変でした。
木曜日に社員会議で最終判断し、新入社員を仮採用する予定です。
縁故採用以外は初めてですので、非常に楽しみです。

また、年始までの宿題が上がってしまい、ちょっと正月も全然休めそうに無い事が判明しました。
頑張らねば。

2008-12-19

4.seleniumを使ってみよう その②

短期集中seleniumシリーズの第5回目です。
この章では前回に引き続き、実際にseleniumを使ってみます。

4.4seleniumIDEの検索ボタン

seleniumIDEでテストコードを書くと、先に述べたとおり、複雑なxpathでlocatorの指定をされがちです。

そこで、自分なりに適宜書き換えることをおすすめします。
ですが、そのときに、間違ったlocatorを書いてしまいますと、実際にテストを実行したときに「ElementLocator Not Found」と表示され、テストが失敗してします。

間違ったlocator名を指定しないために利用するといいのが、seleniumIDEの「検索」ボタンです。

フォーマットをHTMLにし、「テーブル」タブを選択します。
その後、locatorが表示されているはずのページがブラウザ上で開かれていることを確認します。
seleniumIDEの「対象」フォームに確かめたいlocator名を入力し、「検索」ボタンを押します。図4.参照。




図4.SeleniumIDEの検索ボタン



もしも、指定したlocator名が間違っていて存在しない場合には図4のように、赤文字でエラーがでます。
逆に、指定したlocator名が正しくて存在している場合には、ブラウザ上で、指定したlocatorが緑色に点滅します。

テストを実行し、失敗してしまって「ElementLocator Not Found」という表示が出てしまった場合、このようにしてlocator名が間違っていないか、WebページのHTMLソースと比較しながら確認してみてください。

4.5assertとverify

seleniumのAssertionコマンドに、assertとverifyの二種類の検証コマンドがあります。
コマンド名はassert~かverify~で始まります。二つのコマンドの違いは、assertの場合は検証がうまく行われなかったの際にテストを中止するのに対して、verifyの場合はテストをそのまま続行することです。
しかし、javaでverifyコマンドを利用しようとすると「そんなコマンドはない」と怒られてしまうので使えないようです。
verifyコマンドが使えないので、一つのメソッドにあれやこれやとテストを詰め込むのは効率的ではありません。


例えば、下に示す項目をテストしたいとします。

  • 正しいユーザアカウントと正しいパスワードでログインしようとした場合・・・①
  • 正しいユーザアカウントと間違ったパスワードでログインしようとした場合・・・②
  • 間違ったユーザアカウントと正しいパスワードでログインしようとした場合・・・③
  • 間違ったユーザアカウントと間違ったパスワードでログインしようとした場合・・・④

このような場合、下の図5のようにテスト項目を書くことは賢明ではありません。

というのも、下の図5で、テスト項目の①のテスト2のassertが失敗してしまった場合、test01というテストメソッドから抜けてしまいますので、その他の②~④のテストは実行されません。図6のようにテストメソッドを増やせば、テスト2で失敗しても、次のメソッドへ飛んで、②のテストから先のテストも実行してくれます。
























テストメソッドは闇雲にわけるのではなく、ある程度意味を持つ項目ごとに分けるとデバッグしやすいです。

2008-12-16

4.seleniumを使ってみよう その①

短期集中seleniumシリーズの第4回目です。
この章では実際にseleniumを使ってみます。
今回使用したseleniumRCとseleniumIDEのバージョンは以下のとおりです。


selenium RC-Version 0.9.2
seleniumIDE-Version 1.0 Beta 2


4.1seleniumでテストコードを書く
seleniumCoreやseleniumRCだけを使って「さあ、テストコードを書いてみて」と言われると、初めてseleniumを使う人は戸惑ってしまうかもしれません。しかし、seleniumIDEを使えばその問題は解決できます。

seleniumIDEはテストケースを簡単に作成し、編集することができるので、プログラミングの知識がない人でもテストコードを記述することができます。

seleniumIDEを起動した上で、Webブラウザ上でテストを行いたい操作をすると、seleniumIDEが自動でseleniumCoreやseleniumRCのコードを生成・記録してくれます。

図1を見てください。

例えば、テストしたいページを開くと、「open /index.html/」、ページの「サービス」をクリックすると、「clickAndwait /link=サービス/」が自動で記録されているのがわかると思います。



図1.seleniumIDEで操作を記録する



seleniumIDEを起動してから、ブラウザ上で右クリックをすると、いろいろなコマンドが表示されます。
図2参照。




図2.右クリックをする



一通りの操作が終わったあと、seleniumIDEの「ソース」タブをクリックすると、HTMLで書かれたテストコードが表示されます。

今回はjava言語でテストコードを書いていきたいので、フォーマットをjavaに変えます。
「オプション→フォーマット」から、使用する言語を選択できます。
図3.参照。




図3.使用する言語の変更



あとはこのコードをEclipseの適切なテストケースファイルにコピー&ペーストすればテストケース作成は終了となります。


4.2おすすめのテストコード作成方法


4.1でseleniumIDEを使うと、とても簡単にテストコードが書けるといいましたが、実はseleniumIDEにも弱点があります。

  • locatorに複雑なxpathを使う癖がある。
  • 非同期処理があるときには、後でpauseやwaitForXxxを追加する必要がある。
  • ブラウザの「戻る」ボタンなどをクリックしても記録してくれない場合がある。


それなのでseleniumIDEだけを頼るということはあまりしないほうがいいと思います。

私がおすすめするテストコードを書く手順は「seleniumIDEでテストの骨格作り→Eclipseにコピー&ペースト→テストコードの修正」です。

4.3locatorの指定について

seleniumのテストコードを書くときのlocatorの指定はできるだけシンプルでわかりやすいほうがいいです。テストコードを複数人で作成し、修正を加えていく場合だと、どこの要素のテストをしているのかがわからないということが起こってしまいます。
また、自分でテストコードを書いた場合でも、seleniumでエラーが起きた場合、どこでエラーが起きているのかを判別するのが、大変になります。

locatorの指定はid名でしてしまうのが、一番シンプルな形です。HTMLでidを振っておけば、
id名だけで指定することができます。

○ assertTrue(selenium.isElementPresent(“id=idName”));
○ assertTrue(selenium.isElementPresent(“idName”));

しかし、idを振ってない要素のテストしなければならないこともありえます。そのような場合xpathを使って要素の指定をします。

xpathを用いると、idを指定するより、テストをするスピードが遅くなります。
また、xpathの指定の仕方もできるだけ簡単なものにしないと、どこのことを言っているのかわかりにくくなってしまいます。

Xpathでの指定例:

  • //div[@class='testdiv']         
    ・・・class名がtestdivというdiv要素
  • //a[contains(@href,'testdiv')]     
    ・・・href属性で、testdivという文字を含んでいるa要素←つまり一部わかっていれば指定ができる。
  • //table[@class='testtable']//tr[1]/td[2]/a
    ・・・class名がtesttableというtable要素の1行2列目にあるa要素

2008-12-12

3.seleniumのセットアップ

短期集中seleniumシリーズの第3回目です。
この章ではseleniumのセットアップに役に立つサイトを紹介します。

以下のサイトを見て、seleniumをセットアップしてみましょう。
ダウンロードとインストールは以下のサイトに詳しく書いてありますので、参考にしてください。


seleniumCore(最新バージョン:Version 0.8.3   2008/11/26現在)

seleniumRC(最新バージョン:Version 1.0 beta 1   2008/11/26現在)

seleniumIDE(最新バージョン:Version 1.0 Beta 2   2008/11/26現在)

2008-12-09

2.seleniumでできること、できないこと

短期集中seleniumシリーズの第2回目です。
今回は、seleniumでできることとできないことを紹介します。

『2.1 seleniumでできること』


さて、さっそくですが、seleniumでどのようなテストができるかを見ていきましょう。
seleniumには3種類のコマンドがあります。それぞれ、Actionコマンド、Assertionコマンド、Accessorコマンドといいます。

Actionコマンドはいわば、人の手のような役割をします。

以下のような動作をします。

  • リンクをクリックをする
  • ボタンをクリックする
  • ブラウザの「戻る」をクリックする
  • 文字列を入力する
  • ラベルを選択する


Assertionコマンドは人の目の役割をします。

表示されている情報が正しいかどうかを検証します。


  • ページのタイトルが正しいか
  • 指定した文字列が(場所に関わらず)正しく表示されているか
  • 表示されるはずのない文字列が本当に表示されていないか
  • 表示されるべきHTMLの要素が表示されているか
  • table要素の何行何列目のところに正しい文字列が表示されているか
  • あるid、class名の要素の表示文字列が、正しく表示されているか
  • 開いているHPのURLが正しいか
  • 選択しているラベルが正しいか
  • 選択しているラジオボタンが正しいか



Accessorコマンドは人の脳の役割をします。

保持してほしい情報を変数に代入し、記憶してくれます。

  • 指定した文字列の値を変数に代入
  • 選択されているラベルの値を変数に代入

これらの他にも、便利なコマンドがたくさんあります。



こうしてみると、seleniumは全てのテスト項目をカバーしている優秀な製品と思えます。

ですが、実はseleniumにもできないことはあるのです。

『2.2seleniumでできないこと』

seleniumはポップアップウィンドウや、フレームを用いたページには対応していません。
ポップアップウィンドウやフレームを用いたページに遷移するとエラーが出てしまい、テストの実行部分がその部分で停止してします。


また、ブラウザによってCSSの読み取り方が異なることから、HP製作において、レイアウトの崩れはよくあることですが、seleniumはレイアウト崩れのようなバグをテストで検出することできません。

その他に、例えばファイルのダウンロードを行って、そのファイルの検証を行うことはできません。


次回は、seleniumのセットアップ方法をご紹介します。

2008-12-03

1.seleniumとは

吉積情報では、テストツールとしてseleniumを用いたテストの自動化を行っています。
社内用の資料として、seleniumの使い方をまとめてみたのですが、
結構役立つものに仕上がったので、この「よしづみぶろぐ」にて、
ご紹介したいと思います。

全6回のシリーズで、今回は、第1回となります。
週2回のペースでアップしていく予定です。
これからseleniumを始めてみようという方に、
ぴったりの内容になっているかと思いますので、
ご期待ください。


『1.seleniumとは』

seleniumとは、Webアプリケーションのテストを自動で行ってくれる便利なツールです。

クリックしたり、入力フォームにデータを入力したりと、今まで人がしなければならなかった面倒な操作をテストコードさえ書いてしまえば、seleniumが自動で実行してくれます。




seleniumは3つのプロダクトから成り立ちます。

  • selenium Core -seleniumの中核機能
  • selenium Remote Control (以下selenium RC)-リモートサーバ対応や開発言語対応
  • selenium IDE -ブラウザ操作の記録とテストコード生成・実行

大まかな説明として、selenium CoreはHTMLでテストコードを記述するもの、seleniumRCはJava、C#、Ruby、PHP、Perl、Python などの開発言語でテストコードを記述するもの、seleniumIDEはFirefoxの拡張機能で、Webブラウザでの操作を記録し、テストコードを自動で生成してくれるものと言えます。


詳細は以下のページをご覧ください。

http://codezine.jp/article/detail/436?p=1

今後の章でseleniumと表記する場合は、selenium Core 、selenium RC、 selenium IDE、の3つを指していることにします。


次回は、seleniumでできることとできないことについて、ご紹介する予定です。

2008-12-01

師走

師走に突入しました。周りは風邪が流行っているようですが、皆様如何でしょうか。

さて、弊社、現在求人広告を出しておりまして。
思ったより応募を頂き、非常に嬉しい限りです。
全員の方にお会いして弊社にマッチする人材かどうか判断したい所ですが、
やむなく絞った形での面接にする他無い、と言う想定外の事態でした。
ちなみに、日本人以外の方からの応募の方が多い状況です。

今月中には1,2名は新しく採用し、新年は7,8名体制で迎えたいです。
今年も残り1ヶ月、ラストスパートを頑張って参ります。