機能テスト
この章を読む前に、まずは Seleniumのドキュメント (日本語版はこちら) および PHPUnitのドキュメント を読むことをお奨めします。 以下に Yii において機能テストを書くときの基本的な原則を要約します。
ユニットテストと同じように、機能テストは CWebTestCase クラスを継承した
XyzTestというクラスの形で書かれます。 ここでXyzはテストされるクラスを表します。PHPUnit_Extensions_SeleniumTestCaseが CWebTestCase の親クラスであるため、この親クラスから継承したすべてのメソッドを使うことが出来ます。機能テストのクラスは
XyzTest.phpという名前の PHP ファイルとして保存されます。 規約により、この機能テストのファイルはディレクトリprotected/tests/functionalの下に保存します。テストクラスは主として
testAbcと名付けられた一連のテストメソッドを含みます。 ここでAbcは、多くの場合、テストされる機能の名前です。 例えば、ユーザログインの機能をテストするためには、testLoginという名前のテストメソッドを作成します。テストメソッドは、通常、一連の文によって Selenium RC に対するコマンドを発し、テストされるアプリケーションとの相互作用を実行します。 また、テストメソッドは、アサーション文によって、ウェブアプリケーションが期待どおりの反応を返すことを確認します。
機能テストの書き方を説明する前に、yiic webapp コマンドで生成された WebTestCase.php を見てみましょう。
このファイルは、すべての機能テストクラスの基本クラスとして働く WebTestCase を定義しています。
WebTestCase クラスは、主として、テストされるページのベース URL をセットします。
後のテストメソッドにおいては、テストされるページを指定するのに相対 URL を使用することが出来ます。
テストのベース URL において、エントリスクリプトとして index.php ではなく index-test.php を使っていることにも注意を払わなければなりません。
index-test.php と index.php の間の唯一の違いは、アプリケーション構成ファイルとして前者は test.php を使い、後者は main.php を使う、という点です。
では、ブログデモ の記事の表示に関する機能についてテストをする方法を説明します。 最初に、下記のように、テストクラスを書きます。 このテストクラスが、たった今説明した基本クラスを継承するものであることに注意してください。
ユニットテストのクラスを書く場合と同じように、このテストによって使用されるフィクスチャを宣言します。
ここでは Post フィクスチャが使われなければならないと指示しています。
testShow というテストメソッドにおいて、最初に Selenium RC に URL post/1 を開くように指示します。
これが相対 URL であることに注意してください。
完全な URL は、基本クラスで設定したベース URL の後にこれを追加したもの (つまり http://localhost/yii/demos/blog/index-test.php/post/1) になります。
そして、記事 sample1 のタイトルが現在のウェブページにあることを確認します。
さらに、ページの中に コメントをどうぞ というテキストが含まれていることも確認します。
ヒント: 機能テストを走らせる前に、Selenium-RC サーバを起動する必要があります。 そうするためには、Selenium サーバをインストールしたディレクトリで、
java -jar selenium-server.jarというコマンドを実行します。