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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
penguin045
December 01, 2019
Technology
3.5k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
社内最長老のシステムにPHPUnitで立ち向かう方法
表題の通りです
penguin045
December 01, 2019
More Decks by penguin045
See All by penguin045
20年モノの巨大Webサービスの開発継続戦略 - ミドルウェアのバージョンアップとの向き合い方
penguin045
1
2.6k
言語の力でモデリングを表現する
penguin045
0
300
初めてのClojure
penguin045
0
720
技術的負債を見つめなおす
penguin045
1
1.7k
PHPerがこれから「型」とお付き合いしていくために
penguin045
1
2.8k
Other Decks in Technology
See All in Technology
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
1.5k
Diagnosing performance problems without the guesswork
elenatanasoiu
0
170
【Gen-AX】20260530開催_JJUG CCC 2026 Spring
genax
0
420
DevOps Agentで始めるAWS運用 〜フロンティアエージェントが変える運用の現場〜
nyankotaro
1
240
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
220
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.9k
美味しいスイスチーズを作ろう🧀🐭
taigamikami
1
240
Platform Engineering as a Product: Criteria for Improvement and Multi-Tenant Design
kumorn5s
0
510
新規事業を牽引する技術選定 〜フルスタックTypeScript開発の実践事例〜
nullnull
3
350
Building applications in the Gemini API family.
line_developers_tw
PRO
0
1.6k
AI と創る新たな世界 / A New World Created with AI
ks91
PRO
0
110
EventBridge Connection
_kensh
4
550
Featured
See All Featured
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
Building AI with AI
inesmontani
PRO
1
1.1k
Bash Introduction
62gerente
615
210k
The Curse of the Amulet
leimatthew05
1
13k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
Become a Pro
speakerdeck
PRO
31
6k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
Embracing the Ebb and Flow
colly
88
5.1k
Crafting Experiences
bethany
1
170
Scaling GitHub
holman
464
140k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
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