【Ruby on Railsチュートリアル】第3章で出てきたテストとは何か

どうも、てーやま(@daigo_takayama)です。

ブログを書くにあたって技術ネタは「〜だ。」

それ以外は「〜です。」と、語尾に変化を付けて書いていこうと思います。

今回は技術ネタなので、前者ですね。プログラミング言語のドキュメントも「〜だ。」「〜である。」と書かれているのでそれに倣おうと思います。

Railsチュートリアル第3章のテストについて
初めて出てきたテストについて少しまとめてみたい

Ruby on Railsチュートリアルを進めて第3章に入った。

私はProgateでRuby,Railsと出会い、ProgateのRailsコースを修了していないが、ある程度の基礎を積んでからRailsチュートリアルを進めている。

今回は第3章で初登場のテストについて、自分なりにまとめてアウトプットしようと思っている。

何故なら、私にとって初の見聞であり、そういった知識は自分の言葉で書いた方が覚えるのだ。更に、後で見返す備忘録になるだろう。

毎度の事ながら、私の実力は全くの初心者に毛が生えたレベルなので、記事の内容は浅いと思うがご了承頂きたい。

第3章での最初のテスト

Railsチュートリアルで紹介されているテストソースのコードを見てみよう。

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  test "should get home" do
    get static_pages_home_url
    assert_response :success
  end

  test "should get help" do
    get static_pages_help_url
    assert_response :success
  end

これはまず、testメソッドが2つあることが分かる。

そしてその目的は以下だとチュートリアルには書かれている。

Homeページのテスト。GETリクエストをhomeアクションに対して発行 (=送信) せよ。そうすれば、リクエストに対するレスポンスは[成功]になるはず

Ruby on Rsilsチュートリアル第3章 3.3.1 最初のテスト

英語を翻訳したものであるから、多少読みにくく感じる。

違う言葉で表すと、以下がしっくり来た。

Railsのテストはブラウザのリクエストをシミュレートできる

Rails ガイド 1 Railsアプリケーションでテストを作成しなければならない理由

要はActionDispatch::IntegrationTestのgetメソッドは、引数にURLを渡してやればコントローラ – アクション – ビューが正しい動きをするか確認できるといった感じなのだと思う。

だから日本語に直すと以下のような感じなのだと思う。

test "テスト名" do
    get 送信するURL
    GETリクエストを送信した結果を検証
  end

shouldは「〜すべき」だから”homeビューが表示されるべき”って感じのテスト名なのだろう、きっと。

それぞれのメソッドはドキュメントに説明が載っていた。

メソッド説明
getGETリクエストを送信
assert_responseアクション実行結果のレスポンスコードを検証

テストの失敗からあるべき姿を実装していくテスト駆動開発(TDD)

テスト駆動開発とは
あるべき姿が実装できているか?

テストコードを眺めていて思うが、railsのテストは「このアプリケーションはこうあるべき」というコードを書いていくのだろう。

テストコードが「失敗」するとは、即ち、あるべき実装が出来ていないということだ。

私たちは欲しい機能が未実装であるために失敗するテストをあえて最初に作成していることにご注目ください。続いてその機能を実装し、それからもう一度実行してテストがパスすることを確認しました。ソフトウェア開発の世界ではこのようなアプローチをテスト駆動開発 ( Test-Driven Development (TDD) : TDD) と呼んでいます。

Railsガイド 2.4最初の失敗するテスト

Railsガイドによると、テストが失敗する→あるべき姿に何が足りないのか不足しているものを実装していく。これをテスト駆動開発(TDD)と呼ぶそうだ。

では、次にRailsガイドのテストコードを見てみよう。


test "should not save article without title" do
  article = Article.new
  assert_not article.save
end

上記のテスト名は”タイトルが入力されていなければ保存されてはいけない”という感じだろう。(should notは、〜されてはいけない)

assert_notメソッド調べると、引数として渡したテストの結果が偽であれば正常を返却するようだ。

と、言うことは、日本語に直すと以下のようになるのだろうか。

test "タイトルが入力されていなければ保存されてはいけない" do
  article = Article.new
  assert_not データベースの保存が出来るかどうか
end

これに対してRailsガイドでは、以下のようにtitleに対するバリデーションを実装することでテストが正常に通るようになる。

class Article < ApplicationRecord
  validates :title, presence: true
end

バリデーションを実装することで、titleが空であった場合、データベースへの保存は出来ないという制限を実装したことになる。

これによって、今までは必ずassert_notメソッドは真となっていたためテストが通らなかったが、偽が返却される選択肢を実装したため、テストが正常に通るようになったのではないかと解釈した。

また、これは補足だが、assert_notメソッドの引数に”メッセージ”を渡すことで、テストが失敗した時にそのメッセージが表示されるようになるようだ。

test "should not save article without title" do
  article = Article.new
  assert_not article.save, "Saved the article without a title"
end

上記の例であれば、テスト失敗時に”Saved the article without a title”と表示されるため、どこで落ちているのか容易に発見できる。

それでは、引き続きRailsチュートリアル第3章を進めていこうと思う。