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

『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya

『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya

PHPカンファレンス名古屋2025の発表資料です
https://fortee.jp/phpcon-nagoya-2025/proposal/436ec84b-1ab6-46a4-abb8-a29abaf8a817

hideki kinjyo

February 22, 2025
Tweet

Resources

第1回 学習用テスト ~学びを自動テストとして書く~ | gihyo.jp

https://gihyo.jp/dev/serial/01/savanna-letter/0001

PHPでスナップショットテストをやってみる

https://zenn.dev/naopusyu/articles/a52403c21d67f5

SQLクエリに対するスナップショットテストの実践例

https://zenn.dev/loglass/articles/863404c8ebfd60

スキーマ駆動開発を支える開発プロセス&ツール群

https://zenn.dev/litalico/articles/re-architecting-rezept2

PHPerKaigi 2024: Laravel OpenAPIによる "辛くない" スキーマ駆動開発 / 武田 憲太郎 - YouTube

https://www.youtube.com/watch?v=W6Tt4ETODP8

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. イントロ   [ग़య] 
 ᴷ Meszaros, Gerard. 
 ʰxUnit

    Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler)) Kindle dition. ʱP20
  2. 自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h / 𝕏

    : @o0h_ • 好きなFWはCakePHP • アイコンは美味しい鮭親子丼の写真です • 最近はPodcastをやっています • ハッシュタグ: #readlinefm • これで3年連続・4度目の名古屋です  
  3. ① 複雑さ: 考えることが多くて、とっても複雑   「有効なユーザー名」の ルールを確認しなきゃ 判定は正規表現? バリデーションのラ イブラリって入ってるんだっ

    け? このルールを使うのはここ だけ? 失敗したらfalse? 例外投げる? 事前にチェックされ てるのは?nullも来る?string だけ? メソッドを切るのが良いのか な、インラインでいいのかな 引数名はどうしよう 違反内容はどこまで記述する? メッセージはUIにそのまま出 される?別で解釈される? 文言、ですます長だっけ?
  4. ① 複雑さ: 考えることが多くて、とっても複雑   「有効なユーザー名」の ルールを確認しなきゃ 判定は正規表現? バリデーションのラ イブラリって入ってるんだっ

    け? このルールを使うのはここ だけ? 失敗したらfalse? 例外投げる? 事前にチェックされ てるのは?nullも来る?string だけ? メソッドを切るのが良いのか な、インラインでいいのかな 引数名はどうしよう 違反内容はどこまで記述する? メッセージはUIにそのまま出 される?別で解釈される? 文言、ですます長だっけ? ビジネス 「ビジネスルール」、「コーディングガイドライン」、 「他の箇所との一貫性」、「設計レベルの判断」、「細 やかな可読性や堅牢性」etc.. 
 ⇑ 
 様々なレイヤーの判断が押し寄せる
  5. ② 緩慢さ: 制約が「ソフト」で、逸脱や違反に対して鈍感   $me->cut($cake, -10000) みんなに 
 ケーキを切り分けよう!

    ビジネス 現実なら「意識する前から存在していた法則」が 
 物理世界に留まるようにガイドするが、 
 制約はプログラマが恣意的に与える必要がある。 
 ⇓ 「自然」がなく、常に思考に負荷が掛かる
  6. ③ 曖昧さ: 実現したいことに対して、実装方法や完成度が曖昧 Q. 「買い物にいって牛乳を1つ買ってきて。卵があったら6つお願い」   牛乳は 
 ハードコーディングで良い?

    卵はキャッシュから使い回 せる?だめ? (プログラミングにおいては)問題が明確になりにくく、 
 解法は更に多くのバリデーションを発生させる 買い物に行くのはログイン が必要?匿名で良い?
  7. ③ 曖昧さ: 実現したいことに対して、実装方法や完成度が曖昧 Q. 「買い物にいって牛乳を1つ買ってきて。卵があったら6つお願い」   牛乳は 
 ハードコーディングで良い?

    卵はキャッシュから使い回 せる?だめ? (プログラミングにおいては)問題が明確になりにくく、 
 解法は更に多くのバリデーションを発生させる 買い物に行くのはログイン が必要?匿名で良い? ビジネス 「現実」から「論理」に翻訳するということは、 
 本質的に「形を変えて表現する」作業となる。 
 出題の意図と回答が、"==="で結びつかない世界。 
 ⇓ 
 ゴールを「固定」しないと完成に到達しない
  8. 複雑さをテストで易しくする例   複数の要素からなる配列を受け取る 
 コレクションクラス `avg()`メソッドで、全要素の平均を返す 平均ってことは、 
 まずは全部を足して

    
 要素数で割ればOK? 要素が0個の場合も 
 考えないと int/floatだけとも 限らないよな PHP_INT_MAX超えるかもしれない nullはどう扱おうかな
  9. 緩慢さをテストで取り締まる例   求人案件の登録で、 
 提示年収を管理する機能 年収って言ったら 
 渡そうとしたら駄目だぞ 明らかに

    
 会社の資本力と見合っていない 
 ドングリやハマグリを受け付けるべきでない ハマグリを使うなら 
 予め「ハマグリ輸送手段」が 
 設定されているべきだ
  10. ② 書いてもgit commitしなければ自分だけの世界 • 書いたコードを、必ずしもpushする必要はない • 「消す前提のコード」を書いても良い • t-wadaさん「学習用テスト」 •

    資産として残しておきたいなら、`.git/info/exclude` もおすすめ • 自分だけの.gitignoreみたいなもの。 • ここに学習用テストや、スニペット等をおいておくと便利になるかも  
  11. ③ 自分が書いたテスト以外を「使う」 • 通常のコードと同じく、 
 「書く」のと同じくらい「たくさん読む」ことも重要 • 普段利用しているフレームワークやライブラリのテストコードを 
 よく読んでみることで、一石二鳥の経験値を獲得できる

    • 手元で動かしてみると更に◎ • その際に、パラメータなどを書き換えてみることで実装の理解もしやすくなる • 「この値を受け取った時にどうなるんだろう」という興味本位で 
 弄り放題、壊し放題!なのは楽しいしオススメ  
  12. 興味を持った人向け: べりべりオススメリソース • 『TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング』

    
 https://www.youtube.com/watch?v=Q-FJ3XmFlT8 • とにもかくにも、「テストを味方にして開発を楽にする」が全部ある動画 • 『ソフトウェア品質を高める開発者テスト 改訂版 アジャイル時代の 実践的・効率的でスムーズなテストのやり方(高橋 寿一)』 
 https://www.shoeisha.co.jp/book/detail/9784798176390 • 開発経験のある人が「テストってどういう感じ」に初めて触れるのに良い感じ  
  13. 参考書籍 • 『誰のためのデザイン? 増補・改訂版:認知科学者のデザイン原論』 
 https://www.shin-yo-sha.co.jp/book/b455574.html 
 『人を賢くする道具』 
 https://www.chikumashobo.co.jp/product/9784480511270/

    • 「制約」「フィードバック」によって何が与えられるか、人間が苦手とするもの、とい う観点はノーマンの著作から大いに影響を受けました • 『xUnit Test Patterns: Refactoring Test Code』 
 https://www.informit.com/store/xunit-test-patterns-refactoring-test- code-9780132800051 • 自動テストやテストの品質(持続可能性)についての話題を扱う本ですが、"Test as Safety Net"は本トークの主要な要素の1つ(の原型)になりました