[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('/')
