如何在Rails 3的RSpec Selenium测试中传入指定URL变量运行?
当然支持!给你几种适合Rails 3项目的实现方式
完全可以从命令行传入基础URL,这在多环境测试场景下非常实用。下面是几种简单易上手的方案,你可以根据自己的测试框架(比如RSpec、Test::Unit)选择:
1. 用环境变量(最简便,无额外依赖)
这是最直接的方式,不需要修改太多代码:
- 命令行运行测试时直接传入环境变量:
(如果用Test::Unit,就把BASE_URL=http://demo.website.com bundle exec rspec spec/featuresrspec换成rake test) - 在测试文件或
spec_helper.rb/test_helper.rb里读取这个变量,还可以设置默认值避免无参数时报错:# 在spec_helper.rb中 BASE_URL = ENV['BASE_URL'] || 'http://local.website.com' # 如果用Capybara(Rails常用的测试工具),直接配置app_host Capybara.app_host = BASE_URL Capybara.run_server = false # 如果你测试的是已部署的环境,不需要启动本地Rails服务 - 之后测试里的所有跳转都基于这个URL,比如
visit '/login'会自动指向http://demo.website.com/login
2. 封装成Rake任务(更优雅,适合团队统一调用)
如果团队经常需要切换环境测试,可以写个自定义Rake任务来封装参数:
- 在
lib/tasks/selenium_tasks.rake里添加:namespace :test do desc "Run Selenium tests with a custom base URL" task :selenium, [:base_url] do |_task, args| # 把传入的URL存入环境变量,供测试读取 ENV['BASE_URL'] = args.base_url || 'http://local.website.com' # 调用原有的测试任务 Rake::Task['spec:features'].invoke end end - 运行时直接传URL参数:
bundle exec rake test:selenium['http://demo.website.com']
3. 利用测试框架的自定义参数(以RSpec为例)
如果想更贴合RSpec的使用习惯,可以自定义命令行参数:
- 在
spec_helper.rb里添加配置:require 'optparse' options = {} OptionParser.new do |opts| opts.on("--base-url URL", "Base URL for Selenium tests") do |url| options[:base_url] = url end end.parse!(ARGV) # 把参数赋值给Capybara或直接使用 Capybara.app_host = options[:base_url] || 'http://local.website.com' - 运行时用自定义参数:
bundle exec rspec --base-url http://demo.website.com spec/features
小提示
不管用哪种方法,都要确保测试里不要硬写死任何完整URL,所有页面跳转都用相对路径,这样才能完全依赖传入的基础URL,适配不同环境。
内容的提问来源于stack exchange,提问作者Andrew Algard
相关产品推荐
相关产品推荐

