Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録
Search
mashirou1234
December 22, 2024
Programming
0
580
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録
mashirou1234
December 22, 2024
Tweet
Share
More Decks by mashirou1234
See All by mashirou1234
デザインパターンを掘り下げよう ~Singleton Pattern 編~
mashirou1234
3
700
PHP 8.3で追加されたjson_validate()を徹底的に深掘りしてみよう
mashirou1234
1
1.6k
Laravelで共通処理ってどうやるの?
mashirou1234
1
1.7k
改めて見返す「Laravel」とは
mashirou1234
0
380
PHPでドメイン駆動設計を浸透するためにやったことと現状
mashirou1234
0
1.1k
AWS_Lambda_にCustom_Runtimeで_PHPを導入したシステムに改修を加えて_UT導入まで行った話.pdf
mashirou1234
0
610
設計文化のないチームに文化を広めたが冴えない一手で混沌を招いた話を聞いてほしい.pdf
mashirou1234
0
1.5k
Factfullnessは思考ジャックできる良ツールな件について
mashirou1234
0
230
設計忘れからやってはいけない対症療法
mashirou1234
1
760
Other Decks in Programming
See All in Programming
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
500
SLI/SLOの設定を進めるその前に アラート品質の改善に取り組んだ話
tanden
2
600
SideKiqでジョブが二重起動した事象を深堀りしました
t_hatachi
0
170
RubyKaigiで手に入れた HHKB Studioのための HIDRawドライバ
iberianpig
0
170
新卒から4年間、20年もののWebサービスと 向き合って学んだソフトウェア考古学
oguri
7
6.3k
GDG Super.init(version=6) - From Where to Wear : 모바일 개발자가 워치에서 발견한 인사이트
haeti2
0
530
Django for Data Science (Boston Python Meetup, March 2025)
wsvincent
0
170
リアクティブシステムの変遷から理解するalien-signals / Learning alien-signals from the evolution of reactive systems
yamanoku
1
130
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- #phperkaigi
o0h
PRO
0
780
CTFのWebにおける⾼難易度問題について
hamayanhamayan
1
900
Go1.24で testing.B.Loopが爆誕
kuro_kurorrr
0
140
AI Agentを利用したAndroid開発について
yuchan2215
0
190
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
28
2k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
Testing 201, or: Great Expectations
jmmastey
42
7.3k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Embracing the Ebb and Flow
colly
84
4.6k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.7k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
Unsuck your backbone
ammeep
669
57k
Statistics for Hackers
jakevdp
797
220k
Transcript
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録 PHP Conference 2024 12/22 LT 17:20 ~ 柚口ましろう
アジェンダ ➔ 自己紹介 ➔ LaravelでPestを導入する! ➔ 実装する! ➔ テストコードを書こう! ➔
動かしてみよう! ➔ まとめ
自己紹介 株式会社 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
突然ですが、
突然ですが、みなさん がテストをする時は何を 使いますか?
突然ですが、みなさん がテストをする時は何を 使いますか? 単体テストおよび結合テストを A. 温かみのある手動テストで目視確認! B. 自動テストで効率よく開発! C. とりあえずリリース!
あとのことはなんとかなる!
突然ですが、みなさん がテストをする時は何を 使いますか? 単体テストおよび結合テストを A. 温かみのある手動テストで目視確認! B. 自動テストで効率よく開発! C. とりあえずリリース!
あとのことはなんとかなる!
突然ですが、みなさん がテストをする時は何を 使いますか? みなさんがお使いの PHPテストツールはなんですか?
突然ですが、みなさん がテストをする時は何を 使いますか? みなさんがお使いの PHPテストツールはなんですか? A. PHPUnit B. PHPspec C.
CodeSniffer D. Codeception E. Pest
突然ですが、みなさん がテストをする時は何を 使いますか? みなさんがお使いの PHPテストツールはなんですか? A. PHPUnit B. PHPspec C.
CodeSniffer D. Codeception E. Pest
Pestについて
Pestについて ・BDDライクに振る舞いをチェーンするツール ・最小単位のテストから、ゴリゴリの Featureテ スト も得意としている ・ミューテーションテスト(テスト網羅されて いること を担保するテスト)も完備 ・Laravelに特化している (別にLaravelじゃなくても良い!) ・Jestユーザにはかなり親和性のある作り
Laravelで Pestを導入する! Pestを入れてみる
Laravelで Pestを導入する! Pestを入れてみる
実装しよう!
実装しよう! 流石に非公開コードを 公開するわけにはいかないよなぁ ……
実装しよう! 流石に非公開コードを 公開するわけにはいかないよなぁ …… あ、一から書いちゃお!
実装しよう! 流石に非公開コードを 公開するわけにはいかないよなぁ …… あ、一から書いちゃお! 地獄の扉が開かれました……
実装しよう! https://github.com/mashirou1234/demo-php-confe rence-2024/blob/main/app/Console/Commands/As signCleaningSchedule.php とりあえず作ってみた ・清掃スケジュール週次登録 バッチという「てい」 ・毎週土曜日になったらバッチ が 実行されて登録する
(スケジューラーは今回ス コー プアウトしました) ・首都圏3県を対象に清掃対象 物件に人を割り振る仕組み ※詳しくはGithubのURLをご参照くだ さい (実際にSailでコンテナ起動すれば動 かせるようになっています)
テストコードを 書こう! https://github.com/mashirou1234/demo-php-confe rence-2024/blob/main/tests/Feature/AssignCleanin gScheduleTest.php ざっくりテスト検証 ・それぞれの県の清掃対象物件を Factoryで仮想登録 ・それぞれの県で担当する人数分を Factoryで仮想登録
・とりあえずバッチ実行してスケジュール登録 ・スケジュール登録件数が一致していることを確認する (登録内容の完全一致のデータ検証も本来なら必要 だが、今回は割愛) ・細かいテストも書きました(詳細は Githubから)
テストコードを 書こう! https://github.com/mashirou1234/demo-php-confe rence-2024/blob/main/tests/Feature/AssignCleanin gScheduleTest.php ざっくりテスト検証 ・それぞれの県の清掃対象物件を Factoryで仮想登録 ・それぞれの県で担当する人数分を Factoryで仮想登録
・とりあえずバッチ実行してスケジュール登録 ・スケジュール登録件数が一致していることを確認する (登録内容の完全一致のデータ検証も本来なら必要 だが、今回は割愛) ・細かいテストも書きました(詳細は Githubから)
動かしてみよう!
動かしてみよう!
動かしてみよう! https://github.com/laravel/framework/issues/49502
動かしてみよう! https://github.com/laravel/framework/issues/49502 PHPUnit 11のバグらしいので 例外ハンドラを実行毎にリストア
動かしてみよう! https://github.com/laravel/framework/issues/49502 PHPUnit 11のバグらしいので 例外ハンドラを実行毎にリストア Q:いつ原因が判明したの?
動かしてみよう! https://github.com/laravel/framework/issues/49502 PHPUnit 11のバグらしいので 例外ハンドラを実行毎にリストア Q:いつ原因が判明したの? A:今日の13:50くらいに......
動かしてみよう!
所感 (主観) • PHPUnitでご飯を食べている人(ワイ) ◦ シナリオテストには向いてなさそう Feature系は、例えば単純な GET/POSTなら良いが、 複雑な処理や大掛かりな シナリオテストなると
条件付けが増えるにつれて Pestの旨味を活かした感じを体感仕切れて いない Pestの性質上PHPUnitと大した差はない
所感 (主観) • PHPUnitでご飯を食べている人(ワイ) ◦ シナリオテストには向いてなさそう Feature系は、例えば単純な GET/POSTなら良いが、 複雑な処理や大掛かりな シナリオテストなると
条件付けが増えるにつれて Pestの旨味を活かした感じを体感仕切れて いない Pestの性質上PHPUnitと大した差はない ◦ ユニットテストとの相性は抜群 細かいテストや連結系テストには 大変強い感覚がある Pest自体がLaravel特化なので、 Eloquentとかのコアパッケージが 混ざったテストが書きやすい
所感 (主観) Featureレベル Unitレベル
所感 (弊社メンバー) • テストコードを書いたことない場合 ◦ テストだけどコードを書く感覚は変わらないの でそんな悩まなくてすみそう
所感 (弊社メンバー) • テストコードを書いたことない場合 ◦ テストだけどコードを書く感覚は変わらないの でそんな悩まなくてすみそう • PHPUnitに触れたことない人だったら ◦
メソッドチェーンで書けるのはわかりやすい ◦ JUnitだと1シナリオで全部を盛り盛りにするこ とがあるから、結局4~5000行とかのテスト コードから追わなきゃなので結局面倒になる のがPHPUnitも同じと聞いていたので、Pest ならいいかも
まとめ ポジティブ • PHPUnitをクロージャで書いているような感覚 • DataProvider等でテスト内容を切り出すとかを しないでも良い (逆説的にデータを汎用に作れば良い) • いざコードを読んだときに感覚的に何している
かを把握しやすい ネガティブ • シナリオテストなどの大まかなテストは得意で なさそうなのでPHPUnitで書いた方が安全そう • (個人的に)UnitをPest、FeatureをPHPUnit (Codeception)にするのが良いかも?
まとめ テストフレームワークを 複数組み合わせるならPestほど 単体テストに向いているものはない 「流れに沿って書く」というスタイルが最も 強いので、変更しやすいので保守性が高 い(と思っています) 単体テストをこれから書きたいと思ってい るならPestを導入することをオススメしま す
おまけ! (時間が余ったら) ミューテーションテスト(Infectionみたいなもの)
EOF