Controller編
Railsにおけるテスト[Controller編]
はじめ
なんとなく最近色々考えていたので自分流のRailsにおけるテストの書き方について書きたいと思います。
あと、大体の文を断定系で書いていきますが、一般的に言われているかどうかはあまり考えずに自分の中で思っていることを書いてますので絶対に正解だとは思わないで、疑問に思った箇所は自分で調べてみましょう。
とりあえず今回の導入に続いてコントローラ編、モデル編まではとりあえず書こうと思ってますので具体例はその時に書きます。
導入編
今回はRailsに限らずテストを書いていく上で考慮していることや守っている原則などを書いていきます。
項目は少ないのでそんなに身構えずに読んでみてください。
またこの記事を参考にしなくともweb開発でTDDやBDDを使えると使えないとではコードの保守性、生産性、技術力の向上、すべてにおいて差がでると思いますので、ぜひテストの書き方をいろんなサイトや書籍で学んでみてください。
実装の前にテストを書く
これは新たな機能の追加や、バグ修正などにおける大原則です。別に先に書こうが後から書こうが同じだろうみたいなことを考えてしまう人もいるかもしれませんが全く違います。
後からテストを書くと先に書いた場合に比べてテストの質も量も劣ってしまう傾向にあると考えています。
また、テストを先に書くことで全体の実装自体がテストファーストな実装になりやすくなります。
具体的にはDI(Dependency Injection)などを意識したコードなどが書きやすくなります。
テストには仕様を書く
これはコードが実際にあった方がわかりやすいので具体例をあげます。
※今後全てのテストコードの説明部分は日本語で書いていきますが、実際のプロジェクトではプロジェクトに合わせてください。
it 'エラーを返す' do
# テスト
end
it 'パスワードが6文字以下の時にエラーを返す' do
# テスト
end
もうわかると思いますが下の方が圧倒的にテストの意図がわかりやすいと思います。
もっと大きな利点はこれをプロジェクト全体で徹底すればテストコードに仕様が全て書いてあるようになります。つまりテストコードを見れば足りていない機能や現在実装されている機能が全てわかるようになります。
さらにもう一つの利点としてはチーム開発をしている時にレビュアーが非常にレビューをしやすくなります。何を実現するために書いたコードなのかが明確になるためです。
テストコードに書いていないことは実装しない
1つ上の項目の利点と被りますがこれを守れないと上の項目の利点が全て失われてしまいます。なので必ず守るようにしましょう。
テストコードを過度に共通化しない
テストコードはあまり共通化する必要はありません。これも具体例があったほうがわかりやすいと思うのでコードを挙げます
テストコードで大事なのは
- 何を入力とし
- どういう処理が走ることを期待し
- どういう出力になるか
が全てわかりやすく書かれていることです。
共通化を必要以上にやりすぎてしまうと上で上げている1,2,3が分散してしまって何をテストしたいのかが分かりづらくなってしまう可能性があります。
なので個人的にはあまりに処理の重複が多くなりすぎない程度のテストならばlet
, before
以外は使用せず、ほぼすべてをit
の中に書いてしまってもいいのかなと思っています。
おわり
バーっと思いついたのを構成も考えずに書き出したので、けっこうめちゃくちゃな部分もあるかもしれませんが、主に自分がテストを書くときに考えていることを羅列してみました。
他にも思い出したら随時追加していくかもしれません。
またちょっとしたらRailsのコントローラテストと、モデルテストのオレオレ流書き方を具体例とともに投稿したいとおもっています。