Railsテスト『九』集積テストintegration test
10370 ワード
前置き
今日はrailsの統合テストintegration testについて詳しく説明します.
概要
統合テストは、主に複数のcontroller間のインタラクションをテストし、アプリケーションで重要なワークフローをテストし、これらのワークフローが予想される想定に合致しているかどうかを検証します.
ユニットテストや機能テストとは異なり、自動的に追加されます.統合テストは手動で追加する必要があります.railsはコマンドを提供しています.
コマンドを使用するとtest/integrationフォルダに統合テストを作成できます.
まず、統合テストでよく使用されるヘルプ方法について説明します.
セッションがhttpsリクエストをシミュレートしている場合はtrueを返します.
httpリクエストをシミュレートできます.
次のリクエストでhost nameを設定できます.
前回のリクエストがジャンプであればtrueを返します.
ジャンプの応答に続いて
指定したpathにhttpリクエストを送信し、parametersを選択し、headersを選択し、ジャンプに従います.
指定したpathにpostリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
指定したpathにgetリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
指定したpathにputリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
指定したpathにdeleteリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
新しいセッションを開く
例
統合テストファイルtest/integration/user_を作成します.flows_test.rbにコードを追加します.
上のコードでは、usersテーブルにレコードを追加しました.その後signinにアクセスし、200を返すか否かを断言する.
次に、さっき追加したユーザーメールボックスとパスワードをsessionsに送信します.sessionscontrollerは、ユーザー情報の検証を担当するcontrollerです.次に、ルートディレクトリにジャンプしたかどうか、正しいflashプロンプトが表示されたかどうかを断言します.
最後にadmin/postsにアクセスし、200を返すかどうかを断言し、posts変数を返します.
上記のテストは、データベースからcontrollerへのスケジューリング割り当てを上書きする複数のcontrollerに関連しています.
複数のセッションを同時にシミュレートし,これらのセッションをextendで拡張し,いくつかの強力なテスト用DSL(Domain‐Specific Language分野記述言語)を作成することができる.
私たちは上のテストを下のように変更しました.
DSLとは何ですか.
ビジネス記述言語だと理解しています.私たちの応用は一般的に1つの業界向け、あるいは1つの分野向けであり、ビジネスの言語は分野記述言語である.
この分野のビジネス言語でテストプロセスを記述できれば、このテストはビジネスに近づき、コミュニケーション能力が強い.つまり、このテストはビジネスとコミュニケーションして、彼らが望んでいるビジネスプロセスかどうかを見ることができます.
今日はrailsの統合テストintegration testについて詳しく説明します.
概要
統合テストは、主に複数のcontroller間のインタラクションをテストし、アプリケーションで重要なワークフローをテストし、これらのワークフローが予想される想定に合致しているかどうかを検証します.
ユニットテストや機能テストとは異なり、自動的に追加されます.統合テストは手動で追加する必要があります.railsはコマンドを提供しています.
rails generate integration_test
コマンドを使用するとtest/integrationフォルダに統合テストを作成できます.
- $ rails generate integration_test user_flows
- exists test/integration/
- create test/integration/user_flows_test.rb
まず、統合テストでよく使用されるヘルプ方法について説明します.
- https?
セッションがhttpsリクエストをシミュレートしている場合はtrueを返します.
- https!
httpリクエストをシミュレートできます.
- host!
次のリクエストでhost nameを設定できます.
- redirect?
前回のリクエストがジャンプであればtrueを返します.
- follow_redirect!
ジャンプの応答に続いて
- request_via_redirect(http_method, path, [parameters], [headers])
指定したpathにhttpリクエストを送信し、parametersを選択し、headersを選択し、ジャンプに従います.
- post_via_redirect(path, [parameters], [headers])
指定したpathにpostリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
- get_via_redirect(path, [parameters], [headers])
指定したpathにgetリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
- put_via_redirect(path, [parameters], [headers])
指定したpathにputリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
- delete_via_redirect(path, [parameters], [headers])
指定したpathにdeleteリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
- open_session
新しいセッションを開く
例
統合テストファイルtest/integration/user_を作成します.flows_test.rbにコードを追加します.
- require 'test_helper'
-
- class UserFlowsTest
- include FactoryGirl::Syntax::Methods
-
- def test_admin_login_and_browse_posts
- user = FactoryGirl.create(:user_valid)
-
- get "/signin"
- assert_response(200)
-
- post_via_redirect("sessions", {:user=>{:email=> user.email, :password => user.password}})
- assert_equal "/", path
- assert_equal "sign in successfully", flash[:notice]
-
- get "admin/posts"
- assert_response(200)
- assert assigns(:posts)
-
- end
-
- end
上のコードでは、usersテーブルにレコードを追加しました.その後signinにアクセスし、200を返すか否かを断言する.
次に、さっき追加したユーザーメールボックスとパスワードをsessionsに送信します.sessionscontrollerは、ユーザー情報の検証を担当するcontrollerです.次に、ルートディレクトリにジャンプしたかどうか、正しいflashプロンプトが表示されたかどうかを断言します.
最後にadmin/postsにアクセスし、200を返すかどうかを断言し、posts変数を返します.
上記のテストは、データベースからcontrollerへのスケジューリング割り当てを上書きする複数のcontrollerに関連しています.
複数のセッションを同時にシミュレートし,これらのセッションをextendで拡張し,いくつかの強力なテスト用DSL(Domain‐Specific Language分野記述言語)を作成することができる.
私たちは上のテストを下のように変更しました.
- require 'test_helper'
-
- class UserFlowsTest
- include FactoryGirl::Syntax::Methods
-
- def test_admin_login_and_browse_posts
- user = FactoryGirl.create(:user_valid)
- guest = FactoryGirl.create(:user_valid_too)
-
- user_session = signin(user)
- guest_session = signin(guest)
-
- assert_equal("sign in successfully", user_session.flash[:notice])
- assert_equal("sign in successfully", guest_session.flash[:notice])
-
- user_session.browse_site
- guest_session.browse_site
-
- end
-
- private
-
- module CustomDSL
- def browse_site
- get "admin/posts"
- assert_response(200)
- assert assigns(:posts)
- end
- end
-
- def signin(user)
- open_session do |sess|
- sess.extend(CustomDSL)
- sess.post_via_redirect("sessions", {:user => {:email => user.email, :password => user.password}})
-
- end
- end
-
- end
DSLとは何ですか.
ビジネス記述言語だと理解しています.私たちの応用は一般的に1つの業界向け、あるいは1つの分野向けであり、ビジネスの言語は分野記述言語である.
この分野のビジネス言語でテストプロセスを記述できれば、このテストはビジネスに近づき、コミュニケーション能力が強い.つまり、このテストはビジネスとコミュニケーションして、彼らが望んでいるビジネスプロセスかどうかを見ることができます.