読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

PHPUnit_Extensions_Selenium2TestCaseによる結合試験でらくらくテスト♪ #phpstudy

第63回PHP勉強会@東京

ビルコムの人 tchikuba

ビルコム(≠ウェルコム)

http://www.rebuy.jp/
https://okkru.jp/fbec_front/gift (20代-30代の女性がターゲット)

本題に入る前に

PHPerな人はどういう開発プロセスなのか?

ウォーターフォール or アジャイル
(アジャイルが主流?)

リーンソフトウェア開発(詳細省略)

主な開発環境
CentOS
Nginx Apache
MySQL
Jenkins
PHP Zendframework jQuery
Subversion → Git
Backlog

Vモデル vs Wモデル

具体的なテストの肝は、自動化
徹底的に自動化すべし
Projectとしてテスト自動化しているフェーズは以下の2つ
受け入れ試験 ユーザ主動線をカバー
結合 単体試験 ユニットテスト

テスト着手の優先度
ビジネス価値 単体 < 結合 < 受け入れ
開発フェーズ 単体 > 結合 > 受け入れ

該当フェーズ毎にビジネス的に価値の高いものを都度判断して決定する
(悪く言うと行き当たりばったり)

PHPUnitを採用している。

環境を用途に分ける必要性
(ビルド)デプロイ自動化
リポジトリ変更をタイムリーにハンドル
デプロイ時に必ずテストを自動実行
開発者にタイムリーに通知
本番環境でユーザテスト実施
デザインモックをタイムリーに最新化

CI環境
Capistranoでデプロイ自動化
Jenkinsでテストケース実行
Facebookでデプロイされたことがメッセージで送られる

実装
ブランチ非採用でフラグを採用している

PHPUnit_Framework_TestCase
主にModelの単体 結合試験に採用しているMOCK_OBJECTを定義して疎結合化している

Zend_Test_PHPUnit_ControllerTestCase
Controller で単体テストを実行している

PHPUnit_Extensions_Selenium2TestCase

本番デプロイ直後でCapistrano→Jenkinsで自動実行している
ユーザが実行する遷移を忠実に再現(2時間おきに自動実行)
クリティカルな問題を未然に防ぐ対策(本当はステージング環境でも動かしたい)

CentOSで動くSeleniumServerに対して実行
webDriverの疑似ブラウザで動作確認(いろいろ制約があるので)

結合試験デバッグtip
sebastianburgman

使い方
http://www.phpunit.de/manual/3.6/ja/selenium.html

ログイン連携とかをテストできる
FBコネクト
正常系で問い合わせ入力
確認画面 完了画面で表示チェック

まとめ

紹介したのは一部
Okkruのフローは複雑
ユーザA 商品 友人を選んで受注
ユーザB 住所入力
ユーザA 決済

どのフローで止まっても利益は得られない
フローチェックのトータルサポートは利に適っている

メリット
htmlunitが使える
最新なので更新頻度が高い
Sebastioan Bergmannな恩恵

デメリット
SeleniumIDEによるテストコード生成が出来ない(IDEにるケースが既にあれば移植の手間がかかるが、移植自体は比較的容易)
ドキュメント皆無(Githubと格闘する必要あり)

デメリット以上のメリットが大きいのでPHPerな人にはとっつきやすいと思われる

質疑

PHPStoriesと組み合わせてはいない
非同期のAPIをテストする
Behatなら簡単に出来そう?