Slide 1

Slide 1 text

PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録 PHP Conference 2024 12/22 LT 17:20 ~ 柚口ましろう

Slide 2

Slide 2 text

アジェンダ ➔ 自己紹介 ➔ LaravelでPestを導入する! ➔ 実装する! ➔ テストコードを書こう! ➔ 動かしてみよう! ➔ まとめ

Slide 3

Slide 3 text

自己紹介 株式会社 Gladiolus LAB 取締役CTO PHP歴:9年くらい 変遷のようなもの: 2014 ~ 2018:SES事業会社 所属 2018 ~ 2022:現親会社 C-Garden 取締役 2022 ~ 現在 :Gladiolus LAB 取締役 CTO 柚口ましろう 登壇させていただいたPHPカンファレンス関係 ・PHP Conference   2019   2023   2024 ← new! ・PHPerKaigi   2022   2024

Slide 4

Slide 4 text

突然ですが、

Slide 5

Slide 5 text

突然ですが、みなさん がテストをする時は何を 使いますか?

Slide 6

Slide 6 text

突然ですが、みなさん がテストをする時は何を 使いますか? 単体テストおよび結合テストを A. 温かみのある手動テストで目視確認! B. 自動テストで効率よく開発! C. とりあえずリリース! あとのことはなんとかなる!

Slide 7

Slide 7 text

突然ですが、みなさん がテストをする時は何を 使いますか? 単体テストおよび結合テストを A. 温かみのある手動テストで目視確認! B. 自動テストで効率よく開発! C. とりあえずリリース! あとのことはなんとかなる!

Slide 8

Slide 8 text

突然ですが、みなさん がテストをする時は何を 使いますか? みなさんがお使いの PHPテストツールはなんですか?

Slide 9

Slide 9 text

突然ですが、みなさん がテストをする時は何を 使いますか? みなさんがお使いの PHPテストツールはなんですか? A. PHPUnit B. PHPspec C. CodeSniffer D. Codeception E. Pest

Slide 10

Slide 10 text

突然ですが、みなさん がテストをする時は何を 使いますか? みなさんがお使いの PHPテストツールはなんですか? A. PHPUnit B. PHPspec C. CodeSniffer D. Codeception E. Pest

Slide 11

Slide 11 text

Pestについて

Slide 12

Slide 12 text

Pestについて ・BDDライクに振る舞いをチェーンするツール ・最小単位のテストから、ゴリゴリの Featureテ スト も得意としている ・ミューテーションテスト(テスト網羅されて いること を担保するテスト)も完備 ・Laravelに特化している  (別にLaravelじゃなくても良い!) ・Jestユーザにはかなり親和性のある作り

Slide 13

Slide 13 text

Laravelで Pestを導入する! Pestを入れてみる

Slide 14

Slide 14 text

Laravelで Pestを導入する! Pestを入れてみる

Slide 15

Slide 15 text

実装しよう!

Slide 16

Slide 16 text

実装しよう! 流石に非公開コードを 公開するわけにはいかないよなぁ ……

Slide 17

Slide 17 text

実装しよう! 流石に非公開コードを 公開するわけにはいかないよなぁ …… あ、一から書いちゃお!

Slide 18

Slide 18 text

実装しよう! 流石に非公開コードを 公開するわけにはいかないよなぁ …… あ、一から書いちゃお! 地獄の扉が開かれました……

Slide 19

Slide 19 text

実装しよう! https://github.com/mashirou1234/demo-php-confe rence-2024/blob/main/app/Console/Commands/As signCleaningSchedule.php とりあえず作ってみた ・清掃スケジュール週次登録    バッチという「てい」 ・毎週土曜日になったらバッチ が 実行されて登録する  (スケジューラーは今回ス  コー プアウトしました) ・首都圏3県を対象に清掃対象  物件に人を割り振る仕組み ※詳しくはGithubのURLをご参照くだ  さい (実際にSailでコンテナ起動すれば動  かせるようになっています)

Slide 20

Slide 20 text

テストコードを 書こう! https://github.com/mashirou1234/demo-php-confe rence-2024/blob/main/tests/Feature/AssignCleanin gScheduleTest.php ざっくりテスト検証 ・それぞれの県の清掃対象物件を Factoryで仮想登録 ・それぞれの県で担当する人数分を Factoryで仮想登録 ・とりあえずバッチ実行してスケジュール登録 ・スケジュール登録件数が一致していることを確認する  (登録内容の完全一致のデータ検証も本来なら必要  だが、今回は割愛) ・細かいテストも書きました(詳細は Githubから)

Slide 21

Slide 21 text

テストコードを 書こう! https://github.com/mashirou1234/demo-php-confe rence-2024/blob/main/tests/Feature/AssignCleanin gScheduleTest.php ざっくりテスト検証 ・それぞれの県の清掃対象物件を Factoryで仮想登録 ・それぞれの県で担当する人数分を Factoryで仮想登録 ・とりあえずバッチ実行してスケジュール登録 ・スケジュール登録件数が一致していることを確認する  (登録内容の完全一致のデータ検証も本来なら必要  だが、今回は割愛) ・細かいテストも書きました(詳細は Githubから)

Slide 22

Slide 22 text

動かしてみよう!

Slide 23

Slide 23 text

動かしてみよう!

Slide 24

Slide 24 text

動かしてみよう! https://github.com/laravel/framework/issues/49502

Slide 25

Slide 25 text

動かしてみよう! https://github.com/laravel/framework/issues/49502 PHPUnit 11のバグらしいので 例外ハンドラを実行毎にリストア

Slide 26

Slide 26 text

動かしてみよう! https://github.com/laravel/framework/issues/49502 PHPUnit 11のバグらしいので 例外ハンドラを実行毎にリストア Q:いつ原因が判明したの?

Slide 27

Slide 27 text

動かしてみよう! https://github.com/laravel/framework/issues/49502 PHPUnit 11のバグらしいので 例外ハンドラを実行毎にリストア Q:いつ原因が判明したの? A:今日の13:50くらいに......

Slide 28

Slide 28 text

動かしてみよう!

Slide 29

Slide 29 text

所感 (主観) ● PHPUnitでご飯を食べている人(ワイ) ○ シナリオテストには向いてなさそう Feature系は、例えば単純な GET/POSTなら良いが、 複雑な処理や大掛かりな シナリオテストなると 条件付けが増えるにつれて Pestの旨味を活かした感じを体感仕切れて いない Pestの性質上PHPUnitと大した差はない

Slide 30

Slide 30 text

所感 (主観) ● PHPUnitでご飯を食べている人(ワイ) ○ シナリオテストには向いてなさそう Feature系は、例えば単純な GET/POSTなら良いが、 複雑な処理や大掛かりな シナリオテストなると 条件付けが増えるにつれて Pestの旨味を活かした感じを体感仕切れて いない Pestの性質上PHPUnitと大した差はない ○ ユニットテストとの相性は抜群 細かいテストや連結系テストには 大変強い感覚がある Pest自体がLaravel特化なので、 Eloquentとかのコアパッケージが 混ざったテストが書きやすい

Slide 31

Slide 31 text

所感 (主観) Featureレベル Unitレベル

Slide 32

Slide 32 text

所感 (弊社メンバー) ● テストコードを書いたことない場合 ○ テストだけどコードを書く感覚は変わらないの でそんな悩まなくてすみそう

Slide 33

Slide 33 text

所感 (弊社メンバー) ● テストコードを書いたことない場合 ○ テストだけどコードを書く感覚は変わらないの でそんな悩まなくてすみそう ● PHPUnitに触れたことない人だったら ○ メソッドチェーンで書けるのはわかりやすい ○ JUnitだと1シナリオで全部を盛り盛りにするこ とがあるから、結局4~5000行とかのテスト コードから追わなきゃなので結局面倒になる のがPHPUnitも同じと聞いていたので、Pest ならいいかも

Slide 34

Slide 34 text

まとめ ポジティブ ● PHPUnitをクロージャで書いているような感覚 ● DataProvider等でテスト内容を切り出すとかを しないでも良い (逆説的にデータを汎用に作れば良い) ● いざコードを読んだときに感覚的に何している かを把握しやすい ネガティブ ● シナリオテストなどの大まかなテストは得意で なさそうなのでPHPUnitで書いた方が安全そう ● (個人的に)UnitをPest、FeatureをPHPUnit (Codeception)にするのが良いかも?

Slide 35

Slide 35 text

まとめ テストフレームワークを 複数組み合わせるならPestほど 単体テストに向いているものはない 「流れに沿って書く」というスタイルが最も 強いので、変更しやすいので保守性が高 い(と思っています) 単体テストをこれから書きたいと思ってい るならPestを導入することをオススメしま す

Slide 36

Slide 36 text

おまけ! (時間が余ったら) ミューテーションテスト(Infectionみたいなもの)

Slide 37

Slide 37 text

EOF