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
3k
社内最長老のシステムにPHPUnitで立ち向かう方法
表題の通りです
penguin045
December 01, 2019
Tweet
Share
More Decks by penguin045
See All by penguin045
20年モノの巨大Webサービスの開発継続戦略 - ミドルウェアのバージョンアップとの向き合い方
penguin045
1
2.3k
言語の力でモデリングを表現する
penguin045
0
250
初めてのClojure
penguin045
0
630
技術的負債を見つめなおす
penguin045
1
1.4k
PHPerがこれから「型」とお付き合いしていくために
penguin045
1
2.4k
Other Decks in Technology
See All in Technology
組織貢献をするフリーランスエンジニアという生き方
n_takehata
2
1.3k
ハッキングの世界に迫る~攻撃者の思考で考えるセキュリティ~
nomizone
13
5.2k
エンジニアが加速させるプロダクトディスカバリー 〜最速で価値ある機能を見つける方法〜 / product discovery accelerated by engineers
rince
4
380
TAMとre:Capセキュリティ編 〜拡張脅威検出デモを添えて〜
fujiihda
2
250
全文検索+セマンティックランカー+LLMの自然文検索サ−ビスで得られた知見
segavvy
2
110
一度 Expo の採用を断念したけど、 再度 Expo の導入を検討している話
ichiki1023
1
170
Moved to https://speakerdeck.com/toshihue/presales-engineer-career-bridging-tech-biz-ja
toshihue
2
750
目の前の仕事と向き合うことで成長できる - 仕事とスキルを広げる / Every little bit counts
soudai
25
7.2k
リーダブルテストコード 〜メンテナンスしやすい テストコードを作成する方法を考える〜 #DevSumi #DevSumiB / Readable test code
nihonbuson
11
7.3k
地方拠点で エンジニアリングマネージャーってできるの? 〜地方という制約を楽しむオーナーシップとコミュニティ作り〜
1coin
1
230
株式会社EventHub・エンジニア採用資料
eventhub
0
4.3k
分解して理解する Aspire
nenonaninu
1
300
Featured
See All Featured
The Cult of Friendly URLs
andyhume
78
6.2k
The Invisible Side of Design
smashingmag
299
50k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Typedesign – Prime Four
hannesfritz
40
2.5k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
Building Your Own Lightsaber
phodgson
104
6.2k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Unsuck your backbone
ammeep
669
57k
How to Ace a Technical Interview
jacobian
276
23k
Code Review Best Practice
trishagee
67
18k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
330
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