Upgrade to Pro — share decks privately, control downloads, hide ads and more …

社内最長老のシステムにPHPUnitで立ち向かう方法

penguin045
December 01, 2019

 社内最長老のシステムにPHPUnitで立ち向かう方法

表題の通りです

penguin045

December 01, 2019
Tweet

More Decks by penguin045

Other Decks in Technology

Transcript

  1. 今日話すこと 18 年稼働しているシステムの PHP をバージョンアップをしたときの戦い方 • レガシーネタです。 • 適用範囲は限定的です。 •

    PHP8 完全対応!ではありません。 話さないこと • レガシーシステムとの戦い方 • 実装の話 3
  2. 背景 • PHP 7.1 => 7.3 へのバージョンアップをすることになった ◦ ちょうど今日 EOL

    ですね • 調査までは PJ 横断だが、設計・実装担当は 1 人 ◦ しかも PHP 歴 3 か月 • 実装まではつつがなく終了 4
  3. ルール 環境 • 老舗サービス (18 年モノ ) • ソースコードは当然レガシーなものが多い テストクリアの条件

    • 重要機能はカバレッジ 100% (C0) を取ること • 非重要機能は全機能の動作確認が完了している 6
  4. 戦い方を考える 手札 • 一部共通関数の PHPUnit • 一部シナリオの Selenium テスト •

    正常系の回帰テスト ( 手動 ) 戦術 • 既存テストは利用する • 不足分を PHPUnit で担保する 7
  5. uopz 拡張(User Operations for Zend) • Zend エンジンの振舞いを操作する拡張 • あらゆる関数をモック化するために使用

    • 引数にクロージャが渡せて、過去のデファクトだった runkit より使い勝手がいい • トランザクションスクリプト内の関数を狙い撃ちしてモック化 しなければならないケースで活躍 9
  6. カバレッジ取得しなかったもの • return だけしているブロック ◦ 戻り値のチェックをしたいわけではない • 単純な操作のみのブロック ◦ 文字列結合だけしている

    ◦ 変数に代入しているだけ • 例外を投げているだけのブロック ◦ 投げるだけならエラーにはならないはず ◦ レアケースが多すぎるため、コストが高すぎる 23
  7. まとめ • 切り分けは大事 ◦ コアロジックはしっかりテストしよう ◦ 構文のテストがいるような個所も • 知識は詰め込めばわりと入る ◦

    この経験で PHP に対して知見が深まったのは事実 ◦ 言語化できるにはまだ壁がある状態 • コンパイラがある幸せ ◦ みんな Scala やろう 25