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
社内最長老のシステムにPHPUnitで立ち向かう方法
Search
penguin045
December 01, 2019
Technology
1
3.1k
社内最長老のシステムにPHPUnitで立ち向かう方法
表題の通りです
penguin045
December 01, 2019
Tweet
Share
More Decks by penguin045
See All by penguin045
20年モノの巨大Webサービスの開発継続戦略 - ミドルウェアのバージョンアップとの向き合い方
penguin045
1
2.4k
言語の力でモデリングを表現する
penguin045
0
270
初めてのClojure
penguin045
0
670
技術的負債を見つめなおす
penguin045
1
1.5k
PHPerがこれから「型」とお付き合いしていくために
penguin045
1
2.5k
Other Decks in Technology
See All in Technology
United Airlines Customer Service– Call 1-833-341-3142 Now!
airhelp
0
160
開発生産性を測る前にやるべきこと - 組織改善の実践 / Before Measuring Dev Productivity
kaonavi
6
1.5k
20250707-AI活用の個人差を埋めるチームづくり
shnjtk
4
3.6k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
2
360
2025-07-06 QGIS初級ハンズオン「はじめてのQGIS」
kou_kita
0
160
AWS Organizations 新機能!マルチパーティ承認の紹介
yhana
1
270
成長し続けるアプリのためのテストと設計の関係、そして意思決定の記録。
sansantech
PRO
0
100
マネジメントって難しい、けどおもしろい / Management is tough, but fun! #em_findy
ar_tama
7
910
Tech-Verse 2025 Keynote
lycorptech_jp
PRO
0
1.8k
自律的なスケーリング手法FASTにおけるVPoEとしてのアカウンタビリティ / dev-productivity-con-2025
yoshikiiida
1
15k
開発生産性を組織全体の「生産性」へ! 部門間連携の壁を越える実践的ステップ
sudo5in5k
2
6.3k
Claude Code に プロジェクト管理やらせたみた
unson
5
2.5k
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
72
4.9k
Designing Experiences People Love
moore
142
24k
Stop Working from a Prison Cell
hatefulcrawdad
270
21k
Being A Developer After 40
akosma
90
590k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
680
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Fireside Chat
paigeccino
37
3.5k
Done Done
chrislema
184
16k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Transcript
社内最長老のシステムに PHPUnit で立ち向かう方法 やなせ たかし
自己紹介 やなせ たかし 株式会社ラクスで働いています。 PHP 歴 9 か月 Scala 大好きマン
2
今日話すこと 18 年稼働しているシステムの PHP をバージョンアップをしたときの戦い方 • レガシーネタです。 • 適用範囲は限定的です。 •
PHP8 完全対応!ではありません。 話さないこと • レガシーシステムとの戦い方 • 実装の話 3
背景 • PHP 7.1 => 7.3 へのバージョンアップをすることになった ◦ ちょうど今日 EOL
ですね • 調査までは PJ 横断だが、設計・実装担当は 1 人 ◦ しかも PHP 歴 3 か月 • 実装まではつつがなく終了 4
_人人人人人人人人人人人_ > 突然の全機能テスト <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄ 5
ルール 環境 • 老舗サービス (18 年モノ ) • ソースコードは当然レガシーなものが多い テストクリアの条件
• 重要機能はカバレッジ 100% (C0) を取ること • 非重要機能は全機能の動作確認が完了している 6
戦い方を考える 手札 • 一部共通関数の PHPUnit • 一部シナリオの Selenium テスト •
正常系の回帰テスト ( 手動 ) 戦術 • 既存テストは利用する • 不足分を PHPUnit で担保する 7
トランザクションスクリプト対策 戦術:とにかくモックを使う • これまで自動テストでモックを使ってこなかった • 呼び出している関数を大胆にモック化 • 呼び出し先はテスト済みなので、テストの責務外 8
uopz 拡張(User Operations for Zend) • Zend エンジンの振舞いを操作する拡張 • あらゆる関数をモック化するために使用
• 引数にクロージャが渡せて、過去のデファクトだった runkit より使い勝手がいい • トランザクションスクリプト内の関数を狙い撃ちしてモック化 しなければならないケースで活躍 9
テスト作成開始 10
甘すぎる見通し 11
トランザクションスクリプトには 12
勝てなかった 13
高すぎるカバレッジ取得の壁 14
どうやってもルール通りカバレッジは取れない • 条件分岐に入るのが至難の業 ◦ 放置されている謎のロジック ◦ 巨大なトランザクションスクリプト ◦ 変数の再代入・フラグの再利用が横行 •
グローバル変数の濫用 => テストするべきかどうかを精査したほうが早い 15
テストの取捨選択が必要 16
カバレッジ取得するもの • 既存テストでカバーできるもの • 重要機能にまつわる小さな関数・メソッド ◦ 他の関数に依存していないもののみ ◦ 依存が少なければモックなどでテストする 17
これらは問題ない 18
本丸に切り込む 19
トランザクションスクリプトとの戦いかた • ほとんどが機能を実現しているロジック • 関数呼び出しはほとんどモックで置き換えた • それでも通せない重複した構造のコードが多過ぎた => ここで取捨選択をすることに決定 20
トランザクションスクリプトとの戦いかた 前提 • 見えている部分のみテストできればよい • 呼び出し先はテスト済みのはず 新たな方針 • 内部状態は問題にしない •
コンパイルが通るような状態なら充分である • 通せないものは通せない 21
トランザクションスクリプトとの戦いかた 守りたいもの • 文法的な正しさを担保すること ◦ たとえそれが手作業であったとしても 捨てても構わないもの • カバレッジ 100%
という安心感 22
カバレッジ取得しなかったもの • return だけしているブロック ◦ 戻り値のチェックをしたいわけではない • 単純な操作のみのブロック ◦ 文字列結合だけしている
◦ 変数に代入しているだけ • 例外を投げているだけのブロック ◦ 投げるだけならエラーにはならないはず ◦ レアケースが多すぎるため、コストが高すぎる 23
無事生還 24
まとめ • 切り分けは大事 ◦ コアロジックはしっかりテストしよう ◦ 構文のテストがいるような個所も • 知識は詰め込めばわりと入る ◦
この経験で PHP に対して知見が深まったのは事実 ◦ 言語化できるにはまだ壁がある状態 • コンパイラがある幸せ ◦ みんな Scala やろう 25