2011年11月2日水曜日

TestLinkとRedmineによるテスト実行管理

 最近数ヶ月の間、新しいプロジェクトでテストケースもテスト管理システムも全くないところから作ることになり、以前のプロジェクトで使っていたExcelに代わる方法を検討した。Excelでもそれなりのことはできていたが、あまりにも自由過ぎて抜けもれがあったり、ミスしたり、といったことがあったので、他の方法をとれないか考えた。

 テスト管理システムで実現したかったことは以下のとおり。 実行管理以外にも、テスト計画やドキュメント管理も含んでいる。タスク管理システムとしては、他に以前のプロジェクトで使っていた影舞や、別プロジェクトで使われていたTracなどもあったが、既に現在のプロジェクトでRedmineを使っていたこともあり、Redmineにしぼって考えた。



 上記のように、TestLinkとRedmineはそれぞれ得意、不得意があり、どうするか迷った。TestLinkで大体のことはできるが、工数管理ができないのはかなり痛い。隠れ機能で工数集計できる、という話もあるようだが、そのために1.8.2を入れる気もしなかった。その他、テストを実行した結果テストケースの修正が必要、といった場合のフィードバックもできないことはないが、Redmineの方が(カスタムフィールドを設けてフラグを立てることで)簡単に運用できそうだった。

 結局両者を併用することにした。当然二重管理になるが、TestLinkはテストケースおよびテスト計画全般の管理、Redmineは個々のビルドに対する実行管理として使い分け、重複する部分を最小限にするよう努めた。(Redmineは実行管理用なので、自動テストはチケットに含めていない。)上記の表で色がついた部分が要求に対してTestLink、Redmineそれぞれの機能を利用したものである。

 何をテストすべきか、仕様変更に伴いどのテストケースを変更すべきかは、TestLinkのキーワードを使って影響範囲を判断することにした。

 「テスト実行時に関連するバグがわかる」ことをRedmineを使って実現しているのは、本来ならTestLinkとRedmineを連携させることでどのテストケースに対してどのようなバグがあるかわかるはずだが、設定がうまくいかなかったので、テスト用のRedmineチケットとバグを関連付けることにしたということ。バグはビルドではなくテストケースと関連付けられていたほうが自然なので、Redmineを使うにしても、TestLinkと連携させたほうがよいと考えている。

 なお、Redmineの使い方は次のようなものである。ビルドごとに前のビルドからのコピーでプロジェクトを作成する。これによってバグとの関連づけやテストケース要修正のフラグが引き継がれる。また、redmine_chartsプラグインを入れて、進捗や工数の予実が見えるようにする。

 この方法でテストを実行してみて、基本的にはうまく回っていたが、いくつか問題点も見えてきた。
  • スケジュールの変更に対応しにくい。テストの実行予定日はRedmineで管理していたが、丸一日分ずらすとか、半日分ずらすとかは手作業になる。また、準備ができていないなどの理由で特定の機能がテストできないなどといった場合も対応が困難。テストケース数が少なかったから何とかなったが、期日ではなく優先度を設定するなど、別の対応が必要になりそう。
  • 担当者による違いが考慮されない。今回はテスト担当者の対象システムに対する知識に違いはなかったためあまり考慮しなくてよかったが、2回目以降のビルドでは、前のビルドでテストを担当した人とそうでない人で違いが出てくる。人による違いが出てこないようなテストドキュメントを作る、というのが正しいとは思うが。
  • テストケースの変更が追いつかない。これは管理システムというより、テストケースの問題。
 今回のテストでは要件管理や一部の集計機能など、TestLinkに備わっていながら使っていないものもあり、あるものをすべて使う必要はないが、機会があれば使ってみたい。

2011年8月28日日曜日

Rails 3でSeleniumを使う

最近開発しているRailsアプリでUIレベルの自動テストも行うことになり、Seleniumの使い方について調べてみた。
(あくまでも投稿時時点での、私が調べられた限りの情報です。)

  1. とりあえず動かす
現時点での最新はSelenium Client Driverが2.5.0。
2.0以降構成が変わっている。
Rubyの場合、gemでインストールするとのこと。
gem install selenium-webdriver 
でインストールできる。

以前少し調べたときは、これとは別にサーバ側のインストールが必要だったはず。ダウンロードのページにはSelenium Serverがしっかり載っているので、どこかでサーバの設定をするのだろうと思ったが、サンプルコード(例えばこのチュートリアル)を見たところ全くサーバ設定に該当するようなコードがない。

後でわかったが、Selenium Serverが必要なのはリモートPCでテストする場合などだけみたい。
私のところの場合、開発はCentOS(仮想マシン)で行う一方、IE8対応をテストするためWindowsマシン上で動かさないといけないから、結局必要だということになった。

新しい構成のSeleniumを使うとなると、WebratよりCapybaraのほうがよさそうなので、Capybaraを入れる。インストールはSelenium Client Driverと同様にgemで。
gem install capybara
チュートリアルにしたがってRSpecもインストールする。
gem install rspec
先ほどのチュートリアルにあるように、Gemfileでgemを指定して
bundle install
を実行したり、helperに
require 'rspec/rails'
 
# Add this to load Capybara integration:
require 'capybara/rspec'
require 'capybara/rails'
などの設定を入れたり。

これでvisitやclick_onなどの設定が使えるのかと思ったら、エラー。


undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_4:0x748aab0>
などと出てくる。
requireだけでは不十分なのか。結局、ココでのコメントにあるとおり
include Capybara::DSL
でエラーが出なくなった。
解決したのはよいが、調べてもあまりこのことは載っていなかった。特殊な環境だけで起こる事象なのだろうか。

  1. リモートで動かす
開発環境内では動くことが確かめられたので、次はリモートPCでIE8上でSeleniumを実行したい。
どう考えても何も設定しなければローカルで実行されるに決まっているので、設定方法を調査。

CapybaraやRails関係のところではなく、Seleniumのドキュメントに説明があった

driver = Selenium::WebDriver.for(:remote, :url => "http://myserver:4444/wd/hub", :desired_capabilities => :ie)
などとすればよいみたい。
動かしたいPCにSelenium Serverをダウンロード、起動した状態で
rake spec
 などとして実行すればよいはず…
今度はvisitなどができない。

APIを見てみると、先ほど取得したdriverオブジェクトに対してfind_elementなどのメソッドを取得している。メソッドもCapybaraに備わっているものとは異なる。

できるだけブラウザエンジンに依存しないスクリプトを書いて、用途に応じてブラウザエンジンを切り替える、という運用を考えていたが、しばらく調べたのち、リモートで動かす前提だと無理だ、という結論に。

Selenium IDEからrubyのスクリプトをエクスポートしたときも、visitやclick_onなどのシンプルなものではなく、ドライバに対するメソッドで、かなり複雑なことをやっていると思ったが、それはFirefoxブラウザを使ったり、リモートで動かしたりするときにはこの形のスクリプトを書かなければいけないから、ということみたいだ。

このSelenium特有の記法を使ってスクリプトを書いたら実行できた。なお、2.4にはバグがあってIEでは実行できないようなので要注意。私もはまりました。
次はSeleniumのコードを書く中で動かないところとか出てくるはず。