Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ZendFWでテストやろうぜ!
Search
monochromegane
February 19, 2013
Technology
1
920
ZendFWでテストやろうぜ!
古いZendFWで動くシステムでも自動テストしたい!
monochromegane
February 19, 2013
Tweet
Share
More Decks by monochromegane
See All by monochromegane
Go言語での実装を通して学ぶLLMファインチューニングの仕組み / fukuokago22-llm-peft
monochromegane
0
120
不確実性下における目的と手段の統合的探索に向けた連続腕バンディットの応用 / iot70_gp_rff_mab
monochromegane
2
160
なめらかなシステムと運用維持の終わらぬ未来 / dicomo2025_coherently_fittable_system
monochromegane
0
2.8k
ベクトル検索システムの気持ち
monochromegane
37
11k
Go言語での実装を通して学ぶ、高速なベクトル検索を支えるクラスタリング技術/fukuokago-kmeans
monochromegane
1
210
Go言語でターミナルフレンドリーなAIコマンド、afaを作った/fukuokago20_afa
monochromegane
2
280
多様かつ継続的に変化する環境に適応する情報システム/thesis-defense-presentation
monochromegane
1
1k
Online Nonstationary and Nonlinear Bandits with Recursive Weighted Gaussian Process
monochromegane
0
670
AIを前提とした体験の実現に向けて/toward_ai_based_experiences
monochromegane
2
1k
Other Decks in Technology
See All in Technology
AIエージェント開発用SDKとローカルLLMをLINE Botと組み合わせてみた / LINEを使ったLT大会 #14
you
PRO
0
100
2025年になってもまだMySQLが好き
yoku0825
8
4.6k
AIのグローバルトレンド2025 #scrummikawa / global ai trend
kyonmm
PRO
1
260
AWSで始める実践Dagster入門
kitagawaz
1
580
BPaaSにおける人と協働する前提のAIエージェント-AWS登壇資料
kentarofujii
0
130
AI開発ツールCreateがAnythingになったよ
tendasato
0
120
職種の壁を溶かして開発サイクルを高速に回す~情報透明性と職種越境から考えるAIフレンドリーな職種間連携~
daitasu
0
140
5分でカオスエンジニアリングを分かった気になろう
pandayumi
0
210
DevIO2025_継続的なサービス開発のための技術的意思決定のポイント / how-to-tech-decision-makaing-devio2025
nologyance
1
370
AWSを利用する上で知っておきたい名前解決のはなし(10分版)
nagisa53
10
3k
新アイテムをどう使っていくか?みんなであーだこーだ言ってみよう / 20250911-rpi-jam-tokyo
akkiesoft
0
160
機械学習を扱うプラットフォーム開発と運用事例
lycorptech_jp
PRO
0
230
Featured
See All Featured
The Language of Interfaces
destraynor
161
25k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
How to Think Like a Performance Engineer
csswizardry
26
1.9k
Into the Great Unknown - MozCon
thekraken
40
2k
Why Our Code Smells
bkeepers
PRO
339
57k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
For a Future-Friendly Web
brad_frost
180
9.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
It's Worth the Effort
3n
187
28k
Music & Morning Musume
bryan
46
6.8k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
Transcript
ZendFWで テストやろうぜ Zend_Testを用いたテストの自動化 ムームードメイン:miyakey
Zend_Test • PHPUnitを拡張したZendFrameworkアプリ ケーションテスト用のコンポーネント • コントローラ層向けテストを行うクラスとモデル 層向けテストを行うクラスを提供
Zend_Test_PHPUnit_ ControllerTestCase 擬似的なリクエストとレスポンスを用いてコントロー ラの動作や出力を検証するクラス。 リクエスト 処理のリクエスト結果を検証。ルーティングが正しく行わ れているかなど。 リダイレクト コントローラの処理の結果としてリダイレクトが行われた ことを検証。
出力 コントローラの処理の結果として表示される内容が正し いことを検証。 レスポンス コントローラの処理の結果として返却されるレスポンス (ヘッダー等)を検証。
Zend_Test_PHPUnit_ DatabaseTestCase ZendFrameworkのDB接続を外部から注入するこ とでモデル単体での検証するクラス。 • テーブルの初期化 • 外部ファイルによる初期データ投入 • 値の検証
おさいぽ!/顧客管理はZendFrameworkを使って います。 おさいぽ!/顧客管理 PHP 5.2.4 MySQL 5.0 ZendFramework 1.5.2
Zend_Test_PHPUnit_ DatabaseTestCase Zend_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配下に対 象の構成にあわせて格納
コントローラのテスト .1 POSTリクエスト $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_Test 1.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系のテストによる代替 を検討)