test - 近畿大学

テストについて
近畿大学大学院 田中大介
資料:http://ecl.info.kindai.ac.jp/~earth-moon/test.ppt
テストの有用性
• XP : 常に仕様が変化することが前提
⇒ 何度もコードを書き直す
⇒ エラーを何度もチェックする
⇒ 手作業のチェックは時間がかかる
⇒ テストコードを使って時間を短縮
⇒ テストを先に作り、そのテストをクリアする
コードを書く(テストファースト)
テストの種類
• ユニットテスト
– モデルを対象
– test / unit にテストコードを格納
• 機能テスト
– コントローラを対象
– test / functional にテストコードを格納
本日のお品書き
1. テストの実行環境を整える
2. ユニットテストを試してみる
3. 機能テストを試してみる
0.プロジェクトの準備
• プロジェクトを作成
– Productモデルをscaffold
•
•
•
•
title : string
description : text
image_url : string
price : integer
1.実行環境の準備
•
テストで使用するデータベースを準備する
1. 設定
2. テーブルをコピー
3. テストデータを入力
テスト1・実行環境
1. 設定
– config / database.yml を同様に変更
– test部分
•
•
adapter : sqlite3
database: db/test.sqlite3
テスト1・実行環境
2.テーブルをコピー
– rake db:test:clone_structure を実行
(開発用DBの構成をテストDBにコピーする)
テスト1・実行環境
3.テストデータを入力
– テストフィクスチャを用いる
– test / fixtures / products.yml に記述
– 書式
•
–
データ名:
カラム名:データ
カラム名:データ
:
http://ecl.info.kindai.ac.jp/~earth-moon/products.yml
テスト2・ユニットテスト
•
流れ
1. テストDBのすべてのデータが消える
2. テストデータ(フィクスチャのデータ)が
各テーブルにロードされる
3. setupメソッドを実行
4. テストメソッドでテスト
5. teardownメソッドを実行
6. 1に戻る
7. 全てのテストメソッドを実行すると終了
常にまっさらな状態からテスト可能
(テストの結果が他のテストに影響しない)
テスト2・ユニットテスト
1.
2.
3.
4.
create/readのテスト
updateのテスト
deleteのテスト
validationのテスト
テスト2・ユニットテスト
1. create/readのテスト
1. fixturesメソッドで、入力するテストデータを選択
⇒ fixtures :products
2. test_createメソッドをコーディング
⇒ assert_equal メソッドを使用する
•
assert_equalメソッド
– 第一引数に期待値、第二引数に実際値
– 一致しない場合、テスト失敗のメッセージ
テスト2・ユニットテスト
1. create/readのテスト
3. before_type_cast
– date_madeでエラーが発生
⇒ Time型に変換されているため
– before_type_castメソッドを使用する
⇒ 属性の最後に「_before_type_cast」を追加する
⇒ 「@product.date_made_before_type_cast」
4. assert_kind_of
– assert_kind_of でクラスをチェックすることが可能
テスト2・ユニットテスト
1. create/readのテスト
5. テストデータの柔軟性
•
•
数字、文字を直入力
⇒ テストデータが変化するとエラーになる
フィクスチャのデータを取ってくるようにする
– test / test_helper.rb のself.use_instantiated_fixtures を
self.use_instantiated_fixtures = true に変更
– @productsに各データがハッシュで格納
⇒ @products[“データ名”] でデータが取れる
– もしくは @データ名 でも良い
テスト2・ユニットテスト
2.updateのテスト
1. [テスト]現在の値
2. 値を変更
3. [テスト]DBへの格納
– assert メソッドを使う
4. DBからデータを再読み込み
– reloadメソッド
5. [テスト]変更された値
テスト2・ユニットテスト
2.updateのテスト
assert_equal @product_one.price, @product.price
@product.price = 30
assert @product.save
@product.reload
assert_equal 30, @product.price
テスト2・ユニットテスト
3.deleteのテスト
•
•
DBのデータを消去
assert_raiseメソッドで、
データを呼び出すとエラーが発生するかどうかをテスト
@product.destroy
assert_raise(ActiveRecord::RecordNotFound){
Product.find(@product.id)
}
テスト2・ユニットテスト
4.validationのテスト
– 以下の3つをチェックする
1. DBにデータが格納できない
•
assert メソッド
2. オブジェクトにエラーが格納された
•
•
.errors のエラーの数を調べる
関係のないエラーが混じっていないかをチェック
3. エラーの内容
•
.errors のエラーの内容を調べる
テスト2・ユニットテスト
4.validationのテスト
assert_equal @product_one.price, @product.price
@product.price = 0
assert [email protected]
assert_equal 1, @product.errors.count
assert_equal 'は0より大きくなければなりません',
@product.errors.on(:price)
テスト3・機能テスト
•
手順
1. アクションを呼び出す
2. 帰ってきたviewなどをテストする
•
アクションがどうなったか
– 成功、リダイレクト、エラーなど
– リダイレクト、レンダーされた場所
•
•
帰ってきたHTMLはどうか
変数に正しい値が帰ってきているか?
テスト3・機能テスト
•
使用するメソッド
1. アクションを呼び出す
•
•
•
•
•
get
post
put
delete
head
テスト3・機能テスト
•
手順
2.帰ってきたviewなどをテストする
•
アクションがどうなったか
–
–
•
帰ってきたHTMLはどうか
–
–
•
assert_responce
assert_redirected_to
assert_tag
assert_template
変数に正しい値が帰ってきているか?
–
–
–
–
–
assigns
session
flash
cookies
redirect_to_url
終わり
• お疲れ様でした