##はじめに
Railsチュートリアルを学習すると、第3章にいかに「自動化テスト」が重要であるか書いてあります。テストの書き方については色々議論の余地があるそうですが、本記事ではテストについて自分なりに抑えていたほうが良いと思われることをまとめました。
##テストフレームワークについて
テストフレームワークにもいくつか種類があり、それぞれコード書き方等の特徴があります、ここでは主だった2種類のフレームワークを紹介します。
参考にしました →Railsの人気テストフレームワーク6選!
RSpecとMinitest、使うならどっち?
### Minitest
・Railsのデフォルトのフレームワーク。
・学習コストは比較的低い。
・Railsチュートリアルでも使用されている。
・処理速度は比較的早いといわれている。
・デフォルトの機能は必要最小限。
・コード量は少なく、シンプル
### Rspec
・自然言語で近い方たちで書かれている。
・利用率が高い。
・慣れるまでが時間がかかる。
・Minitestに比べると処理速度は遅いといわれている。
・デフォルトの機能は豊富。
・コード量は多くて、複雑。
どちらも一長一短みたいですね。初心者はMinitestから入って、その後Rspecも学ぶのが一番ですかね。
##テストの種類について
参考する文献によって2種類だったり、それ以上だったりしますが今回は2種類のテストについて紹介します。
参考にしました →Rails テスティングガイド
ソフトウェアテスト -wilki
### 単体テスト
関数やメソッドなど小さな単位で行うテスト。モデルやビューヘルパー単体の動作をチェックします。
例:
test "full title helper" do
assert_equal full_title, "Ruby on Rails Tutorial Sample App"
end
assertとはオブジェクトまたは式を評価して、期待された結果(true)が得られるかどうかをチェックするコードです。
上記はassert_equalがfull_titleが"Ruby on Rails Tutorial Sample App"と完全一致しているかどうか検証しています。
test "name should not be too long" do
@user.name = "a" * 51
assert_not @user.valid?
end
assert_notとは、assertとは逆にfalseが得られるかどうかをチェックするコードです。
上記はユーザーの名前が51文字の場合、ユーザーが有効でないことを検証しています。
### 統合テスト
プログラムを組み合わせて行うテスト。個々の機能が正しく連動しているか、ユーザーの実際の操作を想定してチェックします。
例:
test "login with valid email/invalid password" do
get login_path
assert_template 'sessions/new'
post login_path,params: {session: { email: @user.email,
password: "invalid"}}
assert_not is_logged_in?
assert_template 'sessions/new'
assert_not flash.empty?
get root_path
assert flash.empty?
end
上記は、有効でないパスワードを入力したユーザーに対するテストを行っています。
1. getメソッドでログインページ(login_path)を生成する。
→get login_path
2. ログインページのテンプレートが選択されているか検証する。
→assert_template 'sessions/new'
3. login_pathへ有効なメールアドレスと有効でないパスワードを投稿する。
→post login_path,params: {session: { email: @user.email,password: "invalid"}}
4. ユーザーがログインしていないことを検証する。
→assert_not is_logged_in?
is_logged_in?メソッドは下記により定義されています。
#テストユーザーがログイン中の場合にtrueを返す
def is_logged_in?
!session[:user_id].nil?
end
5. ログインページのテンプレートが選択されているか検証する。
→assert_template 'sessions/new'
6. エラーメッセージが表示されていることを検証する。
→assert_not flash.empty?
7. getメソッドでホームページ(root_path)を生成する。
→get root_path
8. エラーメッセージが表示されていないことを検証する。
→assert flash.empty?
という流れになっています。
#まとめ
正直Railsチュートリアル終えても自力でテストをかけるか自信がないです。また、テストはどこまで厳密にやるかセンスが問われそうですね。数をこなしてなれていくのが大事だと思いました。