古いZendFWで動くシステムでも自動テストしたい!
ZendFWでテストやろうぜZend_Testを用いたテストの自動化ムームードメイン:miyakey
View Slide
Zend_Test● PHPUnitを拡張したZendFrameworkアプリケーションテスト用のコンポーネント● コントローラ層向けテストを行うクラスとモデル層向けテストを行うクラスを提供
Zend_Test_PHPUnit_ControllerTestCase擬似的なリクエストとレスポンスを用いてコントローラの動作や出力を検証するクラス。リクエスト 処理のリクエスト結果を検証。ルーティングが正しく行われているかなど。リダイレクト コントローラの処理の結果としてリダイレクトが行われたことを検証。出力 コントローラの処理の結果として表示される内容が正しいことを検証。レスポンス コントローラの処理の結果として返却されるレスポンス(ヘッダー等)を検証。
Zend_Test_PHPUnit_DatabaseTestCaseZendFrameworkのDB接続を外部から注入することでモデル単体での検証するクラス。● テーブルの初期化● 外部ファイルによる初期データ投入● 値の検証
おさいぽ!/顧客管理はZendFrameworkを使っています。おさいぽ!/顧客管理PHP 5.2.4MySQL 5.0ZendFramework 1.5.2
Zend_Test_PHPUnit_DatabaseTestCaseZend_Testは、ZendFramework1.6から導入されました。
うわっ… Zendのバージョン、低すぎ…?無料5分で、適正バージョンやZendFW基礎能力が分かる「おさいぽ!価値診断テスト」。受けた人は40万人を突破!結果もすぐ分かると大人気だ。Check>> あなたの適正バージョンは?
開発者の端末 PHP5.2 PHPUnit3.5 ZendFramework 1.5 + 1.12 MySQL5.5おさいぽ!テスト構成tests/├── application│ ├── config│ ├── controllers│ └── models├── bootstrap.php├── fixture├── library│ ├── Custom│ │ ├── CustomDomQuery.php│ │ ├── DummySeed.xml│ │ ├── OkanControllerTestCase.php│ │ └── OkanDatabaseTestCase.php│ └── Zend│ └── Test└── runTest.sh● 既存アプリケーションにテスト用資産を格納。● library/Zend配下にZend_Testが動作するための1.12の資産、library/Custom配下にテスト簡略化のためのクラスを格納。● テスト資産はapplication配下に対象の構成にあわせて格納
コントローラのテスト .1POSTリクエスト$this->request->setPost(array('paramName' => 'paramValue'));$this->request->setMethod('POST');$this->dispatch('/path/to/url');※連続した画面遷移にはresetRequestとresetResponseメソッドを利用する。
コントローラのテスト .2検証$this->assertResponseCode(200);$this->assertAction('actionName');$this->assertRedirectTo('redirectUrl');$this->assertQuery('path');※出力に対する検証はCSSセレクタによる柔軟な要素の指定が可能。
モデルのテスト .1準備protected function setUp(){parent::setUp('seed.xml');}※setUpメソッドによるseedの指定はおさいぽ!用にgetDataSetをラップ
モデルのテスト .2検証$result = $this->_model->method();$this->assertEquals('expect', 'actual');$this->assertDataSetsEqual(expect, actual);※PHPUnitと同様
Bad Know Howおさいぽ!との戦いの歴史
1.5でZend_Test1.5でZend_Testを動かすためにちょっと無理をしています。動作に必要な同名クラスはincludeの順番で1.12のものを先に読み込ませています。
PHPUnitのバージョンPHPUnitはひとつ古い3.5でないとうまく動きませんでした。
ZendFramework1.5のバグZendFramework1.5には、ローカル実行時のロケール判定にバグがあります。Zend_Dateの日付文字列取得を含むクラスで不審な挙動となります。⇒ここを修正してください。Zend_Locale: L282$language = substr($language, 0, strpos($language, '.') -1); // -1 不要!
ダミーアクセスコントローラのテストはDB接続アダプタの読み込みのため、一度ダミーアクセスを行なって、正常なレスポンスを受信してからでないとうまくいきませんでした。⇒親クラスで吸収するように回避しています。
要素の値がとれないコントローラのテストでCSSセレクタで要素を指定して検証するメソッドはあるけど、実際に要素の値を取得するメソッドがない。複数画面を遷移する場合に前画面で取得したパラメタがわからない。⇒つくりました。CSSセレクタで属性、値を取得するメソッドを提供するクラス(CustomDomQuery)
defineの恐怖処理内で"define"を利用していて、該当処理に対して複数回テストを行う場合、予期しない結果となります。⇒PHPUnitはテストスイートをひとつのプロセスで実行するためです。プロセス内でdefine定数は最初の一回しか値を定義できません。別プロセスで動作するよう@runInSeparateProcessアノテーションをつけましょう。
スレーブデータベースへのアクセスモデルのテストではDB接続を外部から注入できるけど、おさいぽ!ではスレーブデータベースへの接続処理でデフォルトアダプターを置き換えるので意味ないよ。⇒テスト用のiniファイルを読み込むように変更しました
まとめ
テストつくろう!● モデルのテストはZend_Test● コントローラのテストは正直微妙(Viewの検証との分離ができていない、出力結果に対しての検証でJavaScript系の検証まではできない等。Selenium系のテストによる代替を検討)