理解 capybara


[capybara介紹]

capybara 的功能是模擬用戶對界面的操作行為,在基於底層driver的基礎上,提供一套統一的 界面交互api,如visit, click_link等。

底層的driver有很多,可以是完全打開瀏覽器方式的driver(如:selenium-webdriver),也可以是基於headless webkit 的 driver(如:capybara-webkit, poltergeist)

雖然capybara經常用在測試中,測試的時候用的最多的是rack-test driver,這樣測試速度快,但是capybara也可以單獨使用,模擬用戶的瀏覽器界面操作,因此可以進行一些自動登錄等功能。

[使用 capybara 進行測試 ]

capybara對於 rack app的測試非常方便,只要設置一個app就可以

capybara與cucumber集成

require 'capybara/cucumber'
Capybara.app = MyRackApp

引入capybara/cucumber文件,主要是在cucumber中加入capybara的DSL,這樣可以直接在step中寫visit等,然后利用cucumber before 等鈎子加入一些功能,如對cucumber場景@javascript tag功能的支持,改功能只是切換driver,如從rack-test driver切換到selenium或其他的支持js ajax等driver

Capybara.app = MyRackApp 是設置要測試的應用rack endpoint,如果是使用Rails, 默認就是Rails.application,在driver為rack-test的情況下,是直接通過與Rack interfaces交互,達到測試的目的,如果是其他的driver,則需要在同一個進程中單獨啟動一個應用的服務線程,就像是你通常啟動rails s一樣,因此會有兩個不同的線程在一個測試中,所以這就會涉及到數據庫事務的訪問問題,在一個線程中創建的數據,在事務沒有提交的情況下,在另一個線程中是訪問不到的。因此在設置為每個測試,事務回滾的情況下,就會遇到問題。可以用database_cleaner這個gem, 設置清空數據庫的strategy 為 truncation。對database_cleaner暫不講解太多。

capybara與rspec集成

require 'capybara/rspec'

如果是用Rails,則可以將測試文件放在spec/features目錄下,因為capybara/rspec默認將DSL, Matcher等擴展到 feature 類型的測試中,像model, controller這些是沒法使用capybara的dsl的。如果不用Rails,則需要在describe 或 it 中加上 :type => :feature選項

[單獨使用capybara,作為腳本使用]

require 'capybara'
require 'capybara/dsl'

Capybara.default_driver = :webkit

module MyModule
  include Capybara::DSL

  def login!
    within("//form[@id='session']") do
      fill_in 'Login', :with => 'user@example.com'
      fill_in 'Password', :with => 'password'
    end
    click_link 'Sign in'
  end
end

所以知道這些以后,capybara能對遠程的server進行測試也不足為怪了

Capybara.current_driver = :selenium
Capybara.app_host = 'http://www.google.com'
...
visit('/')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM