テストについて 近畿大学大学院 田中大介 資料:
テストの有用性 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 に記述 – 書式 データ名: カラム名:データ カラム名:データ : –
テスト2・ユニットテスト 流れ 1. テスト DB のすべてのデータが消える 2. テストデータ(フィクスチャのデータ)が 各テーブルにロードされる 3.setup メソッドを実行 4. テストメソッドでテスト 5.teardown メソッドを実行 6. 1に戻る 7. 全てのテストメソッドを実行すると終了 常にまっさらな状態からテスト可能 (テストの結果が他のテストに影響しない)
テスト2・ユニットテスト 1.create/read のテスト 2.update のテスト 3.delete のテスト 4.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 」を追加す る ⇒ 」 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 に変更 に各データがハッシュで格納 データ名 ”] でデータが取れる – データ名 でも良い
テスト2・ユニットテスト 2. update のテスト 1.[ テスト ] 現在の値 2. 値を変更 3.[ テスト ]DB への格納 –assert メソッドを使う 4.DB からデータを再読み込み –reload メソッド 5.[ テスト ] 変更された値
テスト2・ユニットテスト 2. update @product.price = assert_equal
テスト2・ユニットテスト 3. delete のテスト DB のデータを消去 assert_raise メソッドで、 データを呼び出すとエラーが発生するかどうかをテ assert_raise(ActiveRecord::RecordNotFound){ }
テスト2・ユニットテスト 4. validation のテスト – 以下の 3 つをチェックする 1.DB にデータが格納できない assert メソッド 2. オブジェクトにエラーが格納された.errors のエラーの数を調べる 関係のないエラーが混じっていないかをチェック 3. エラーの内容.errors のエラーの内容を調べる
テスト2・ユニットテスト 4. validation @product.price = 0 assert assert_equal assert_equal ' は 0 より大きくなければなりません
テスト3・機能テスト 手順 1. アクションを呼び出す 2. 帰ってきた view などをテストする アクションがどうなったか – 成功、リダイレクト、エラーなど – リダイレクト、レンダーされた場所 帰ってきた HTML はどうか 変数に正しい値が帰ってきているか?
テスト3・機能テスト 使用するメソッド 1. アクションを呼び出す get post put delete head
テスト3・機能テスト 手順 2.帰ってきた view などをテストする アクションがどうなったか –assert_responce –assert_redirected_to 帰ってきた HTML はどうか –assert_tag –assert_template 変数に正しい値が帰ってきているか? –assigns –session –flash –cookies –redirect_to_url
終わり お疲れ様でした