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

株式会社ユニラボLaravelShibuya#10LT資料 / laravel_shibuya_10_lt

061805b0c41c8ed88f59fd21f42ce57b?s=47 unilabo
December 15, 2021
240

株式会社ユニラボLaravelShibuya#10LT資料 / laravel_shibuya_10_lt

2021/12/15 Laravel.shibuya 第10回目の発表資料になります。
https://laravel-shibuya.connpass.com/event/231357/

061805b0c41c8ed88f59fd21f42ce57b?s=128

unilabo

December 15, 2021
Tweet

Transcript

  1. テスト実行時間を1/2 にしました@Laravel Laravel Shibuya #10

  2. 自己紹介 • 名前  末澤(Twitter @deliku0306) • 所属  株式会社ユニラボ • Output

     https://qiita.com/suezawan  https://note.com/deliku0306/
  3. 会社紹介

  4. 今日話すこと Laravelでテストコードを書いてみて、 得た知見と高速化した話

  5. CI/CD の概要 Github Actions ローカルのDocker環境 で開発、リモートブランチ にpushし、PRを作成する ・CodeFactorによる規約チェック ・PHP FeatureTest

    UnitTest実施 mergeして 自動deploy この処理時間を改善す ることで、deliveryまでの 時間を削減する
  6. FeatureTest / UnitTest 1 migrateによる TestDB初期化 2 Seederによるデータ投入 3 test実行

  7. テストデータをSeederで追加することで発生した課題 1 migrateによる TestDB初期化 2 Seederによるデータ投入 3 test実行 テストデータをSeederで追加する運用をしていたため下記 の課題がありました。

    - あるテストデータを修正すると別のテストが失敗(特定 データに複数テストが依存関係にある) - テストケースが増える度にSeederデータを追加するこ とで、Seeder実行時間が増えていく
  8. 改善① Seeder依存のテストケースをFactory利用へ TestCode Factory

  9. 改善② RefreshDatabaseを利用しテスト開始初回時 migrate およびマスタデータSeederを実行する TestCase.php 最初のテストケース実行タイミングで、 migrate:freshと特定Seederを実行してくれ ます テストメソッド単位でトランザクション処理にな るため、他テストケースとのデータ依存がなく

    なります テストに必要なマスタデータのTestSeederを 実行させます
  10. 結果 弊社のケースではボトルネックが、大量データを Seederで投入していたため、 この方法で実行時間を短縮することができました

  11. テスト並列実行を試してみた テストケースが互いに依存関係がなくなったの で、並列処理も可能になりました。ローカル環 境で試してみたのですが、処理時間の改善に はつながりませんでした。 (むしろパフォーマンスが下がる結果になりまし た) 時間をみつけてボトルネックを調査したいなと 考えています。 ↓

    並列数2 ↓ 並列数4
  12. まとめ そもそもテストデータをSeederで追加していく手法が、 アンチパターンであることを実際に経験したことで、 標準的な方法がなぜ提供されているかの理解を深めることができました なお、今回お話したFactory / RefreshDatabase / テスト並列実行は、 データベーステスト章に記載されている内容になります

    https://laravel.com/docs/8.x/database-testing#defining-model-factories https://readouble.com/laravel/8.x/ja/database-testing.html