% cat

Selenium2とPHPUnitでMac/Winブラウザ自動テスト

Selenium2とは

ものすごいややこしいんだけど、SeleniumってSelenium◯◯っていうのが沢山あるよね…いったいどれが何なの?っていう迷子状態になって使うに至らない。そんな人、多いと思います。いや俺だけかも。そんな疑問に答えてくれる素晴らしいエントリー。

非常に助かります。要は巷で噂のSelenium2っていうのは、Selenium WebDriverの事。これさえ分かっていれば迷子にならない。と思う。

いきなりまとめ

Macで開発して、PHPUnitでSeleniumのテストコードを書いて、MacブラウザとVirtualBox経由仮想Windowsブラウザに対してテストを実行する。それだけ。

必要なソフトは「PHPUnit」「PHPUnit/selenium」「SeleniumServer」「ブラウザドライバ」。それだけ。

Selenium2 + PHPUnitを使ってテストしたい

PHPをメインで使っている場合、テストにはPHPUnitを使うわけだけど、SeleniumもPHPUnitからテストケース書いて実行したいっていう事で、試してみた。

構成としては普段コードを書いているMac開発機からPHPUnitを実行。Mac検証は開発機を兼用、Windows検証はVirtualBoxを使って仮想OS。それらに対してSeleniumServerを入れてテストを実行。

開発機にPHPUnitとPHPUnitSeleniumをインストール

まず開発機でPHPUnitを実行できないとお話にならない。今どきならComposerで入れるのが流行りなので、それに習って入れる。

composer.json

{
    "require-dev": {
        "phpunit/phpunit": "4.1.*"
        , "phpunit/phpunit-selenium": "dev-master"
    }
}
$ composer install

これでPHPUnit本体と、PHPUnitとSeleniumを連携する拡張機能もインストールされる(各種PHPフレームワークを使っている場合は、その流儀に則ってください)。

PHPUnitの実行

ComposerでPHPUnitをインストールするとデフォルトでは ./vendor/bin/phpunit に配置されている。

$ ./vendor/bin/phpunit --version
PHPUnit 4.1.0 by Sebastian Bergmann.

VirtualBox + modern.ieでWindows検証機を作る

開発環境がMacなので、Macの検証はいいとして、Webサービスをやっている限り、Windowsの検証も必要ですよ…というわけで、Microsoftが用意してくれているWindows仮想環境をmodern.ieから用意する。


適当に検証したいOSやIEのバージョンを選択して、一番下にある「Grab them all with cURL」をクリック→書かれているcurlコマンドを実行する。

ダウンロード完了後、拡張子sfxのファイルに実行言言を与えて実行すればVirtualBoxのOVAファイルができあがる。これを起動すればOK。

Windowsにネットワークアダプターを追加

ホストOS(今回はMac)からゲストOS(Windows)に対してSeleniumServerで通信を行いたいので、ネットワークアダプターを追加する。

  • 「アダプター2」を追加
  • 割り当て「ホストオンリーアダプター」
  • 後は適当

これで起動すれば2つのネットワークが構成されて、ホストからゲストへ通信ができる。コマンドプロンプトで ipconfig を実行すれば割り当てられたIPアドレスもわかる。

検証機にSeleniumServerをインストール

実際にブラウザでテストを実行する検証機にSeleniumServerをインストールする。下記リンクからSeleniumServerをダウンロード。単なるjarファイルなので、適当な場所に配置する。

ちなみに、HomeBrewでも入れられる。

$ brew install selenium-server-standalone

各種ブラウザのドライバをインストール

各種ブラウザを動かすにはドライバが必要になる。SeleniumServer標準だとFirefoxとSafariには対応済み。IEとChromeを動かすにはドライバが必要。

先ほどのSelenium Donwloadの中にあるThe Internet Explorer Driver Serverというのと、サードパーティのChromeDriverをダウンロードして、SeleniumServerのjarファイルと同じ位置に配置する。

  • Mac HomeBrewで入れた場合 /usr/local/Cellar/selenium-server-standalone/2.41.0/bin に chromedriver を配置
  • それ以外はjarと同じディレクトリ

Windowsの例


Macの例


ちなみに、iOSやAndroidなどのドライバもある。

SeleniumServerの実行

テストを実行する前に、SeleniumServerを起動させておく。

jarをダウンロードした場合

Mac

$ java -jar selenium-server-standalone-2.41.0.jar

Windows

> java -jar selenium-server-standalone-2.41.0.jar \
	-Dwebdriver.ie.driver=./IEDriverServer.exe \
	-Dwebdriver.chrome.driver=./chromedriver.exe

HomeBrew経由で入れた場合

$ selenium-server -p 4444

エラーが何も出なければOK。

PHPUnitでテストケースを書く

ようやくPHPUnitからSeleniumを実行するテストケースを書く。継承するクラスは、PHPUnit_Extensions_SeleniumTestCase じゃなくて PHPUnit_Extensions_Selenium2TestCase というのに注意。

WebTest.php

<?php
class WebTest extends PHPUnit_Extensions_Selenium2TestCase {
    public function setUp() {
        $targetUrl = 'http://stg.example.com/form/';

        $this->setHost('192.168.56.101');    // SeleniumServerがインストールされているホスト名
        $this->setPort(4444);           // SeleniumServerの稼働しているポート
        $this->setBrowser('firefox');   // firefox, chrome, iexplorer, safari
        $this->setBrowserUrl($targetUrl);
    }

    public function testTitle() {
        $this->url('/');
        $this->assertEquals('Title Hoge', $this->title());
    }
}

Selenium2TestCaseで使えるテストケース例については公式のスクリプトが参考になる。

PHPUnitを実行する

$ ./vendor/bin/phpunit --colors WebTest


Firefoxが自動起動して、しゅぱっと消えると思います。そして、タイトルタグが指定通りになっているかのテストが見事にこけてくれました。これでテストを実行できる環境の出来上あり。

今後のテスト戦略

ひとまずPHPUnitとSeleniumを組み合わせて自動テストな環境の下地ができた。次はCIとの組み合わせや、データベースのテストとの組み合わせとか…かな。

最新記事

「良いプロダクト」とは、どんなプロダクトのことでしょうか?

こんにちは! プロダクトオーナー兼開発部マネージャーをしている長谷川([@roki1801](https://github.com/roki1801))です。普段は山形県山形市にあるベーシックのサテライトオフィス「[山形ラボ](...

roki1801
2019年03月29日

大量アクセスに耐え得る在庫管理システムの構成を考え実装してみた

皆さん「在庫管理」ってどうしてます?itemsテーブルに、stockカラム作ってdecrementしてますか? まぁ正直、それでも良い感じしますよね。楽だし何やってるかわかりやすい。 しかし! **超人気商品に超ア...

mmusasabi
2019年03月13日

kubernetes で Ruby on Rails を動かして kubern...

巷で話題の kubernetes ですが、とってもとってもとっつきにくいですよね そんな kubernetes ですが手元で動かすことができたので解説してみます (情報が間違ってたらごめんなさい! 🙇) 目標はこちら ...

tkhr0
2019年03月07日