如何在不同的配置中运行rspec测试

时间:2014-04-11 23:31:19

标签: ruby rspec automated-tests

我的问题一定已经解决但我无法找到。

我在各种描述块中有不同文件中的测试/示例。这些测试可以在手机,平板电脑和台式机三种不同配置下运行。通过测试分组的最佳实践是什么,以便我可以一起运行它们或独立运行它们。

我尝试了shared_example方法

shared_examples 'tests' do |form_factor|
   it 'example 1' do 
   end
   it 'example 2' do 
   end
   it 'example 3' do 
   end
end

在另一个档案中

 shared_examples 'tests' do |form_factor|
    it 'example 1' do 
    end
    it 'example 2' do 
    end
 end

但是这种方法不适用于另一个文件中的测试。只要我在另一个文件中添加另一个shared_examples块,我就会得到

WARNING: Shared example group 'tests' has been previously defined at:
  /1_spec.rb:3
...and you are now defining it at:
  /2_spec.rb:2
The new definition will overwrite the original one.

我也尝试过使用环境变量的方法,但是在命令行上传递所有这些

FORM_FACTOR=phone rspec .
FORM_FACTOR=table rspec . 

看起来很笨重。建议?我的目标是能够传递不同的form_factor或运行所有这些。所以,如果我做了像

这样的事情
  

rspec run_all

应传递所有形状因子并运行所有三个测试 如果我发送

  

rspec run_phone

只能发送电话

3 个答案:

答案 0 :(得分:6)

为不同的过滤器添加spec/spec_helper.rb文件自定义配置:

RSpec.configure do |config|
  if config.filter[:type] == :desktop
    # configuration for desktop
  elsif config.filter[:type] == :tablet
    # configuration for tablet
  end
  ....
end

是的,您仍然需要为每种类型运行单独的命令,但为什么不将它们连接成一个:

rspec --tag type:desktop; rspec --tag type:tablet; rspec --tag type:phone

另一种选择是创建Rake任务,为每种类型运行rspec测试。

答案 1 :(得分:4)

您是否考虑过使用tags?:

describe "a test", :phone do
  ...
end

describe "another test", :tablet do
  ..
end

$ rspec --tag phone # runs examples/groups tagged :phone

describe "yet another test", :type => :desktop do
  ...
end

$ rspec --tag type:desktop  # runs examples/groups tagged :desktop

答案 2 :(得分:2)

我相信你想要的是RSpec shared_examples和标签的组合。

我将展示一个非常简洁的例子:

shared_examples "testable device" do |form_factor|
  it "example 1" do
  end
  it "example 2" do
  end
end

context "with a tablet", type: :tablet do
  let(:configuration) { }
  it_behaves_like "testable device", "700x800"
end

context "with a phone", type: :phone do
  let(:configuration) { }
  it_behaves_like "testable device", "300x400"
end

如果您不想进行其他配置,只需运行所有类型,就可以正常运行rspec。如果您只想要特定类型rspec --tag type:phone

如果您在多个文件中使用这些配置,我建议您查看:shared_context

shared_context "tablet configuration", type: :tablet do
  before { @some_var = :some_value }

  def shared_method
    "it works"
  end

  let(:configuration) { {'arbitrary' => 'object'} }
end

默认情况下,如果您为shared_context定义提供元数据,则上下文将自动包含在具有匹配元数据的规范中。