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

フレームワークが生み出す負債や複雑さに対して、PHPUnitと付き合っていく

stwile
June 24, 2023

 フレームワークが生み出す負債や複雑さに対して、PHPUnitと付き合っていく

万人を虜にし、数多くのエンジニアを型に嵌めたフレームワークという存在。某WordPressをはじめ、全世界のアプリケーションインフラを支える大黒柱ではあるが、彼らも時代とともに変わっていく。

自分自身も毎年脱皮を繰り返す彼らを業務上で付き合っていく中で、四苦八苦することがあるが、果たしてどのように関係を保てばいいものだろうか。

コントリビューターたちの軌跡を常にキャッチアップするほど、我々に時間は与えられていないし、業務は待ってくれない。

業務を通して、かつ、フレームワークの複雑さや進化と付き合ってきた、僕なりの方法をお話します。

・Laravelを使った開発における注意点
・PHPUnitを用いた設計・実装における勘所

stwile

June 24, 2023
Tweet

More Decks by stwile

Other Decks in Programming

Transcript

  1. 2023 年 6 月 24 日 (土)
    PHPカンファレンス福岡 @stwile871
    フレームワークが生み出す
    負債や複雑さに対して、
    PHPUnitと付き合っていく

    View full-size slide

  2. 自己紹介
    スタヰル(@stwile871)
    ● PHPer歴・TDD歴6年目
    ● 名古屋在住ですが、2・3ヶ月毎に東京に出張
    ● 筋トレ🏋とウヰスキー🥃を嗜
    ● ロックマンエグゼ好きを拗らせてWeb業界に入門
    ● 好きな関数は sprintf()

    View full-size slide

  3. Q. ところで皆さんご存知ですか?

    View full-size slide

  4. FWのバージョンを上げるとどうなるのか

    View full-size slide

  5. どうなるのか?

    View full-size slide

  6. 何もしてないのに壊れた
    \(^o^)/
    \(^o^)/

    View full-size slide

  7. もう二度と\(^o^)/らないために…!!

    View full-size slide

  8. アジェンダ
    1. FWのアップデート事故からの考察
    2. テストクラスの罠

    View full-size slide

  9. とある架空のアプリケーション
    ● FWのバージョンアップ

    View full-size slide

  10. 具体的な事故
    ソート機能が
    期待するものではなくなっていた

    View full-size slide

  11. 要件
    TODOのリストを返す
    ● 更新日時
    ● 降順

    View full-size slide

  12. 要件
    TODOのリストを返す
    ● 更新日時
    ● 降順 昇順

    View full-size slide

  13. ちょっと待ってください。

    View full-size slide

  14. 悔しいポイント

    🦁テストは書いていた🦁

    View full-size slide

  15. どんなテストだったのか?

    View full-size slide

  16. テストの概要
    ● API(Integration)のテスト
    ● モジュール(Unit)のテスト

    View full-size slide

  17. 事実確認
    ● モジュールのテスト > APIのテスト
    ● APIのテストはMockを多用

    View full-size slide

  18. 原因と考察
    ● モジュールのテスト > APIのテスト
    ● APIのテストはMockを多用
    ● 機能を担保するテストではなかった
    ● ライブラリの依存に対処できていなかった

    View full-size slide

  19. つまり?

    View full-size slide

  20. 原因と考察
    要件を満たして品質を担保するテスト

    View full-size slide

  21. 原因と考察
    要件を満たして品質を担保するテスト
    開発速度とカバレッジだけ高いテスト

    View full-size slide

  22. テストピラミッドを信じてテストを書いていた
    E2E
    Integration
    Unit

    View full-size slide

  23. Unit > Integration
    E2E
    Integration
    Unit
    本来のテストピラミッド

    View full-size slide

  24. TODOアプリのテストピラミッド
    E2E
    Integration
    Unit
    Unit > Integration

    View full-size slide

  25. 原因と考察に基づく比較
    E2E
    Integration
    Unit
    ● 機能を担保するテストではなかった
    ● ライブラリの依存に対処できていなかった

    View full-size slide

  26. 原因と考察に基づく比較
    E2E
    Integration
    Unit
    ● 機能を担保するテストではなかった
    ● ライブラリの依存に対処できていなかった
    間違ってなさそう💧

    View full-size slide

  27. もう少し図解

    View full-size slide

  28. 僕らが作っていたテスト
    ● プロダクトコード
    ● FW内の処理
    ● 依存ライブラリの処理の 振る舞い(mock)
    ● 入力
    ブラックボックスが
    処理を振る舞うテスト

    View full-size slide

  29. 品質を担保できるテスト
    ● プロダクトコード
    ● FW内の処理
    ● 依存ライブラリの処理
    ● 入力
    ブラックボックスが
    処理を行うテスト

    View full-size slide

  30. 結論
    FWのアップデートには
    Integrationテストを書こう

    View full-size slide

  31. !!!!!!!!!!
    !ここから本題です!
    !!!!!!!!!!

    View full-size slide

  32. 残る疑問
    E2E
    Integration
    Unit
    ユニットテストをたくさん書いていたのに
    品質を担保できなかったのはなぜ❓❓❓

    View full-size slide

  33. ???
    「一体いつから
     Unitテストがクラス単位だと
     錯覚していた?」
    ???

    View full-size slide

  34. Unit(単体)テストは難しい

    View full-size slide

  35. Unit(単体)テストは文脈ごとに意味が変わる
    から難しい

    View full-size slide

  36. 各テスト定義(文脈)を比較

    View full-size slide

  37. Laravelのテスト
    引用:
    https://laravel.com/docs/10.x/testing#main-content

    View full-size slide

  38. Laravelのテスト
    UnitTest
    ● 一つのメソッドに焦点を当てる
    ● DBや依存ライブラリにアクセスしない
    UnitTest
    ● 一つのメソッドに焦点を当てる
    ● DBや依存ライブラリにアクセスしない
    Feature Test
    ● APIとしての機能テスト

    View full-size slide

  39. TODOアプリのテスト構成と似ている
    E2E
    Integration
    Unit

    View full-size slide

  40. 『単体テストの考え方 / 使い方』のテスト
    単体テスト
    ● 1単位の振る舞いを検証
    ● 実行時間が短い
    ● 他のテストから隔離されている

    View full-size slide

  41. 1単位とは???

    View full-size slide

  42. 1単位とは???
    Contextによって単位が変わる

    View full-size slide

  43. 1単位とは???
    担保したい価値の最小単位

    View full-size slide

  44. 定義がないので
    チームで話し合って定義してみた

    View full-size slide

  45. Unit
    ● TODOを作成できる
    担保したい価値

    View full-size slide

  46. Unit
    ● TODOを作成できる
    Integration
    ● TODOを管理(作成・編集・削除)でき

    担保したい価値

    View full-size slide

  47. ● プロダクトとしての機能をテストで担保しよう
    ● 依存しているブラックボックスも通そう
    ● 自分たちの1単位は何なのか見直そう
    まとめ

    View full-size slide

  48. おわり


    View full-size slide