【发布时间】:2012-04-05 13:10:24
【问题描述】:
如何将 rspec 2 测试组织成“单元”(快速)和“集成”(慢)类别?
- 我希望能够仅使用
rspec命令运行所有单元测试,而不是“集成”测试。 - 我希望能够只运行“集成”测试。
【问题讨论】:
标签: ruby-on-rails-3 testing rspec2
如何将 rspec 2 测试组织成“单元”(快速)和“集成”(慢)类别?
rspec 命令运行所有单元测试,而不是“集成”测试。 【问题讨论】:
标签: ruby-on-rails-3 testing rspec2
我们有相同性质的团体。 然后我们在本地开发盒和 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
【讨论】:
lib/tasks/spec.rake
一种方法是像这样标记您的 RSpec 测试用例:
it "should do some integration test", :integration => true do
# something
end
当你执行你的测试用例时,使用这个:
rspec . --tag integration
这将执行所有带有标签:integration => true 的测试用例。更多信息请参考page。
【讨论】:
rspec 命令时排除这些“集成”情况?
--tag "~integration" 放入您的项目.rpsec 文件中。这是我的首选方法。当然,它会被您可能在命令行上明确指定的选项所覆盖,因此您仍然拥有完全的灵活性。
我必须按如下方式配置我的 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' 并将Rspec 更改为RSpec。
【讨论】:
spec/unit),并使用不太复杂的模式(例如spec/unit/**/*_spec.rb)?
通知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
然后你会得到上面的错误。
HTH
【讨论】:
我建议使用.rspec 文件来配置模式,而不是使用rake,因为在使用 rake 时将标志传递给 RSpec 很棘手。
您可以在.rspec 文件中读取环境变量:
<%= if ENV['TEST'] == 'integration' %>
--pattern spec/integration/**/*_spec.rb
<% else %>
<% ENV['TEST'] = 'unit' %>
--pattern spec/unit/**/*_spec.rb
<% end %>
然后您可以运行TEST=integration rspec 来运行集成测试,或者只运行rspec 来运行单元测试。这种方法的优点是您仍然可以将标志传递给它,例如:
TEST=integration rspec -t login -f doc
【讨论】: