テストについて 近畿大学大学院 田中大介 資料: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 終わり • お疲れ様でした
© Copyright 2024 ExpyDoc