Hatena::Groupbugrammer

蟲!虫!蟲!

Esehara Profile Site (by Heroku) / Github / bookable.jp (My Service)
過去の記事一覧はこちら

なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています

 | 

2012-03-16

[]PHPUnitでテストを書くのが楽しい 04:35

 さすがに「テスト駆動開発」というのもおこがましい感じなので、今更ながらに、PHPUnitでテストを書いたという程度の言い方に止めておくのですけど、PHPUnit楽しい。というわけで、今回は何が楽しかったのかについてメモしておく程度。

PHPUnitって何?

 ここを読めばいいんじゃないかしら。というより、このブログを読んでいるんだったら、下のドキュメントを読んでいたほうが早いのじゃないかしらと邪推。要するにテストを便利に行ってくれるものですね。

 PHPUnit – The PHP Testing Framework

実際にテストを書いてみる

 いきなり書き散らすようにコードを書いたので、関数は作らないわ、重複は多いわ(DRY!!DRY!!)、さらに言えば、可読性が低いわ、と良い事が無かった。良い事がないということはバグも多く、何処に手をつけていいのかようわからんことになっていた。そんな中で「PHPやってるんだったら、PHPUnitとか使えばいいんとちゃうんか」みたいな話を教えられた。要するにテストやれよ、ってことなわけです。というわけで、リファクタリングの作業としてassertを書いていた。

 大抵、「この辺りは関数化できそうだな」という部分を見つけ出して、関数化してassertを書くわけなんだけれども、「これテスト書きにくいなー」という部分が危険信号なんだなというのがよくわかる。assertが書きにくい、ということはもう少し考える余地があるということなんだなと思う。それほど優秀なコーダーではないので、assertが書きにくくなる必然性のあるコードなんていうのは、たぶん書けないと思う。

 で、assertが書きやすいように、ソースを書き直して、必要があるなら関数も書き直すわけだけれども、「この関数では、この機能が期待されているんだよな」というのが、assertを書くことで明確化するのも助かる。assertを書くことによって、「この機能はこれが返されているべきなんだよな」というのがわかる。だから、返値の部分もちゃんとassertに書きやすいように変更する。で、最後にassertを書く。こうやってテストを積み上げていくことによって、確実に積み上がっている様子が目に見えるようになっていくので助かる。

 また、少なくともassertを書いた部分においては、機能は保証されているので、割と安心して次の工程に行けるのも心強いところ。

リファクタリングからテスト駆動開発もどきへ

 だいぶリファクタリングが進んでくると、「この部分は、新しく関数を用意して、機能として提供したほうがいいな」という部分が出てくる。PHPUnitといえばテスト駆動開発というのがあるな、ということを思い出したので、テスト駆動開発も覚えるために、先にassert部分を書いていく。

 「確か、この部分に関しては、この機能が必要だったんだよな」というのをぽちぽちとassertに書いていく。コメントにも「とりあえず、こういう機能が必要だったんだな」というのを書いていく。というより、コメントに自然言語で書くんだったら振舞駆動開発用のフレームワークでもいいじゃねえか、という気がするのだけれども、その辺に関しては改めて勉強することになる。

 テスト駆動開発についてさらっと読んでみたところ、「テストを書くのは、品質保証のためではない」ということが、なんとなくわかる。まず一つに「必要な機能を明確化すること」があり、それを「実現するための簡単な設計」ということがわかる。「あれ、何が必要だったのかな」とボケてしまったときには、改めてテストの記述に戻って、それを実装すればいい。そういう意味では、テスト自体が道標になっていて、とてもいい感じだ。

テストを書かないことの面倒くささ

 で、いわゆる挙動が一挙一動にわかって、仕様も頭に入っていて、それを追えるスーパーエンジニアみたいな人だったら、確かに「テストを先に書くこと」の面倒くささってあるんだろうなと思うんだけど、自分みたいに、コードを3行書いて「あれ、なんだっけ」という人間であったり、とにかく必要なコードを敷き詰めすぎて散漫になりがちな人間にとっては、「テストを先に書いて、それをグリーン(テストが通った状態)にしていく」という方法は逆に楽だなあという気がした。特に安心して、状態を積み上げていくという状態はとても気持ちが良い体験だった。

 もちろん、日常的にテストを書いているというか、テスト当たり前みたいな文化圏にとっては、それは日常的なもので退屈なものなんだろうな、という気がするんだけど。とりあえず、「こういう結果が欲しいんだよね」というのを書いていくだけでも、コードするべきことが明確になって勉強になったなと。

 とりあえずは、「先にこの部分はテストが書けそうだな」という部分からテストを書いて、そこから記述していくというスタイルはとてもいいなと思ったりしたので、今後も積極的にテストを書いていきたいと思った次第です。

テスト駆動開発について、ブログ上の記事

 テスト駆動開発については、ITメディアに2003年頃、既に出回っていたんだけれども、最近でも、下のブログが話題になったりしていた。本当ならば、書籍版の『テスト駆動開発入門』を読むべきなんだろうけれども、とりあえず「最初の一歩」という意味で参考になったりした。

  テスト駆動開発について僕は誤解していた - 偏見プログラマの語り!

 この辺のチートシートも参考に。

  テスト駆動開発チートシート - やさしいデスマーチ

 講演会動画など。

 ライブストリーミング配信、オンラインビデオ、ホスティングサービス | Ustream

 ニコニコ動画にもありますね。

 和田卓人の“テスト駆動開発”講座 by gihyojp - ニコニコ動画

 このあたりで、テスト駆動開発のイメージをつかみつつ、次は振舞駆動開発とか理解して、気持ちがいいコーディングをしていきたいところ。そういえば、フレームワークのあたりもやらないとなー……

RejaneRejane2012/06/12 12:31Thanks for sratting the ball rolling with this insight.

pyoyolnyinpyoyolnyin2012/06/13 04:06XTjj7j <a href="http://vanqqkshcwzp.com/">vanqqkshcwzp</a>

eecwiyseecwiys2012/06/14 02:56O4RD1l , [url=http://uttbkxwftfjr.com/]uttbkxwftfjr[/url], [link=http://werkvwpeiahn.com/]werkvwpeiahn[/link], http://hmcfssmegcuj.com/

gicsbvvgicsbvv2012/06/14 16:26yWgfA3 <a href="http://gkitanncglxx.com/">gkitanncglxx</a>

nezgovanezgova2012/06/15 17:11QD5l81 , [url=http://sfjzarqmgkqt.com/]sfjzarqmgkqt[/url], [link=http://mugvqioxhsor.com/]mugvqioxhsor[/link], http://zgkmftckzikq.com/

 |