【Ruby on 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ページのテスト。
Ruby on Rsilsチュートリアル第3章 3.3.1 最初のテストGET
リクエストをhome
アクションに対して発行 (=送信) せよ。そうすれば、リクエストに対するレスポンスは[成功]になるはず
英語を翻訳したものであるから、多少読みにくく感じる。
違う言葉で表すと、以下がしっくり来た。
Railsのテストはブラウザのリクエストをシミュレートできる
Rails ガイド 1 Railsアプリケーションでテストを作成しなければならない理由
要はActionDispatch::IntegrationTestのgetメソッドは、引数にURLを渡してやればコントローラ – アクション – ビューが正しい動きをするか確認できるといった感じなのだと思う。
だから日本語に直すと以下のような感じなのだと思う。
test "テスト名" do
get 送信するURL
GETリクエストを送信した結果を検証
end
shouldは「〜すべき」だから”homeビューが表示されるべき”って感じのテスト名なのだろう、きっと。
それぞれのメソッドはドキュメントに説明が載っていた。
メソッド | 説明 |
get | GETリクエストを送信 |
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章を進めていこうと思う。
ディスカッション
コメント一覧
まだ、コメントがありません