Rails開発詳細『九』Railsのテスト


1.なぜテストrailsを書くのか、私たちは簡単にテストを書くことができます.モデルとcontrollerを作成するとき、railsはテストのスケルトンコードを作成するのに役立ちました.テストコードを簡単に実行することで、再構築後にコードがニーズを満たす機能を確保できます.railsテストでは、ブラウザリクエストをシミュレートできます.これにより、ブラウザを適用せずにアプリケーションの応答をテストできます.2.テストの概要railsアプリケーションごとにデータベースと多くのインタラクションがあるため、テストにもデータベースが必要です.テストをよりよく書くためには、データベースの構築方法とサンプルデータのロード方法を知る必要があります.2.1.3つの環境railsアプリケーションごとに3つの環境があります:生産、開発、テスト.config/database.ymlファイルには、この3つの環境のデータベース設定が含まれています.テストデータベースでデータ操作を行う場合は、開発環境のデータベース構造をテスト環境にマッピングする必要があります.次のコマンドを実行できます. 

  
  
  
  
  1. rake db:test:prepare 

2.2.フォルダ構造をテストrails newコマンドを使用してアプリケーションを作成すると、railsは次の内容を含むtestフォルダを作成します. 

  
  
  
  
  1. root@web:/home/railsapp/login# ls -F test/ 
  2. fixtures/  functional/  integration/  performance/  test_helper.rb  unit/ 

unitフォルダはmodelのテスト、functionalフォルダはcontrollerのテスト、integrationフォルダはcontroller間のインタラクティブなテスト、fixturesフォルダはテストデータを整理するために使用されます.test_helper.rbは、テスト環境の構成情報を保存します.2.3.Fixturesの内幕は良いテストで、いくつかのテストデータを作成する必要があります.railsではfixturesをカスタマイズすることで実現できます.2.3.1.fixtures fixturesとは、テストが実行される前に、事前に定義されたデータを使用してテストデータベースを埋め込むことができます.fixturesはデータベースに関係なくyaml形式です.rails g modelを使用して新しいmodelを作成すると、fixturesフォルダにfixturesが自動的に作成されます.2.3.2.YAML yamlは人に対して非常に友好的なデータを記述するフォーマットです.これらのfixturesの接尾辞は.yml.例えば、users.yml.  

  
  
  
  
  1. # lo & behold!  I am a YAML comment! 
  2. david: 
  3.  name: David Heinemeier Hansson 
  4.  birthday: 1979-10-15 
  5.  profession: Systems development 
  6.   
  7. steve: 
  8.  name: Steve Ross Kellock 
  9.  birthday: 1974-09-27 
  10.  profession: guy with keyboard 

2.3.3.埋め込みerbはymlにrubyコードを埋め込むこともでき、fixturesをロードする前に前処理されます.次のymlでは変数earch_が定義されています.size.

  
  
  
  
  1. <earth_size = 20 %> 
  2. mercury: 
  3.   size: <%= earth_size / 50 %> 
  4.   brightest_on: <%= 113.days.ago.to_s(:db) %> 
  5.   
  6. venus: 
  7.   size: <%= earth_size / 2 %> 
  8.   brightest_on: <%= 67.days.ago.to_s(:db) %> 
  9.   
  10. mars: 
  11.   size: <%= earth_size - 69 %> 
  12.   brightest_on: <%= 13.days.from_now.to_s(:db) %> 

rubyコードは<%>に含まれます.2.3.4.fixtures実践railsはfixturesフォルダ内のすべてのfixturesを自動的にロードします.ロードの手順は次のとおりです.
  • まず、テーブルにすでに存在するfixturesのデータを削除します.
  • fixturesのデータをtableにロードします.
  • fixturesデータが変数にロードされると、変数から直接データにアクセスできます.

  • 前に書いたusesに参加してください.ymlファイルはhash形式でユーザ情報を取得できます.
    
      
      
      
      
    1. user = users(:david

    さらにuserの各種情報を取得する.
    
      
      
      
      
    1. user.name 
    2. user.birthday 
    3. user.profession 

    3.modelに対するユニットテストrailsでは、ユニットテストはmodelをテストするために使用されます.rails g modelまたはrails g scaffodコマンドを使用すると、test/unitで対応するユニットテストが自動的に生成されます. 
    
      
      
      
      
    1. # test/unit/post_test.rb 
    2. require 'test_helper' 
    3.   
    4. class PostTest < ActiveSupport::TestCase 
    5.   # Replace this with your real tests. 
    6.   test "the truth" do 
    7.     assert true 
    8.   end 
    9. end 

    テストクラスはActiveSupport::TestCaseを継承することに注意してください. 
    
      
      
      
      
    1. def test_the_truth 
    2.  
    3.   assert true 
    4.  
    5. end 

    すべてのtestで始まる方法はテストとみなされます.つまり、すべてのテスト方法はtestで始まる必要があります.test_password,test_valid_password,testpassrodはいずれも合法的なテスト名であり,テスト時に自動的に実行される.3.1.テストの準備をしてテストを実行する前に、テストデータベースの構造と開発環境が一致していることを確認する必要があります. 
    
      
      
      
      
    1. rake db:migrate 
    2. rake db:test:load 

    rake db:migrateは開発環境のデータベースを生成し、db/schemaを更新するために使用される.rbファイル.rake db:test:loadはdb/schemaに従います.rbテストデータベースを再作成します.rake db:test:prepareも実行できます.3.2.テストの実行
    
      
      
      
      
    1. $ ruby -Itest test/unit/post_test.rb 
    2.  
    3. Loaded suite unit/post_test 
    4. Started 
    5. Finished in 0.023513 seconds. 
    6.   
    7. 1 tests, 1 assertions, 0 failures, 0 errors 

    -nパラメータで実行するテストを作成することもできます. 
     
    
      
      
      
      
    1. rake test TEST = test/unit/user_test.rb 
    
      
      
      
      
    1. ruby -Itest test/unit/post_test.rb -n test_the_truth 

    4.コントロールの機能テスト4.1機能テストに含まれる内容をテストする
  • webリクエストは成功しましたか?
  • userは正しいページに転送されましたか?
  • ユーザーはauthenticateに成功しましたか?
  • 応答に含まれるオブジェクトは正しいですか?
  • viewでユーザーに正しい内容が表示されていますか?

  •  
    4.2機能テストで使用可能な要求タイプget post put delete head 4.3使用可能な4つのハッシュassign cookies flash session 4.4使用可能なインスタンス@controller、要求を処理するcontroller.@リクエスト、リクエスト.@response、応答.5.統合テスト統合テストは、複数のコントローラ間のインタラクションをテストするために使用されます.
    
      
      
      
      
    1. rails g integration_test user_flows 

     
    
      
      
      
      
    1. # test/integration/user_flows_test.rb 
    2. require 'test_helper' 
    3.   
    4. class UserFlowsTest < ActionDispatch::IntegrationTest 
    5.   fixtures :all 
    6.   
    7.   # Replace this with your real tests. 
    8.   test "the truth" do 
    9.     assert true 
    10.   end 
    11. end