🤖

「テスト駆動開発」をPHPで写経してみた

2021/05/02に公開

「テスト駆動開発」をPHPで写経してみた

モチベーション

エンジニアをやっていると何を学んで何を学ばないのか、どういう順で学んでいくのか、という悩みはあるあるだと思います。
筆者はたまたま、これを読んだのと合わせて、これを聞いた時に今の自分に丁度良さそうだと感じたので早速やってみました。
使用言語には迷ったのですが、現職のメイン言語であるPHPを使いました。

成果物

https://github.com/isanasan/php-tddbook
4月1日に写経を開始してだいたい毎日約一時間ずつ作業を進めて完走できたのが4月30日なので、正味作業時間は30時間程度だと思います。

ハマったところ

オブジェクトの型キャスト

第三章のvalueObjectパターンを適用するところで、引数をObject型で受け取ってキャストするのをphpでどうやるのか悩みました。いろいろ調べてこちらの記事を読み
https://budougumi0617.github.io/2020/01/29/php-cast-original-class/
「キャストのためにわざわざメソッド生やさなきゃダメなの?」となりましたが、筆者はキャストを行わず任意の型を引数で指定する実装にしました。

hashMapを使う

第十四章の為替レートを保持する仕組みをhashMapで実装しているところで、phpでどのように実装するか悩みました。ここではphpの配列を使って単純に実装しました。phpの配列はなんでも入れられるし、便利な組み込み関数がたくさんあるのでこういう時にやくにたちます。

testMethodの動的な呼び出し

第十八章の、テストケース名を問い合わせて戻ってきたオブジェクトを関数として実行する処理をphpでどうやるのか分からず悩みました。この部分はググり方から検討がつかなかったので、同じようにTDD本をphpで写経している人のリポジトリを探して参考にしました。
https://github.com/shin1x1/book-tdd-php
PHPの現場でおなじみの新原さんのリポジトリを見付けてありがたく参考にさせていただきました。ここは結局call_user_func()で一発でした。

assert()が例外を投げてくれない

同じく十八章のassert()を使ってテストの失敗を検知する実装でassert()が例外を吐いてくれませんでした。ここはドキュメントを読んで、php.iniに

zend.assertions = 1

を設定して解決しました。

まとめ

普段なにげなくコードを書いていて、自分のパフォーマンスが良いときもあれば悪いときもあるという感じなのですが、TDDという具体的な手法に則ってプログラミングすることで一皮剥けそうだなという気がしています。とはいえ日頃から実践して身につけてはじめて役に立つものだとも思うので、当面は意識的にTDDを実践してみようと思います。

Discussion