Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 ● 名前  末澤(Twitter @deliku0306) ● 所属  株式会社ユニラボ ● Output  https://qiita.com/suezawan  https://note.com/deliku0306/

Slide 3

Slide 3 text

会社紹介

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

CI/CD の概要 Github Actions ローカルのDocker環境 で開発、リモートブランチ にpushし、PRを作成する ・CodeFactorによる規約チェック ・PHP FeatureTest UnitTest実施 mergeして 自動deploy この処理時間を改善す ることで、deliveryまでの 時間を削減する

Slide 6

Slide 6 text

FeatureTest / UnitTest 1 migrateによる TestDB初期化 2 Seederによるデータ投入 3 test実行

Slide 7

Slide 7 text

テストデータをSeederで追加することで発生した課題 1 migrateによる TestDB初期化 2 Seederによるデータ投入 3 test実行 テストデータをSeederで追加する運用をしていたため下記 の課題がありました。 - あるテストデータを修正すると別のテストが失敗(特定 データに複数テストが依存関係にある) - テストケースが増える度にSeederデータを追加するこ とで、Seeder実行時間が増えていく

Slide 8

Slide 8 text

改善① Seeder依存のテストケースをFactory利用へ TestCode Factory

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

結果 弊社のケースではボトルネックが、大量データを Seederで投入していたため、 この方法で実行時間を短縮することができました

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

まとめ そもそもテストデータをSeederで追加していく手法が、 アンチパターンであることを実際に経験したことで、 標準的な方法がなぜ提供されているかの理解を深めることができました なお、今回お話したFactory / RefreshDatabase / テスト並列実行は、 データベーステスト章に記載されている内容になります https://laravel.com/docs/8.x/database-testing#defining-model-factories https://readouble.com/laravel/8.x/ja/database-testing.html