理解 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('/')
原文地址:https://www.cnblogs.com/kamechen/p/3146433.html