Laravel 演習入門

テスト駆動入門

当サイトにおける「テスト駆動入門」とは、 Laravel という巨大なフレームワークへの入門を、小さいテストに分割して、ひとつずつ進めていこう、という主旨です。

当サイトの管理人(私)は、職業プログラマーではないので、実務における「テスト駆動開発(TDD)」がどのような意味なのか分かりません。
しかし、 Kent Beck さんの「テスト駆動開発」(2017年, オーム社)によれば、テスト駆動開発とは、難しい問題を、小さいテストに分解して、安心しながら進めるという方法論のようです。

ということは、 Laravel にも、テスト駆動で入門できるはずです。

当サイトでの入門方法

各問題ページには、ひとつの問題が書かれています。
その問題を、テストを書きながら解いてください。

問題に続き、以下の項目が書かれています:

上記項目はいずれも details タグで隠されていますので、クリックして開いて、読んでください。

テストは分割できる

テストがどうしても成功しない場合、テストが大きすぎるのかもしれません。
テストは、分割できます。

たとえば、 /example にアクセスしたとき、いろいろな処理をした結果、 <<result>> という結果が欲しいとします。

一般的な Laravel サイトなら、以下のような順序で処理が進みます:

最終的に返却される response オブジェクトが、 <<result>> に適合するかどうかを調べるのが、この場合、最も大きなテストです。
しかしこれが、なかなかうまくいかないなら、途中の処理をテストしてみてください。

上記の例でいえば、routing のテスト、middleware のテストなど、6種類のテストが書けるはずです。(実際は、もっと細かい処理に分かれているかもしれません)

処理の最初から、順番に試しても良いですし、「二分探索」などをご存じの方は、半分ずつテストしていって、最小の分割でうまくいかないところを探してみてください。

当サイトの問題は、 Laravel の処理を知るための、単なるきっかけに過ぎません。
自由に、テストを書いてください。

テストは主観的に決める

テストは、小さく分割することをオススメしますが、どれくらいを小さいとするかは、「主観的に」決めてください。

当サイトには解答例を書いていますが、これはあくまでも、「私が」安心できる小ささに分けているだけです。
もっと細かくテストを分割しても良いですし、慣れたら、一気に一番大きなテストだけ試しても OK です。

このサイトの目的は、正しいプログラムを書くことではありません。
あなたが(そして私も)、Laravel に入門して、使えるようになることです。

実務では、カバレッジを一定率以上に保ったり、境界条件のテストを書いて、テストの客観的な正当性を担保させるのかもしれません。
しかし、このサイトのテストは、入門者(あなたと私)が、安心して Laravel を試すためのものです。

問題を読みながら、「どんなテストが通れば、自分は安心できるかな」と考えるだけで十分です。
自分以外には、不要と思われるテストを書いても良いし、他人は必要だといってくるテストでも、その部分に不安を抱いていないなら、書かなくて良いです。

もちろん、カバレッジを高く保つことで「自分が」安心できるなら、カバレッジ中心にテストを書くのも OK です。

Red Green Refactor

テスト駆動開発では、以下の手順で問題を解いていきます。

  1. 小さいテストを書く
  2. テストの失敗を確認する(エラーが赤く表示される:Red)
  3. 多少格好悪い方法でも良いので、成功するように変更する(成功した結果緑色に表示される:Green)
  4. 整理整頓を行う(これをリファクタリングという:Refactor)

これを繰り返しながら、少しずつ通せるテストの範囲を広げていき、最終的には大きな問題を解けるように近づけていきます。
「Red Green Refactor」の繰り返しで、テスト駆動入門は進めていきます。

… とはいえ、やってみないと分からないことも多いでしょう。

最初の問題である Hello World を解いてみて、実感してみてください。