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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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.7k
言語の力でモデリングを表現する
penguin045
0
310
初めてのClojure
penguin045
0
730
技術的負債を見つめなおす
penguin045
1
1.7k
PHPerがこれから「型」とお付き合いしていくために
penguin045
1
2.8k
Other Decks in Technology
See All in Technology
歴史から理解するクラウドインフラのしくみ
kizawa2020
0
140
人とエージェントが高め合う協業設計
kintotechdev
0
930
AIエージェントがあれば技術書なんてすぐ書けるでしょ→無理でした
watany
4
450
データ活用研修 データマネジメント【MIXI 26新卒技術研修】
mixi_engineers
PRO
2
240
2年前に削除したPHPクラスが、 ある日突然決済をエラーにした
ykagano
1
830
インシデント事例と パッケージの全量解析に学ぶ ソフトウェアサプライチェーンの守り方 / supply-chain-attack-defense
flatt_security
0
1.1k
データベース研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
250
文字起こし基盤の信頼性
abnoumaru
0
140
Power Automateアップデート情報
miyakemito
0
250
AIとハーネスで育てるトランスコンパイラ / 20260722 Yasushi Katayama
shift_evolve
PRO
3
950
「待ち時間」の消滅と「自我消耗」の加速:生成AI時代のエンジニアを救うメンタル・リソース管理
poropinai1966
0
160
MCPをつなげて作る組織横断のAIエージェント基盤
tsubakimoto_s
0
160
Featured
See All Featured
sira's awesome portfolio website redesign presentation
elsirapls
0
310
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
190
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Paper Plane
katiecoart
PRO
2
52k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Practical Orchestrator
shlominoach
191
11k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
180
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
Making the Leap to Tech Lead
cromwellryan
135
10k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
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