如何为性能配置minitest并手动创建/删除灯具

时间:2015-12-02 17:03:49

标签: ruby-on-rails ruby-on-rails-4 minitest

我的问题:

  • 客户数据库位于VPN上的计算机上,因此我的测试非常慢(每次大约30-40秒)
  • 此数据库并非完全适用于我的应用程序,而且我的数据与数据库中已有的数据相关
  • 旧数据库表中存在复合主键,而informix适配器不支持fixtures

我正在使用的内容:

  • Ruby on Rails 4.2.5
  • Jruby 9.0.1.0
  • 通过JDBC连接的Informix数据库
  • MINITEST
  • MINITEST-reportes

到目前为止我做了什么:

  • 使用Devise.stretches = 1Rails.logger.level = 4配置,测试时间在5-10秒内减少。
  • 我不能使用fixture来获取与系统中的表有关系并且具有复合主键的数据,因此我为这些表构建了自己的fixture方法,在第一次使用时删除并创建了对象并且可以在创建后将它们缓存在全局变量中,而无需在下次测试时转到数据库。我几乎每次测试都插入了这些数据,因此我可以减少一点时间。
  • 显然,rails fixtures正在删除并在每次测试中创建它们,所以我尝试禁用事务性灯具(self.use_transactional_fixtures = false),但显然这不会改变事情。
  • 我需要重置"我的灯具"在测试套件之前,不幸的是导轨固定装置取决于它们,当我试图删除我的数据时,我遇到了一些错误。试图放弃我的灯具"在使用此代码创建rails fixture之前:

    class ActiveRecord::FixtureSet
      class << self
        alias :orig_create_fixtures :create_fixtures
      end
    
      def self.create_fixtures f_dir, fs_names, *args
        reset_cache
    
        #Deleting my fixture data
        People.delete_all
    
        orig_create_fixtures f_dir, fs_names, *args
      end
    end
    

上述代码的问题是delete_all正在每次测试中执行。

除了错误之外,我得到了所有这些装置,我将测试时间减少到大约8秒。

我的测试助手:

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require "rails/test_help"
require 'minitest/autorun'
require 'minitest/reporters'

Minitest.backtrace_filter = Minitest::BacktraceFilter.new

# Load support files
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }

ActiveSupport::TestCase.class_eval do
  extend MiniTest::Spec::DSL

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  self.use_transactional_fixtures = false

  Devise.stretches = 1
  Rails.logger.level = 4

  reporter_options = {color: true, slow_count: 5}
  Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(reporter_options)]
end

我能做得更好吗?有关删除数据解决此问题的任何线索?有什么办法可以提高我的测试性能吗?

0 个答案:

没有答案