テスト駆動開発
「ソフトウェアのテストを書きましょう」という人はたくさんいます。 でもどうやって書くかや、ソフトウェアテストについて説明してくれる人って意外と少ない気がします。
今回はただ動くものを作るだけではなく、必要な箇所にはテストを書きましょう。
テストの種類について
ソフトウェアを中心としたphpでのテストの場合は大きくわけて2つのテストに別れます。
- ユニットテスト
- 機能テスト
ユニットテストは、関数やメソッド単位でテストを行うことをさし、機能テストはもっと全体的に機能を動かしてテストを行います。(たとえばHTTPリクエストを送って正しいレスポンスが返ってくるかを検査したり)
テスト駆動開発とは?
最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。
https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA
ここで指すテストはユニットテストになります。
- ユニットテストを先に書きテストを失敗させる
- テストが通るだけの実装をする(正しく動作するわけではない)
- 正しくコードが動作するように修正する
というサイクルで開発することをテスト駆動開発といいます。 より実践的な話をするとTODOリストを用意し、そこを潰しながら実装してきます。
T-wadaさんのこの動画を見るとより参考になります。
https://www.youtube.com/watch?v=Q-FJ3XmFlT8
Laravelのテストについて
基本的には tests/Feature
or tests/Unit
のディレクトリにテストを配置していけばテストができます。
実行するには artisanコマンドを使います。
$ docker-compose exec php php artisan test
ユニットテストだけを実行する場合。
$ docker-compose exec php php artisan test tests/Unit
テストを作成する
これもコマンドが用意されています。
$ docker-compose exec php php artisan make:test UserTest --unit
今回のテストについて
今回はユニットテストを書いていくという方針を取ります。
機能テストはちょっと大変な側面もあるので今回はユニットテストだけを書くようにします。
本来の開発ではしっかりと機能テストも書きます。
TDDに正しく準拠しているわけではなく、TDDになるべく近いかたちでテストを書いていきます。