Railsテスト『九』集積テストintegration test


前置き
今日はrailsの統合テストintegration testについて詳しく説明します.
 
概要
統合テストは、主に複数のcontroller間のインタラクションをテストし、アプリケーションで重要なワークフローをテストし、これらのワークフローが予想される想定に合致しているかどうかを検証します.
 
ユニットテストや機能テストとは異なり、自動的に追加されます.統合テストは手動で追加する必要があります.railsはコマンドを提供しています.
rails generate integration_test

コマンドを使用するとtest/integrationフォルダに統合テストを作成できます.
   
   
   
   
  1. $ rails generate integration_test user_flows 
  2.       exists  test/integration/ 
  3.       create  test/integration/user_flows_test.rb 

 
まず、統合テストでよく使用されるヘルプ方法について説明します.
 
   
   
   
   
  1. https? 

セッションがhttpsリクエストをシミュレートしている場合はtrueを返します.
 
   
   
   
   
  1. https! 

httpリクエストをシミュレートできます.
 
   
   
   
   
  1. host! 

次のリクエストでhost nameを設定できます.
 
   
   
   
   
  1. redirect? 

前回のリクエストがジャンプであればtrueを返します.
 
   
   
   
   
  1. follow_redirect! 

ジャンプの応答に続いて
 
   
   
   
   
  1. request_via_redirect(http_method, path, [parameters], [headers]) 

指定したpathにhttpリクエストを送信し、parametersを選択し、headersを選択し、ジャンプに従います.
 
   
   
   
   
  1. post_via_redirect(path, [parameters], [headers]) 

指定したpathにpostリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
 
   
   
   
   
  1. get_via_redirect(path, [parameters], [headers]) 

指定したpathにgetリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
 
   
   
   
   
  1. put_via_redirect(path, [parameters], [headers]) 

指定したpathにputリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
 
   
   
   
   
  1. delete_via_redirect(path, [parameters], [headers]) 

指定したpathにdeleteリクエスト、オプションparameters、オプションheadersを送信し、ジャンプに従います.
 
   
   
   
   
  1. open_session 

新しいセッションを開く
 
 

統合テストファイルtest/integration/user_を作成します.flows_test.rbにコードを追加します.
 
   
   
   
   
  1. require 'test_helper' 
  2.  
  3. class UserFlowsTest 
  4.   include FactoryGirl::Syntax::Methods 
  5.  
  6.   def test_admin_login_and_browse_posts 
  7.     user = FactoryGirl.create(:user_valid
  8.  
  9.     get "/signin" 
  10.     assert_response(200) 
  11.  
  12.     post_via_redirect("sessions", {:user=>{:email=> user.email, :password => user.password}}) 
  13.     assert_equal "/", path 
  14.     assert_equal "sign in successfully", flash[:notice
  15.  
  16.     get "admin/posts" 
  17.     assert_response(200) 
  18.     assert assigns(:posts
  19.    
  20.   end 
  21.  
  22. end 

上のコードでは、usersテーブルにレコードを追加しました.その後signinにアクセスし、200を返すか否かを断言する.
次に、さっき追加したユーザーメールボックスとパスワードをsessionsに送信します.sessionscontrollerは、ユーザー情報の検証を担当するcontrollerです.次に、ルートディレクトリにジャンプしたかどうか、正しいflashプロンプトが表示されたかどうかを断言します.
最後にadmin/postsにアクセスし、200を返すかどうかを断言し、posts変数を返します.
 
上記のテストは、データベースからcontrollerへのスケジューリング割り当てを上書きする複数のcontrollerに関連しています.
 
複数のセッションを同時にシミュレートし,これらのセッションをextendで拡張し,いくつかの強力なテスト用DSL(Domain‐Specific Language分野記述言語)を作成することができる.
私たちは上のテストを下のように変更しました.
   
   
   
   
  1. require 'test_helper' 
  2.  
  3. class UserFlowsTest 
  4.   include FactoryGirl::Syntax::Methods 
  5.  
  6.   def test_admin_login_and_browse_posts 
  7.     user = FactoryGirl.create(:user_valid
  8.     guest = FactoryGirl.create(:user_valid_too
  9.   
  10.     user_session = signin(user) 
  11.     guest_session = signin(guest) 
  12.  
  13.     assert_equal("sign in successfully", user_session.flash[:notice]) 
  14.     assert_equal("sign in successfully", guest_session.flash[:notice]) 
  15.  
  16.     user_session.browse_site 
  17.     guest_session.browse_site 
  18.    
  19.   end 
  20.  
  21.   private 
  22.  
  23.   module CustomDSL 
  24.     def browse_site 
  25.       get "admin/posts" 
  26.       assert_response(200) 
  27.       assert assigns(:posts
  28.     end 
  29.   end 
  30.  
  31.   def signin(user) 
  32.     open_session do |sess| 
  33.       sess.extend(CustomDSL) 
  34.       sess.post_via_redirect("sessions", {:user => {:email => user.email, :password => user.password}}) 
  35.        
  36.     end 
  37.   end 
  38.  
  39. end 

 
DSLとは何ですか.
ビジネス記述言語だと理解しています.私たちの応用は一般的に1つの業界向け、あるいは1つの分野向けであり、ビジネスの言語は分野記述言語である.
 
この分野のビジネス言語でテストプロセスを記述できれば、このテストはビジネスに近づき、コミュニケーション能力が強い.つまり、このテストはビジネスとコミュニケーションして、彼らが望んでいるビジネスプロセスかどうかを見ることができます.