Ruby on rails 为什么将rails从3.1.0升级到3.2.0后,我的测试速度会变慢?
我遵循了以下升级说明: 以下是我的三个小升级更改: (1)GemfileRuby on rails 为什么将rails从3.1.0升级到3.2.0后,我的测试速度会变慢?,ruby-on-rails,performance,ruby-on-rails-3.1,upgrade,ruby-on-rails-3.2,Ruby On Rails,Performance,Ruby On Rails 3.1,Upgrade,Ruby On Rails 3.2,我遵循了以下升级说明: 以下是我的三个小升级更改: (1)Gemfile -gem 'rails', '3.1.0' +gem 'rails', '3.2.0' -gem 'rack', '1.3.3' +#gem 'rack', '1.3.3' group :assets do - gem 'sass-rails', ' ~> 3.1.0' - gem 'coffee-rails', '~> 3.1.0' - gem 'uglifier' + gem 'sass-r
-gem 'rails', '3.1.0'
+gem 'rails', '3.2.0'
-gem 'rack', '1.3.3'
+#gem 'rack', '1.3.3'
group :assets do
- gem 'sass-rails', ' ~> 3.1.0'
- gem 'coffee-rails', '~> 3.1.0'
- gem 'uglifier'
+ gem 'sass-rails', ' ~> 3.2.3'
+ gem 'coffee-rails', '~> 3.2.1'
+ gem 'uglifier', ' >=1.0.3'
gem 'asset_sync'
end
(2)config/environments/development.rb
+ config.active_record.mass_assignment_sanitizer = :strict
+ config.active_record.auto_explain_threshold_in_seconds = 0.5
- config.assets.allow_debugging = true
+ config.active_record.mass_assignment_sanitizer = :strict
require 'test_helper'
class StockroomTest < ActiveSupport::TestCase
fixtures :stockrooms
test "stockroom with name is valid" do
assert stockrooms(:wine_cellar).valid?, 'tried new wine_cellar'
end
(3)config/environments/test.rb
+ config.active_record.mass_assignment_sanitizer = :strict
+ config.active_record.auto_explain_threshold_in_seconds = 0.5
- config.assets.allow_debugging = true
+ config.active_record.mass_assignment_sanitizer = :strict
require 'test_helper'
class StockroomTest < ActiveSupport::TestCase
fixtures :stockrooms
test "stockroom with name is valid" do
assert stockrooms(:wine_cellar).valid?, 'tried new wine_cellar'
end
在升级之前,我的测试如下所示(每个测试都不到一秒):
之后(每次测试耗时超过1秒):
下面是上面单元测试之一的示例。现在(升级后)运行大约需要1.3秒,而之前不到0.01秒
测试/单元/仓库\u测试.rb
+ config.active_record.mass_assignment_sanitizer = :strict
+ config.active_record.auto_explain_threshold_in_seconds = 0.5
- config.assets.allow_debugging = true
+ config.active_record.mass_assignment_sanitizer = :strict
require 'test_helper'
class StockroomTest < ActiveSupport::TestCase
fixtures :stockrooms
test "stockroom with name is valid" do
assert stockrooms(:wine_cellar).valid?, 'tried new wine_cellar'
end
Stockroom
上仅有的两个验证是presence
和university
注意:我正在同一台机器上运行另一个rails应用程序,尽管它运行的是rails3.2.5
,一个几乎相同的单元测试(在相同的两次验证上的相同断言)在0.465489秒(不到半秒)内完成
以下是上述“名称为有效的仓库”测试的测试日志的相关部分:
为了比较,这里是我的rails3.2.5
app中的“等效”测试:
(0.2ms) SET FOREIGN_KEY_CHECKS = 1
(0.1ms) BEGIN
Email Load (0.4ms) SELECT `emails`.* FROM `emails` WHERE `emails`.`id` = 980190962 LIMIT 1
Email Exists (2.8ms) SELECT 1 FROM `emails` WHERE (`emails`.`email` = BINARY 'MyString' AND `emails`.`id` != 980190962) LIMIT 1
(0.2ms) ROLLBACK
我能想到的唯一答案是,您的测试在处理事务的方式上有所不同 如果一切正常,rails应该将每个测试包装在一个事务中并回滚该事务。因此,您基本上只“模拟”编写操作,不必在每次测试后回滚数据库,从而节省了大量时间 如果是这样,您可以在这里找到答案: 只有您可以尝试显式打开该功能 编辑:当您的输出显示您正在使用事务时,rails环境的加载方式可能会有所不同。请检查spec_helper.rb以了解奇怪的差异 您可以看看这篇文章,检查在启动测试套件时是否发生了奇怪的事情:
我个人会先试用最新的稳定rails
3.2.7
,但不幸的是3.2.7
没有任何区别。你能添加一个较慢的测试吗?@John我添加了一个较慢的测试(所有测试都较慢,但我添加了一个最简单的测试)@user664833您使用的Ruby版本是什么?嗯。。但是在3.1.0
和3.2.0
之间是否有什么变化导致了这种情况?请注意,在同一台机器上的另一个应用程序(直接使用rails3.2.5
——即未从较低版本升级)中,几乎相同的测试不受此问题的影响(整个测试套件中的任何内容也不受此影响)。想法?不确定。然而,如果没有事务性固定装置,我希望测试数据库中的某些值在某个时刻发生更改。你有过这样的经历吗?我想你有什么发现!我已经更新了我的问题,日志显示了事务方面的显著差异(多个嵌套的开始/回滚事务与另一个未受影响的应用程序的等效测试中的单个开始/回滚事务相比)。使用self.use\u transactional\u fixtures=true
测试中没有任何差异,而使用self.use\u transactional\u fixtures=false时,没有开始/回滚块(但也没有速度差异)。这听起来真的很奇怪。您是否也更改了数据库?听起来数据库似乎没有进行事务处理。