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