Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ZendFWでテストやろうぜ!

 ZendFWでテストやろうぜ!

古いZendFWで動くシステムでも自動テストしたい!

monochromegane

February 19, 2013
Tweet

More Decks by monochromegane

Other Decks in Technology

Transcript

  1. ZendFWで
    テストやろうぜ
    Zend_Testを用いたテストの自動化
    ムームードメイン:miyakey

    View Slide

  2. Zend_Test
    ● PHPUnitを拡張したZendFrameworkアプリ
    ケーションテスト用のコンポーネント
    ● コントローラ層向けテストを行うクラスとモデル
    層向けテストを行うクラスを提供

    View Slide

  3. Zend_Test_PHPUnit_
    ControllerTestCase
    擬似的なリクエストとレスポンスを用いてコントロー
    ラの動作や出力を検証するクラス。
    リクエスト 処理のリクエスト結果を検証。ルーティングが正しく行わ
    れているかなど。
    リダイレクト コントローラの処理の結果としてリダイレクトが行われた
    ことを検証。
    出力 コントローラの処理の結果として表示される内容が正し
    いことを検証。
    レスポンス コントローラの処理の結果として返却されるレスポンス
    (ヘッダー等)を検証。

    View Slide

  4. Zend_Test_PHPUnit_
    DatabaseTestCase
    ZendFrameworkのDB接続を外部から注入するこ
    とでモデル単体での検証するクラス。
    ● テーブルの初期化
    ● 外部ファイルによる初期データ投入
    ● 値の検証

    View Slide

  5. おさいぽ!/顧客管理はZendFrameworkを使って
    います。
    おさいぽ!/顧客管理
    PHP 5.2.4
    MySQL 5.0
    ZendFramework 1.5.2

    View Slide

  6. Zend_Test_PHPUnit_
    DatabaseTestCase
    Zend_Testは、
    ZendFramework1.6から導入されました。

    View Slide

  7. うわっ… Zendのバージョン、
    低すぎ…?
    無料5分で、適正バージョンや
    ZendFW基礎能力が分かる
    「おさいぽ!価値診断テスト」。
    受けた人は40万人を突破!
    結果もすぐ分かると大人気だ。
    Check
    >> あなたの適正バージョンは?

    View Slide

  8. 開発者の端末
     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配下に対
    象の構成にあわせて格納

    View Slide

  9. コントローラのテスト .1
    POSTリクエスト
    $this->request->setPost(array(
    'paramName' => 'paramValue'
    ));
    $this->request->setMethod('POST');
    $this->dispatch('/path/to/url');
    ※連続した画面遷移にはresetRequestとresetResponseメソッドを利用する。

    View Slide

  10. コントローラのテスト .2
    検証
    $this->assertResponseCode(200);
    $this->assertAction('actionName');
    $this->assertRedirectTo('redirectUrl');
    $this->assertQuery('path');
    ※出力に対する検証はCSSセレクタによる柔軟な要素の指定が可能。

    View Slide

  11. モデルのテスト .1
    準備
    protected function setUp()
    {
    parent::setUp('seed.xml');
    }
    ※setUpメソッドによるseedの指定はおさいぽ!用にgetDataSetをラップ

    View Slide

  12. モデルのテスト .2
    検証
    $result = $this->_model->method();
    $this->assertEquals('expect', 'actual');
    $this->assertDataSetsEqual(expect, actual);
    ※PHPUnitと同様

    View Slide

  13. Bad Know How
    おさいぽ!との戦いの歴史

    View Slide

  14. 1.5でZend_Test
    1.5でZend_Testを動かすためにちょっと無理をし
    ています。
    動作に必要な同名クラスはincludeの順番で1.12
    のものを先に読み込ませています。

    View Slide

  15. PHPUnitのバージョン
    PHPUnitはひとつ古い3.5でないとうまく動きませ
    んでした。

    View Slide

  16. ZendFramework1.5のバグ
    ZendFramework1.5には、ローカル実行時のロ
    ケール判定にバグがあります。
    Zend_Dateの日付文字列取得を含むクラスで不
    審な挙動となります。
    ⇒ここを修正してください。
    Zend_Locale: L282
    $language = substr($language, 0, strpos
    ($language, '.') -1); // -1 不要!

    View Slide

  17. ダミーアクセス
    コントローラのテストはDB接続アダプタの読み込
    みのため、一度ダミーアクセスを行なって、正常な
    レスポンスを受信してからでないとうまくいきません
    でした。
    ⇒親クラスで吸収するように回避しています。

    View Slide

  18. 要素の値がとれない
    コントローラのテストでCSSセレクタで要素を指定
    して検証するメソッドはあるけど、実際に要素の値
    を取得するメソッドがない。
    複数画面を遷移する場合に前画面で取得したパラ
    メタがわからない。
    ⇒つくりました。
    CSSセレクタで属性、値を取得するメソッドを提供
    するクラス(CustomDomQuery)

    View Slide

  19. defineの恐怖
    処理内で"define"を利用していて、該当処理に対
    して複数回テストを行う場合、予期しない結果とな
    ります。
    ⇒PHPUnitはテストスイートをひとつのプロセスで
    実行するためです。プロセス内でdefine定数は最
    初の一回しか値を定義できません。
    別プロセスで動作するよう
    @runInSeparateProcessアノテーションをつけま
    しょう。

    View Slide

  20. スレーブデータベースへのアクセス
    モデルのテストではDB接続を外部から注入できる
    けど、おさいぽ!ではスレーブデータベースへの接
    続処理でデフォルトアダプターを置き換えるので意
    味ないよ。
    ⇒テスト用のiniファイルを読み込むように変更しま
    した

    View Slide

  21. まとめ

    View Slide

  22. テストつくろう!
    ● モデルのテストはZend_Test
    ● コントローラのテストは正直微妙
    (Viewの検証との分離ができていない、出力結
    果に対しての検証でJavaScript系の検証まで
    はできない等。Selenium系のテストによる代替
    を検討)

    View Slide