Help us understand the problem. What is going on with this article?

Railsにおける単体テスト(Railsチュートリアル)

はじめに

自分が作成したWebサービスに単体テストを何気なく導入していましたので、ここで一旦立ち止まって、詳しく分かりやすくアウトプットしていこうと思います。

そもそも単体テストとは何か??

めちゃくちゃ簡単に言うと

合体前の部品(メソッド、モデル、ビューヘルパー)が、それぞれちゃんと動くかを確認するテストのこと。

下記の記事が用語自体の理解をするには非常に分かりやすいので参考にしてみてください。
単体テストとは

コードの解説

ここではRailsチュートリアルの「3.3 テストから始める」編を例にとってみていきます。
Railsチュートリアル3.3テストから始める

まずコントローラの作成で

$ rails generate controller StaticPages home help

を実行した時点でコントローラーのファイルに付随してテスト用のファイルも作成されるため、このテスト用のファイルにテストコードを書いていくことを理解する。

作成されたテスト用ファイルはこちら。

test/controllers/static_pages_controller_test.rb

中身を見ていきましょう。

require 'test_helper'   #test_helper.rbが読み込まれる

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  test "should get home" do     #homeメソッドに対するテストコード
    get static_pages_home_url
    assert_response :success
  end

  test "should get help" do     #helpメソッドに対するテストコード
    get static_pages_help_url
    assert_response :success
  end
end

ここではコントローラを作成したと同時に作成されたhomeとhelpのメソッドに対するテストが書かれています。ここで書かれているテストコードは自動で作成されたものなので、これを場合によっては編集して実際にテストコードとして有効なものへと自分でいじっていかなければなりません。

上のコードを理解する前に
まずは下記の2つのコードが同等に振る舞うということを理解します。
これはRailsガイドにも書かれています。
Railsガイド

test "the truth" do
  assert true
end
----------------------------------------------------------------------------------
def test_the_truth 
  assert true 
end

上記のことから先ほどのhome,helpメソッドは下記のようになります

def test_should_get_home       #homeメソッドに対するテストコード
    get static_pages_home_url
    assert_response :success
end

def test_should_get_help       #helpメソッドに対するテストコード
    get static_pages_help_url
    assert_response :success
end

ここでなぜわざわざdefじゃなくてtestというコードを使うの?
と思われた方もいるのではないでしょうか。僕も思いました。
おそらくメソッド名の命名に気を使わなくて良くなり、扱いやすいからだと僕は解釈しています。

では次にメソッドの中身を見ていきましょう。

get static_pages_home_url
assert_response :success

簡単に訳すと、
「static_pages_home_urlを取得して、取得したものを評価し、成功と返す」
となります。

詳しく書きます。

  • 1行目にstatic_pages_home_urlをgetする(取得する)ということをあらわしています。

  • 2行目にその取得したurlから返ってきたHTTPステータスコードが200なら成功ということをあらわしています。

assert_responseに関してはRailsガイドを参照します

assert_response(type, message = nil)
レスポンスが特定のステータスコードを持っていることを主張する。:successを指定するとステータスコード200-299を指定したことになり、同様に:redirectは300-399、:missingは404、:errorは500-599にそれぞれマッチする。ステータスコードの数字や同等のシンボルを直接渡すこともできる。

ステータスコードとは、「PCやスマホの画面にこのウェブサイトを表示させたい」という<リクエスト>に対し、「現在このサイトは表示できません」「このサイトはURLが変更になりました」などのウェブサーバーからの<レスポンス>を表す数字のことで下記のような組み合わせとなっています。

以上のテストコードからここではhome,helpメソッドが単体でテストされているという解釈になります。

終わりに

ここではRailsチュートリアルにおける単体テストをほんの一部ではありますが記述しました。
また編集と改善を繰り返して行きたいと考えています。
私も勉強中であるため誤りがあるかもしれませんが、指摘していただけると幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした