13

如何将 rspec 2 测试组织成“单元”(快速)和“集成”(慢)类别?

  • 我希望能够仅使用rspec命令运行所有单元测试,而不是“集成”测试。
  • 我希望能够只运行“集成”测试。
4

5 回答 5

22

我们有相同性质的团体。然后我们在本地开发盒和 CI 上一一运行。

你可以简单地做

bundle exec rake spec:unit
bundle exec rake spec:integration
bundle exec rake spec:api

这就是我们的 spec.rake 的样子

  namespace :spec do
    RSpec::Core::RakeTask.new(:unit) do |t|
      t.pattern = Dir['spec/*/**/*_spec.rb'].reject{ |f| f['/api/v1'] || f['/integration'] }
    end

    RSpec::Core::RakeTask.new(:api) do |t|
      t.pattern = "spec/*/{api/v1}*/**/*_spec.rb"
    end

    RSpec::Core::RakeTask.new(:integration) do |t|
      t.pattern = "spec/integration/**/*_spec.rb"
    end
  end
于 2012-04-05T13:26:28.947 回答
9

一种方法是像这样标记您的 RSpec 测试用例:

it "should do some integration test", :integration => true do
  # something
end

当您执行测试用例时,请使用:

rspec . --tag integration

这将执行所有带有标签的测试用例:integration => true。有关更多信息,请参阅此页面

于 2012-04-05T13:18:53.453 回答
1

我必须按如下方式配置我的unit和测试:feature

require 'rspec/rails'

namespace :spec do
  RSpec::Core::RakeTask.new(:unit) do |t|
    t.pattern = Dir['spec/*/**/*_spec.rb'].reject{ |f| f['/features'] }
  end

  RSpec::Core::RakeTask.new(:feature) do |t|
    t.pattern = "spec/features/**/*_spec.rb"
  end
end

必须在@KensoDev 给出的答案中添加require 'rspec/rails'和更改。RspecRSpec

于 2014-02-22T19:59:20.813 回答
0

请注意https://github.com/rspec/rspec-rails,他们告诉您将 gem 放在“group :development, :test”下,如下所示,

group :development, :test do
  gem 'rspec-rails', '~> 2.0'
end

但是如果你只把它放在 :test group only下,

group :test do
  gem 'rspec-rails', '~> 2.0'
end

那么你会得到上面的错误。

高温高压

于 2013-09-11T15:10:46.007 回答
0

我建议使用.rspec文件来配置模式而不是使用rake,因为在使用 rake 时将标志传递给 RSpec 很棘手。

您可以在.rspec文件中读取环境变量:

<%= if ENV['TEST'] == 'integration' %>
--pattern spec/integration/**/*_spec.rb
<% else %>
<% ENV['TEST'] = 'unit' %>
--pattern spec/unit/**/*_spec.rb
<% end %>

Then you can run TEST=integration rspec to run integration tests or just rspec to run unit tests. The advantage of this approach is that you can still pass flags to it like:

TEST=integration rspec -t login -f doc

于 2018-03-18T03:24:38.593 回答