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

PHPUnit 高速化テクニック / PHPUnit Speedup Techniques

PHPUnit 高速化テクニック / PHPUnit Speedup Techniques

PHPerKaigi 2025で「PHPUnit高速化テクニック」というテーマでお話しました。

----

PHPerKaigi 2025
- https://phperkaigi.jp/2025/
- https://fortee.jp/phperkaigi-2025/proposal/5e50648e-3041-4f1b-ac64-320a3fdc5d45

pinkumohikan

March 22, 2025
Tweet

More Decks by pinkumohikan

Other Decks in Programming

Transcript

  1. ©tete marche CO., LTD. 3 ✔ テテマーチ株式会社 SINIS for X

    テックリード 篠田 北斗 ( @pinkumohikan ) ✔ 社内ブランディング 「定期的に髪色が変わるやべーやつ」 ✔ バックエンド寄りの技術が好き ISUCON毎年参戦中🔥 自己紹介
  2. ©tete marche CO., LTD. 4 ✔ テテマーチ株式会社 SINIS for X

    テックリード 篠田 北斗 ( @pinkumohikan ) ✔ 社内ブランディング 「定期的に髪色が変わるやべーやつ」   「いつもAIAI言ってる感じ悪いやつ」 ✔ バックエンド寄りの技術が好き ISUCON毎年参戦中🔥 自己紹介
  3. ©tete marche CO., LTD. Index 目次 7 1. テスト戦略の見直しで速くする 2.

    テスト実行方法の見直しで速くする 3. テスト環境の見直しで速くする
  4. ©tete marche CO., LTD. テストピラミッド 10 Unit Tests >> Service

    Tests > UI Testsのバランスを目指す 出典: The Practical Test Pyramid - martinfowler.com
  5. ©tete marche CO., LTD. テストピラミッド 11 考え方 • 決定性が高く、高速なUTをメインに •

    漏れた部分をST, UITでカバー テストの重複が減り、 信頼性を担保したままテスト時間を短縮 できる 出典: The Practical Test Pyramid - martinfowler.com
  6. ©tete marche CO., LTD. 12 Google提唱のテスト分類法 テストを - Small (Unit

    Test相当) - Medium (Service Test相当) - Large (UI Test相当) の3種類に分類 Test Sizes 出典: Test Sizes - Google Testing Blog
  7. ©tete marche CO., LTD. 13 • テストピラミッド ◦ UTをメインで書き、漏れた部分をST,UITでカバー ◦

    信頼性を担保したままテスト時間を短縮できる • Test Sizes ◦ 「どこまでがユニットテスト?」って揉めたらS/M/Lって表現する手もある ◦ ちゃんと従っていれば、Smallテストは並列実行しやすいメリットも テスト量のバランス調整: まとめ
  8. ©tete marche CO., LTD. 差分テスト そのPRの diffに関連するクラスだけ をテスト対象にすることで高速化 変更しなければデグレするはずがない →

    テストする必要がない 25 TODO: 車輪モデルにしか変更がな いならヘッドライトモデルのテストを する必要がないよね、みたいな分かり やすい素敵な図を用意する
  9. ©tete marche CO., LTD. 差分テスト 関連するクラスを見つけることが肝であり鬼門👹 こんな感じで出来るのでは説 1⃣ 変更されたクラスをリストアップ -

    `git diff --name-only` 2⃣ 変更クラスへの依存クラスを再帰的にリストアップ - nikic/PHP-Parser等を使い、AST (抽象構文木) から 3⃣ 各クラスの名前に `Test` suffixをつけてテストファイルをgrep 4⃣ ↑で見つかったテストファイルをPHPUnitで実行 26
  10. ©tete marche CO., LTD. テストの並列化 (ParaTest) 30 ParaTest • PHPUnitテストを複数プロセスで並列実行できるツール

    • 並列度を上げるとDB I/O部分でデッドロックしやすい☠ (Smallと相性◎)
  11. ©tete marche CO., LTD. テストの並列化 (Makefile) 33 Makefile • 伝統的なタスクランナー

    • `make -j` で並列実行できる • ParaTestが使えない場合や一部だけ並列化したい場合などに便利
  12. ©tete marche CO., LTD. XDebug無効化 ⚠ GitHub ActionsのUbuntuでは標準でXDebugが有効 PHPer御用達 shivammathur/setup-php

    ActionのREADMEにも、 使ってないなら高速化のために停めたほうが良い旨の記載がある 46 出典: shivammathur/setup-php
  13. ©tete marche CO., LTD. 59 • Test Sizes - Google

    Testing Blog ◦ https://testing.googleblog.com/2010/12/test-sizes.html, Google, 2025/3/16最終閲覧. • Googleのソフトウェアエンジニアリング ◦ O’Reilly Japan, 初版第一刷. • The Practical Test Pyramid ◦ https://martinfowler.com/articles/practical-test-pyramid.html, martinfowler.com, 2025/03/22 最終閲覧. • GitHub Actions でテストを並列化して CI 時間を短縮する ◦ https://tech.gunosy.io/entry/actions_parallel, グノシー, 2025/03/22 最終閲覧. • 問題解決に必要な能力 〜CodeBuildとOPCacheに振り回された話〜 ◦ https://speakerdeck.com/matsukaz/ability-to-solve-problems, matsukaz, 2025/03/22 最終閲覧. 参考文献
  14. ©tete marche CO., LTD. Q&A ParaTestデッドロックしがち • テスト時にデッドロックする = 本番でもデッドロックしうるってこと

    • デッドロックの原因を突き止めて治すのが根本対応 ◦ MySQLのデッドロックログからどのクエリが競合しているか特定して、 それを読み書きしているテストを見つけて、読み書きの方向を揃える・明 示的にロックを取る・TXスコープ見直す・etc… • テストプロセス毎にデータベースを作る方法もある ◦ Laravel migrationを使っている場合はこれがやりやすい 62
  15. ©tete marche CO., LTD. Q&A どれからやっていくと良い? • できることからやり、テンションを上げる ◦ XDebug無効化、OPCache有効化は割とすぐできる

    ◦ テストバランスの見直しは時間がかかる、並列化はデッドロックで詰ま りがち • テスト実行のどの部分で時間がかかっているかを、CIのステップごとのサ マリーから特定してそこに効くやつをやる 63