ブログ

ryuzeeによるブログ記事。不定期更新

直近開催のScrum Alliance認定スクラムマスター研修のご案内

Selenium + PHPUnitで簡単エンドツーエンドテストを実現する

  ここではSeleniumとPHPUnitを使って簡単にスモークテストを実現する方法を解説します。 基礎的な内容ですが、復習ということで。

下準備

  • FirefoxにSelenium IDEをインストールする
  • Selenium Serverを導入する(※ダウンロードへの直リンクはこちら)
どちらもhttp://seleniumhq.org/download/からダウンロード可能です。

Selenium IDEを使ったテストケースの作成

もうこれはあちこちのサイトで説明されているので特に説明の必要はないでしょう(笑) 簡単に言えば、Firefoxを起動し、さらにSelenium IDEをたちあげて、操作を記録していけば良いだけです。

参考サイト

テストケースを自動で実行する

ここまでの方法でFirefox上からHTML形式で作成したテストケースをSelenium IDE経由でいつでも実行できるようになります。 しかしこのやり方だと自らブラウザをたちあげてテストを実行しなければならず面倒です。 以下ではPHPUnitを使って連携する方法と、Selenium Serverの機能を使ってバッチ処理的に実行する方法を解説します。

PHPUnitと組み合わせる

PHPUnitと組み合わせて上記で作ったHTMLのテストケースを簡単に実行できます。

PHPUnitとPHPUnit_Seleniumの導入

このやり方ではPHPUnitとPHPUnit_Seleniumを利用するので、まだインストールしていない場合は以下の方法で導入します。

pear channel-discover pear.phpunit.de
pear channel-discover pear.symfony-project.com
pear install phpunit/PHPUnit
pear install phpunit/PHPUnit_Selenium

Selenium Serverの起動

起動は以下のようにします。

java -jar selenium-server-standalone-2.25.0.jar

Proxyの中にいる場合は

java -Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=3128 -jar selenium-server-standalone-2.25.0.jar

のようにします。 以上で標準ではlocalhost:4444でSelenium Serverが起動します。

テストを作ってみる

さて先ほど作ったhtmlのテストケースを実行するテストを書いて見ましょう。 なお、先ほど作ったhtmlのテストケースを、このテストケースと同じディレクトリにあるhtmlフォルダに保存するか、以下の$seleneseDirectoryの値を作ったhtmlのテストケースが保存されているパスに書き換えてください。

class SeleneseTest extends PHPUnit_Extensions_SeleniumTestCase {

    public static $seleneseDirectory = "html/";

    protected function setUp() {
        $this->setHost("127.0.0.1");
        $this->setPort(4444);
        $this->setBrowser("*firefox");
        $this->setBrowserUrl("http://www.yahoo.co.jp/");
        $this->setTimeout(60000);
    }
}

以上ができたらテストを実行します。

phpunit SeleneseTest.php
PHPUnit 3.6.12 by Sebastian Bergmann.

..

Time: 39 seconds, Memory: 6.25Mb

OK (2 tests, 2 assertions)

はい。これでテスト通りました。ここでは$seleneseDirectoryで指定したパスの中にある拡張子がhtmlまたはhtmのテストケースを全て実行してくれます。 で、ここまでできればお分かりかと思いますが、

phpunit --log-junit=smoketest.xml SeleneseTest.php

としてあげればJUnit互換でテスト結果をXMLに出力できるので、簡単にJenkinsでテスト結果を出せるようになります。 ※詳細はPHPUnitのマニュアルにも記載があります。

なお、PHPUnitを使わないで実行するアプローチもありますので以下で説明します。

Selenium Serverの起動オプションにテストケースを設定する

以下のようにします。引数に-htmlSuiteを追加し、利用するブラウザ、開始URL、テストスイート名、結果出力ファイル名の順に指定します。テストスイートを指定しますので、最初に作ったテストケースをまとめるためのテストスイートを作っておいてください(Selenium IDEのメニューから「テストスイートに名前をつけて保存」をクリックして作成します。)

java -jar selenium-server-standalone-2.21.0.jar \
-port 4445 \
-htmlSuite "*firefox" "http://www.yahoo.co.jp" \
"./suite/TestSuite.html" \
"./result.html"

※先の例で既にSeleniumを4444番ポートで起動しているかもしれないのでサンプルとして起動ポートを4445にしています。なお、テストスイートを指定して起動した場合はテスト完了後にSelenium Serverは自動で終了します。

ここで出力されるhtmlは以下のようなものになります。

このhtmlのレポートをJenkinsに取り込むこともできます。それには、Selenium HTML Report Pluginを使います。詳細はこちら

まとめ

このようにhtmlで作ったテストケースでも簡単に自動実行できますし、Jenkinsに結果を取り込んだりできます。 画面回りのテストをコードを書いて作るのはコストが高いですが、Seleniumであれば比較的簡単につくれますので、スモークテスト用途等にも使えますし、特にレガシーコードを扱う場合には効果があると思います。 是非試してみてください。

なお、このアプローチで受け入れテストを全て自動化するのは現実的ではないことも多いです。というのも

  • 画面回りは変わりやすいこと
  • 開発前にテストを作るのが困難なこと
  • そしてテスト実行に時間がかかること
などが理由です。またhtmlのテストケースの場合、変数を外部から与えたりすることは得意でなく、処理を共通化することも困難なので、似たようなテストが大量にできてしまう問題もあります。したがってブラウザ経由のエンドツーエンドの受け入れテストをたくさん用意しなければならない場合は、htmlのテストケースではなく、WebDriverを叩くテストアプリケーションを書いた方が良いことも多いでしょう。Selenium IDEの場合は、各言語用のテストコードの出力も可能ですので、そちらを利用していくのが良いと思います。

またエンドツーエンドの挙動がガードできるようになれば、テストをもっとユニットレベルの段階で書くようにしていき(その過程でリファクタリングもある)テストにかかる時間を減らしたり、開発者にすばやくフィードバックが来るようにしていくことになります。

アジャイル開発チーム向けのコーチングや、技術顧問、Scrum Alliance認定スクラムマスター研修などのトレーニングを提供しています。お気軽にご相談ください(初回相談無料)
前の記事 スクラムでの初期の見積り
次の記事 チームへの期待を明らかにする

プロダクト開発で、こんな課題を感じていませんか?

  • 何を作るべきか、順位の決め方が定まらない
  • プロダクトの方向性をチームで共有できていない
  • 開発組織の体制や役割がうまく機能していない
  • 開発プロセスが形骸化し、目的を見失っている
  • アジャイルを導入したが、組織に定着しない

プロダクトマネジメント、組織構造、開発プロセスの課題について、組織全体の視点から支援します。

お問い合わせ(初回相談無料)

契約を前提にした相談でなくて構いません。相談に際して事前の整理や準備は不要です。

Aligned ―プロダクト開発におけるステークホルダーとの関係性の築き方
ダイナミックリチーミング 第2版
Tidy First?
脳に収まるコードの書き方
プロダクトマネージャーのしごと 第2版
エンジニアリングマネージャーのしごと
チームトポロジー
スクラム実践者が知るべき97のこと
プロダクトマネジメント
SCRUM BOOT CAMP THE BOOK
みんなでアジャイル
レガシーコードからの脱却
Effective DevOps
変革の軌跡
ジョイ・インク
アジャイルコーチの道具箱
カンバン仕事術
Software in 30 Days
How to Change the World