Capybara Around Hook测试了几个环境

时间:2016-10-20 08:38:40

标签: ruby cucumber capybara

我正在为一个我想在多个环境中运行的网页编写一些测试。这个想法是测试将在一个中运行,然后在下一个中重复。这两个环境是预览和uat。

我编写了一个Around挂钩来设置环境变量。下面:

Around do |scenario, block|
  def test_envs
    chosen_env = ENV['test_env'] || 'preview'
    chosen_env.split(',').map(&:strip)
  end
  test_envs.each do |test_env|
    $base_url = "https://#{test_env}.webpage.com"
  end
  block.call
end

然后我编写了一个执行导航步骤的方法:

def navigate_to(path)
  visit $base_url + path
end

我的场景step_definition是:

navigate_to '/login'

测试可以在任一环境中使用,默认情况下预览,或者如果我设置test_env=uat

,则可以使用UAT

但是,我的目标是设置test_env=preview,uat并让它们在两种环境中连续运行。

我在这里错过了一些明显的东西吗?

由于

1 个答案:

答案 0 :(得分:0)

如果我能正确理解你,那就是“并行”。您正在询问的方面。

Rspec可以与并行测试(parallel_tests gem)一起使用但是我不能确保在around hook中调用类似3.times { blk.call }的东西将并行运行每个块。

另一种方法可能是使用您的示例定义进行元编程,即

  test_envs.each do |env_name|
    it "does something in #{env_name}" do
      # do something with the specific environment
    end
  end

现在,我还没有真正使用过这个宝石,但我不确定它是否会起作用。我认为最简单的解决方案可能是编写一个包装脚本来调用测试

  # run_tests.rb

  environments = ENV["TEST_ENV"]&.split(",") || []\
  filename = ENV["filename"]
  environments.each do |env_name|
    Thread.new do
      system <<-SH
        env TEST_ENV=#{env_name} bundle exec rspec #{filename}
      SH
    end
  end

env TEST_ENV=foo,bar ruby run_tests.rb一样运行它会在自己的线程中调用以下命令:

  • env TEST_ENV=foo bundle exec rspec
  • env TEST_ENV=bar bundle exec rspec

我喜欢这种方法,因为这意味着您不必触摸现有的测试代码。