テスト(test)
テストとは
説明
- あるURLにアクセスした際に、予期した画面が表示されるか
- ある正しい操作をした際に、アプリケーションの状態が正しく変更されるか
- ある正しくない操作をした際に、適切なエラーメッセージが表示されるか
単体テスト
- モデルの検索系メソッドが正しい値を取得できるか
- モデルの更新系メソッドが正しくデータベースを更新できるか
- モデルの更新系メソッドが不正な入力に対して、適切なエラーを発生させるか
機能テスト
- 適切なテンプレートが選択されているか
- インスタンス変数に適切な値が格納されているか
- 適切にレンダリングされているか
- 更新系のアクションが正しくデータベースを更新されるか
総合テスト
- ログインして、新しいメンバーを追加して、ログアウトするといった一連の動きをテスト
テストデータ
説明
事前に用意したテストデータを読み込み常にDBの内容を一定に保つための仕組みのことをフィクスチャと呼ぶ
フィクスチャを用意
test/fixtures/テーブル名.yml
例
rubyonrails:
id: 1
name: Ruby on Rails
url: http://www.rubyonrails.org
google:
id: 2
;name: Google
url: http://www.google.com
テスト内からフィクスチャを読み込む
require 'test_helper'
class WebSiteTest < ActiveSupport::TestCase
test "web_site_count" do
assert_equal 2, WebSite.count
end
end
フィクスチャを使用
require 'test_helper'
class SiteTest < ActiveSupport::TestCase
fixtures :sites
def test_google_fixture
# フィクスチャ名を指定して使用
google = sites(:google)
assert_equal "http://www.google.com", google.url
end
def test_google_fixture_from_db
# findメソッドなどでDBからロードして使用
google = Site.find(2)
# フィクスチャ名で取得したものと同じであることをバリデーション
assert_equal sites(:google), google.url
end
end
フィクスチャからのデータの取得
フィクスチャに含まれているデータはテストの実行時に使うもの
- 開発用データ用のディレクトリの作成 $ mkdir db/migrate/dev_data
- YAMLファイルの作成
- マイグレーションファイルの作成 $ ruby script/generate migration <マイグレーション名>マイグレーション名>
-
マイグレーションファイルの編集 require ‘active_recode/fixtures’ class <クラス名> < ActiveRecode::Migration def self.up downクラス名>
directory = File.join(File.dirname(__FILE__), 'dwv_data') Fixtures.create_fixtures(disrectory, "<YAML名>") end def self.down YAML名.delete_all end end
ユニットテストについて
使い方
#coding: utf-8
require 'test_helper'
class ArticleTest < ActiveSupport::TestCase
test テスト名 do
テストコード
end
end
例
class ShopTest < ActiveSupport::TestCase
def test_instanciate_from_cvs_string
shop = Ship.parse("コーヒー, aaa")
assert_not_nil shop
assert_equal "コーヒー", shop.name
assert_equal "aaa", shop.tel
end
end
class Shop < ActiveRecord::Base
def self.parse(cvs_str)
end
end
def self.parse(cvs_str)
params = cvs_str.split(/\s*, \s*/)
Shop.new(name: params[0], tel: params[1])
end
ユニットテストで使うメソッド
テストメソッド
メソッド | 説明 |
---|---|
assert(式 [, メッセージ]) | 式が真ならば成功 |
assert_equal(変数1, 変数2 [, メッセージ]) | 変数1と変数2が等しければ成功 |
assert_not_equal(変数1, 変数2 [, メッセージ]) | 変数1と変数2が等しくなければ成功 |
assert_nil(変数 [, メッセージ]) | 変数がnilならば成功 |
assert_not_nil(変数 [, メッセージ]) | 変数がnilじゃなければ成功 |
assert_match(正規表現, 文字列 [, メッセージ]) | 正規表現に文字列がマッチすれば成功 |
assert_no_match(正規表現, 文字列 [, メッセージ]) | 正規表現に文字列がマッチしなければ成功 |
assert_raise(例外1, 例外2 [, 例外3…]) { } | ブロックを実行して例外1,2が発生し、その例外がexpected_exception_klassクラスならば成功 |
assert_nothing_raised(例外1, 例外2 [, 例外3…]) { .. } | ブロックを実行して例外1,2がおきなけらば成功 |
assert_in_delta(expected_float, actual_float, delta, message=””) | |
flunk([メッセージ]) | 常に失敗。未定義のテストケースなどを暫定的に失敗させたりする場合に利用 |
assert_difference(expressions, difference = 1, message = nil, 6block) | ブロック実行後にecpressionsの値がdifferenceの分だけ変わっていれば成功 |
assert_no_difference(exoressions, message = nil, &block) | ブロック実行前後でexpressionsの値が変わっていなければ成功 |
ファンクショナルテスト
説明
単一のアクションに対して、モデル・ビュー・コントローラを結合してテスト
requite File.dirname(__FILE__) + '/../test_helper'
class EntriesControllerTest < ActionController::TestCase
def test_truth
assert true
end
end
流れ
テスト環境をセットアップ
requite File.dirname(__FILE__) + '/../test_helper'
コントローラを指定
requite File.dirname(__FILE__) + '/../test_helper'
class ShopsControllerTest < Test::Unit**testCase
def setup
@controller = ShopsController.new
@request = ActionController::TestRequest.new
@response = ActionController:TestResponse.new
end
end
リクエストを送信
def test_should_get_index
get :index
end
アクションの実行結果を確認
レスポンスが成功したかをバリデーション
assert_response :success
アクション内で設定されたインスタンス変数をバリデーション
assigns
出力結果のHTMLをバリデーション
assert_select
テストメソッド
リクエスト送信のためのメソッド
メソッド | 説明 |
---|---|
get(action, parameters) | アクションに対して、GETリクエストを送信 |
post(action, parameters) | アクションに対して、POSTリクエストを送信 |
xhr(request_method, action, parameters = nil, session = nil, flash = nil) | アクションに対して、XMLHTTPRequestを送 |
状態設定・取得のためのメソッド
メソッド | 説明 |
assigns(key = nil) | アクションを実行した結果、インスタンス変数に代入されたオブジェクトを取得 |
session | ファンクショナルテストで使用されるセッションへのアクセサ |
flash | コントローラ内で使用するflashへのアクセサ |
バリデーションのためのメソッド
メソッド | 説明 |
---|---|
assert_response(type, message = nil) | アクション実行結果のレスポンスコードをバリデーション |
assert_redirected_to(options = {}, message = nil) | リダイレクトを返すアクションに対して、そのリダイレクト先がどうなっているかバリデーション |
assert_template(expected, message = nil) | そのアクションで指定されたテンプレートが描写されているかをバリデーション |
assert_select(selector, equality?, message?) | アクション実行の結果として描写されるHTMLの内容をバリデーション |
インテグレーションテスト
説明
複数のアクションやコントローラにまたがる挙動をバリデーションするためのテスト
テストを生成
$ rails generate integration_test テスト名
システムテスト
説明
システムテストとは、ブラウザ上で行うアプリケーションのテスト
実際のブラウザを使用するためJavaScriptを簡単にテストすることができる
例
require "application_system_test_case"
class Users::CreateTest < ApplicationSystemTestCase
test "adding a new user" do
visit users_path
click_on 'New User'
fill_in 'Name', with: 'Arya'
click_on 'Create User'
assert_text 'Arya'
end
end
システムテストの設定オプション
説明
システムテストの設定オプション
使い方
driven_by(ドライバ, using: 使うブラウザ=:chrome, screen_size: スクリーンサイズ=[1400, 1400], options: オプション={})
例
driven_by :cuprite
driven_by :selenium, screen_size: [800, 800]
driven_by :selenium, using: :chrome
driven_by :selenium, using: :headless_chrome
driven_by :selenium, using: :firefox
driven_by :selenium, using: :headless_firefox
ソースコード
ファイルアップロードをテスト
説明
ファイルアップロードをテスト
使い方
fixture_file_upload(パス, タイプ=nil, バイナリかどうか=false)
例
post :change_avatar, params: { avatar: fixture_file_upload('david.png', 'image/png') }