Ruby on RailsにおいてのTestとは

Railsにおいてのテストとは、制作したアプリケーションが想定通りの動きをするかどうかを確認する為のものです。

吉田先生

テストの為のファイルに期待する動作を記述し、テスト実行コマンドを使用するという方法で行われます。


Testとは

Railsにおいてのテストとは、制作したアプリケーションが想定通りの動きをするかどうかを確認する為のものです。これは、テストの為のファイルに期待する動作を記述し、テスト実行コマンドを使用するという方法で行われます。

そして、制作したアプリが、その記述通りに動作する仕様になっていればテストは成功となります。逆に、コードにミスがあり期待する動作が実現しない仕様になっていれば、テストは失敗という結果が返ってきます。

上記イメージのテスト例の場合、空の記事を投稿する事が出来なければテストは成功です。

テストの必要性

開発環境やステージング環境などで、実際にアプリを動かして画面で確認を行えば良いという風に、テストの必要性が感じられない方がいるかもしれません。もちろん、デザイン面などの崩れも確認する必要があるので画面での確認も必要です。

ですが、この方法だけでは、機能面の確認を行う場合一つ一つの動かして確認しなければならないので時間がかかってしまいます。

その点テストは、ファイル内に期待する動作がまとめて書かれていて、テスト実行のコマンド一つでこれらの動作確認が行えるので、制作スピードをあげる事が出来ます。

また、テストを実行して失敗した場合、どの動作がうまくいかないのかを知ることが出来ます。これにより、コードミスなどの特定を容易に行う事が出来るのです。

上記イメージは、テストファイルの一部分・テスト実行コマンド・実行結果です。上記の様にテスト実行結果では、テストファイル内の失敗したテストについて情報が表示されます。

たとえば、どの動作が失敗したのか・テスト失敗に関するメッセージなど詳しく表示されることが分かると思います。

更に、テストファイルがあれば、コマンド一つで何度もテストを行う事が出来ます。これは、既存のコード(機能)を壊してしまうことを回避する為に役立ちます。

たとえば、新機能の追加を行ったとき、その機能はうまく動作したとしても、既存機能部分でバグが起こる可能性もあります。そういった場合でも、既存機能の為のテストが存在していれば、コマンド一つで既存機能への影響を確認する事が出来ます。

テストの種類とファイル

Railsでのテストにはいくつかの種類があります。今回の、テスト講座では代表的な3つのテストについて学んでいきます。

まず、Unit test と呼ばれるモデルの為のテストです。これは、モデルの作成時点でテストの為のファイルも一緒に作成されます。主に、データベース関連のテストを行います。次に、Controller test です。

こちらも、コントローラの作成時点でテスト用ファイルが作成されます。主に、httpリクエスト(Controller testの章で詳しく説明します)やViewの中身のテストを行います。

最後に、Integration testです。これは、結合テストとも呼ばれています。先ほどの2つのテストは基本的に、モデルならモデル部分のみのテストという形でした。しかし、このテストはモデルやコントローラ等などの区切り無く、全体のテストを行います。

具体的に言うと、ユーザーがそのアプリにアクセスしてからの動作の流れをテストします。たとえば、ログインしてマイページに入り、記事を投稿して...という感じです。

また、Integration testは手動でテスト用ファイルを作成する必要があります。そして、他2つはモデルごと、コントローラごとにそれぞれ1つづつファイルが存在します。

フィクスチャ

フィクスチャとは、レコードのサンプルを作成する為のものです。テストは、テスト環境で行われます。テスト環境では、開発環境や本番環境で作成されたレコードは存在しないものなので使用できません。

ですので、レコードがある前提でのテストなどは、フィクスチャでテストの為のサンプルレコードを用意する必要があるのです。

また、フィクスチャは「YAML」というファイルで設定します。このファイルは、モデルの作成時点で一緒に作られます。また、モデルごとにファイルが作られます。

上記はYAMLファイルの例です。まず、レコードの名前が設定されています。例では「one / two」と数の名前が使用されていますが、数でなくてもかまいません。

そして、コロンと改行がありカラム型:値という形で書かれています。このサンプルレコードは、テストファイル内で(:サンプルレコード名)という形などで使用する事が出来ます。

ですので、テスト環境には開発環境などでのレコードが存在しなくても。レコードが〇〇な時~というようなテストが行えるという事です。また、上記の例は関連するモデルなどがない独立したモデルの場合のYAMLファイル例です。

ですが、複数のモデルやコントローラがあり「has_many / belongs_to」などで関連付けが行われている場合、他モデルのサンプルレコードデータを使用する事も出来ます。

テストの書き方

テストを書くときは「test "テストの内容" do」という形で書き始め、このブロック内に期待する動作を記述します。この例の場合、真となるはずだというテストです。ブロック内では、真となる事がテストの成功となると書かれています。

もう少し詳しく見てみます。まず「assert」という部分はアサ―ションと呼ばれるものです。これは、アサ―ションに続く部分に書かれた条件をどのように判断するかを決めるものです。この例では、アサ―ションの次に「true」と書かれています。

ですので、真である時...という意味になります。そして、このアサ―ションはテスト結果は真と判断するという意味です。繋げると「真である時、テスト結果は真(成功)」となりますね。

テストは、このようにアサ―ションやブロックなどを使用して書いていきます。また、アサ―ションは、複数用意されています。下記は、代表的なアサ―ションです。テスト内容によって、これらを使い分けていきます。

assert テスト成功
assert_not テスト失敗
assert_difference ブロック内の処理が実行されたとき、処理部分の引数の値が変動すればテスト成功
assert_no_difference ブロック内の処理が実行されたとき、処理部分の引数の値が変動しなければテスト成功
assert_redirected_to リダイレクトが正しく行われればテスト成功
assert_equal 指定した2つの値が等しければテスト成功
assert_not_equal 指定した2つの値が等しくなけれテスト成功
assert_nil 指定オブジェクトがnilであればテスト成功
assert_not_nil 指定オブジェクトがnilではなければテスト成功
assert_empty 指定オブジェクトが空であればテスト成功
assert_not_empty 指定オブジェクトが空ではなければテスト成功
assert_instance_of 指定オブジェクトが、指定クラスのインスタンスであればテスト成功
assert_not_instance_of 指定オブジェクトが、指定クラスのインスタンスでなければテスト成功
assert_kind_of 指定オブジェクトが、指定クラス・または指定クラスのサブクラスのインスタンスであればテスト成功
assert_not_kind_of 指定オブジェクトが、指定クラス・または指定クラスのサブクラスのインスタンスでなければテスト成功
flunk 必ず失敗すると主張する

まとめ

テストとは、制作したアプリケーションが想定通りの動きをするかどうかを確認する為のものです。

テストの為のファイルに期待する動作を記述し、テスト実行コマンドを使用するという方法で行われます。制作したアプリが、その記述通りに動作する仕様になっていればテストは成功となります。

コードにミスがあり期待する動作が実現しない仕様になっていれば、テストは失敗という結果が返ってきます。テストは、ファイル内に期待する動作がまとめて書かれていて、テスト実行のコマンド一つでこれらの動作確認が行えるので、制作スピードをあげる事が出来るので出来る限り書くようにしましょう。

テストを実行して失敗した場合、どの動作がうまくいかないのかを知ることが出来ます。これにより、コードミスなどの特定を容易に行う事が出来ます。

テストファイルがあれば、コマンド一つで何度もテストを行う事が出来ます。以下は、テストの種類です。

Unit test=モデルの為のテスト

Controller test(機能テスト)=コントローラの為のテスト

Integration test(結合テスト)=全体の動作の流れをテストする

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×