Ruby on rails 为什么将rails从3.1.0升级到3.2.0后,我的测试速度会变慢?

Ruby 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

我遵循了以下升级说明:

以下是我的三个小升级更改:

(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-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应用程序,尽管它运行的是rails
3.2.5
,一个几乎相同的单元测试(在相同的两次验证上的相同断言)在0.465489秒(不到半秒)内完成

以下是上述“名称为有效的仓库”测试的测试日志的相关部分:

为了比较,这里是我的rails
3.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
之间是否有什么变化导致了这种情况?请注意,在同一台机器上的另一个应用程序(直接使用rails
3.2.5
——即未从较低版本升级)中,几乎相同的测试不受此问题的影响(整个测试套件中的任何内容也不受此影响)。想法?不确定。然而,如果没有事务性固定装置,我希望测试数据库中的某些值在某个时刻发生更改。你有过这样的经历吗?我想你有什么发现!我已经更新了我的问题,日志显示了事务方面的显著差异(多个嵌套的开始/回滚事务与另一个未受影响的应用程序的等效测试中的单个开始/回滚事务相比)。使用
self.use\u transactional\u fixtures=true
测试中没有任何差异,而使用self.use\u transactional\u fixtures=false时,没有开始/回滚块(但也没有速度差异)。这听起来真的很奇怪。您是否也更改了数据库?听起来数据库似乎没有进行事务处理。