我正在为一个我想在多个环境中运行的网页编写一些测试。这个想法是测试将在一个中运行,然后在下一个中重复。这两个环境是预览和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
但是,我的目标是设置test_env=preview,uat
并让它们在两种环境中连续运行。
我在这里错过了一些明显的东西吗?
由于
答案 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
我喜欢这种方法,因为这意味着您不必触摸现有的测试代码。