gpt4 book ai didi

ruby-on-rails - 事件记录模型测试的性能

转载 作者:数据小太阳 更新时间:2023-10-29 08:50:33 25 4
gpt4 key购买 nike

作为 TDD 和 Rails 领域的新手,我正在尝试弄清楚如何减少规范的运行时间。

我放弃了 Rails 框架的加载,只加载了 ActiveRecord 部分。这很有帮助 (-8s),但我仍然想知道我是否可以做更多的事情。

spec 文件有 5 个示例,使用 time rspec path_to_spec.rb 运行它需要 1.7s。当我删除 FactoryGirl 并改用 Project.create 时,我达到了 1.4s。

我想测试的是模型的范围和查询组合是否正常工作。我不确定在这种情况下是否可以使用模拟/stubing。

  1. 有没有一种方法可以利用模拟/ stub 功能来测试 next_project 的行为?
  2. 我怎么知道 ActiveRecord 交互时间的限制是多少?我的意思是,在测试 ActiveRecord 模型时,我必须处理 1-2 秒的执行时间吗?
  3. 关于如何加快速度的任何其他建议?

我正在使用 ruby​​ 1.9.3、rspec 2.1.12、ActiveRecord 3.2.9

我的模型文件:

class Project < ActiveRecord::Base
default_scope where(:is_enabled => true).order(:position)

def self.by_slug(slug)
where(:slug => slug).first
end
def find_neighbors
Neighbors.new(previous_project, next_project)
end

private
def previous_project
Project.where("position < ?", position).last
end
def next_project
Project.where("position > ?", position).first
end
end

Neighbors = Struct.new(:previous, :next)

我的规范文件:

require 'active_record'
require 'yaml'
require 'factory_girl'
require './app/models/project'
dbconfig = YAML::load(File.open('./config/database.yml'))
ActiveRecord::Base.establish_connection(dbconfig["test"])

FactoryGirl.define do
factory :project do
slug { name.parameterize }
sequence(:position, 1)
is_enabled true
end
end

describe Project do
before(:all) do
@first_project = FactoryGirl.create(:project, name: "First Project")
@second_project_disabled = FactoryGirl.create(:project, name: "Second Project", is_enabled: false)
@third_project = FactoryGirl.create(:project, name: "Third Project")
@fourth_project_disabled = FactoryGirl.create(:project, name: "Fourth Project", is_enabled: false)
@fifth_project = FactoryGirl.create(:project, name: "Fifth Project")
end
after(:all) do
projects = [@first_project, @second_project_disabled, @third_project, @fourth_project_disabled, @fifth_project]
projects.each { |p| p.delete }
end

context "when requesting a project by URL slug" do
it "should return that project if it is enabled" do
Project.by_slug(@third_project.slug).should eql(Project.find(@third_project.id))
end
it "should not return the project if it is not enabled" do
Project.by_slug(@fourth_project_disabled.slug).should be_nil
end
end
context "when getting first project" do
it "should have a reference only to the next project enabled" do
neighbors = @first_project.find_neighbors
neighbors.previous.should be_nil
neighbors.next.should eql(Project.find(@third_project.id))
end
end

# 2 more examples similar to the last one
end

最佳答案

除了调整您的数据库以尝试使其运行得更快之外,因为许多数据库都带有严重次优的默认配置,这只是您必须处理的事情之一。不过,有几件事可以提供帮助。

Ruby 1.9.3 在初始化 Rails 环境方面比以前的版本快很多,所以您使用它很好。过去,在某些机器上,仅仅调出一个控制台就需要大约 20 秒。由于一些内部优化,最近有所改善。

不过,不要期望您的单元测试会立即运行。几秒钟通常没什么大不了的。如果可以,运行重点 测试,即一次一个测试方法,然后是整个测试模块,然后是整个测试套件。有许多适用于流行编辑器的插件可以帮助解决此问题。

好消息是 Rails 4 正在做一些工作来制作 more persistent testing process但尚不清楚这是否会出现在已发布的版本中。

关于ruby-on-rails - 事件记录模型测试的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com