テストで使うメソッド
3.テストで使うメソッド
3-1.基本
assert(boolean, message=nil)
・booleanがtrueと評価されればテストは成功。
・booleanがfalseまたはnilの場合にテストは失敗。
・テストが失敗するとmessageが表示される。
・messageは省略できる。
・1つのテストメソッドにassert(またはassert_xxxx)メソッドが複数ある場合は、最初に失敗したassertでそのテストメソッドは中断される。
・テストメソッドが分かれていれば、失敗しても次のメソッドが実行されるので、連続して表示される。
3-2.テストメソッド一覧
(1) assert_difference
・expressionsは数値を返すRubyコードを文字列で指定する。
assert_difference(expressions, difference=1, message=nil) {ブロック}
・ブロックの最初と最後で、expressionsの式の結果に、differenceの差異が発生すれば成功。
・differenceのデフォルトは1。
(使用例)
assert_difference('Record.count', -1) do # Record件数が1件減ると成功
delete :destroy, :id => records(:one).to_param # destroyメソッドを実行
end
(2) assert_equal
・expectedとactualが等しい時に成功する。
assert_equal(expected, actual, message=nil)
・expected は期待する値。
・actual はテスト対象の値。
(使用例)
records=Record.find(:all) # Recordの全件読み込み
assert_equal 3, records.length, “件数が正しくありません” # recordsに3件データがあれば成功
(3) assert_in_delta
・浮動小数点には誤差があるため、assert_equalの代わりに利用する。
assert_in_delta(expected_float, actual_float, delta, message=nil)
・expected_floatとactual_floatの差異がdelta以内なら成功する。
(4) assert_match
・stringが正規表現patternにマッチすれば成功。
assert_match(pattern, string, message=nil)
(5) assert_nil
・objectがnilであるなら成功。
assert_nil(object, message="")
(5)−2 assert_not_nil
・objectがnilでないなら成功。
assert_not_nil(object, message="")
(使用例)
ここでassignsはインスタンス変数を参照するメソッドで、単に@recordsと書けないことに注意すること。
(6) assert_raise
・「*expected_exception_klass」は「予想した例外」クラス。カンマで区切って複数指定できる。
assert_raise(*expected_exception_klass, message="") {ブロック}
・ブロックを処理して「予想した例外」が、どれか一つ発生すれば成功。
(使用例)
assert_raise RuntimeError, ArgumentError, "例外が発生しません" do
raise NoMethodError
end
(6)−2 assert_nothing_raised
・「*expected_exception_klass」は「予想した例外」クラス。カンマで区切って複数指定できる。
assert_nothing_raised(*expected_exception_klass, message="") {ブロック}
・ブロックを処理して「予想した例外」が、一つも発生しなければ成功。
・「予想外の例外」が発生して、テストに成功した場合、Errorがカウントされる。
(7) assert_redirected_to
・optionsが指定するURLオプションと、最後のアクションで呼び出されたリダイレクトのURLオプションが一致すれば成功。
assert_redirected_to(options={}, message=nil)
(使用例)
assert_redurected_to {:controller=>”records”, :action=>”index”}
(8) assert_response
・typeが指定するコードと、レスポンスのHTTPステータスコードが一致すれば成功。
assert_response(type, message=nil)
・typeには以下のシンボルも利用可能。
:success ステータスコード200
:redirect ステータスコード300から399
:missing ステータスコード404
:error ステータスコード500から599
(使用例)
assert_response :success # HTTPステータスが200なら成功
(9) assert_select
・selectorでCSSセレクタを記述する。
assert_select(selector, equality, message=nil)
・equalityとそのCSSセレクタの要素が一致すれば成功。
(使用例)
assert_select “form”, true # formエレメントが1つ以上存在なら成功
assert_select “form input”, 4 # inputエレメントが4個なら成功
assert_select “form input”, (1..3) # inputエレメントが1〜3個なら成功
(10) assert_template
・expectedが指定するビューテンプレートを利用して描画されたら成功。
assert_template(expected, message=nil)
(使用例)
assert_template 'new'
(11) assert_valid
・ActiveRecord_objectの検証を実行して、エラーが無ければ成功。
assert_valid(ActiveRecord_object)
4.テストの支援
4-1.フィクスチャ fixtures
フィクスチャとは、一般的には、テストに使う初期データのことをいいます。Railsでは二つの方法があり、一つは静的な設定で、もう一つは動的な設定です。ただし動的な設定はUNITテストの場合のみ有効です。
(1) 静的な設定
それぞれのモデルに対してテスト実行前に初期データを設定することで/test/fixtures/にYAML形式で記述します。
one:
id: 1
a: 3
b: 5two:
id: 2
a: 10.5
b: 9.5
(2) 動的な設定
テストの直前にデータを用意しテストの直後にデータを戻すようにsetupとteardownメソッドが用意されています。
require 'test_helper'class RecordTest < ActiveSupport::TestCase
def setup # このクラスのテスト直前に実行
record=Record.new(:id=>4, :a=>"1010", :b=>"101")
record.save
enddef teardown # このクラスのテスト直後に実行
record=Record.find(4)
record.destroy
end
test "data_len" do
records=Record.find(:all)
assert_equal 4, records.length # 1件追加されて全部で4件なら成功
end
end
4-2.リクエスト
コントローラやビューをテストする方法を機能テストといい、その機能を呼び出すメソッドをリクエストといいいます。機能テストはこのリクエストに対するレスポンスを検証することによって行われます。
(1) GET
GETリクエストは次のメソッドを呼び出すことができます。http以下はWeb上でのURLです。
indexメソッド http://xx.xx.xx:3000/records/
newメソッド http://xx.xx.xx:3000/records/new
showメソッド http://xx.xx.xx:3000/records/1
editメソッド http://xx.xx.xx:3000/records/1/edit
xxxxメソッド http://xx.xx.xx:3000/records/xxxx
(2) POST
POSTリクエストは次のメソッドを呼び出すことができます。
createメソッド http://xx.xx.xx:3000/records/?a=”1.0”&b=”2.0”
(3) PUT
PUTリクエストは次のメソッドを呼び出すことができます。
updateメソッド http://xx.xx.xx:3000/records/1?_method=”put”&a=”1.0”&b=”2.0”
(4) DELETE
DELETEリクエストは次のメソッドを呼び出すことができます。
destoryメソッド http://xx.xx.xx:3000/records/1&_method=”delete”
5.テストモジュールのまとめ
5-1.単体テスト UNIT test
プログラム内部で行うテストで、対象とするメソッドの下位モジュールがないときはスタブを作成してテストを行います。
5-2.機能テスト FUNCTIONAL test
プログラム外部から行うテストで、あたかもブラウザに向かって操作する感覚でテスト仕様を作成し検証します。