成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

提升你的 Rails Specs 性能 10 倍

開發 后端 前端
人們疏于在Rails開發應用中去駕馭規范的一個基本的原因是運行的規范套件所需要的時間。很多工具可以用來緩和這個麻煩,比如 Spork , Zeus 和 Spring。事實上,Rails 4.1將會在春季推出標準。

人們疏于在Rails開發應用中去駕馭規范的一個基本的原因是運行的規范套件所需要的時間。很多工具可以用來緩和這個麻煩,比如 Spork Zeus 和  Spring。事實上,Rails 4.1將會在春季推出標準。不幸的是,這些工具僅僅是解決問題癥狀的 一個拐杖,而不是解決問題本身。實際的問題是書寫耦合度高的代碼需要有一個完整的Rails的架構支撐,這個架構會緩慢啟動。

開發解耦代碼

一種解決方法是:書寫的代碼是獨立的,元件盡可能的與系統分離。用另外的話說,就是寫SOLID Rails 代碼。舉一個特殊的例子,可以直接寫一個類模塊去創建一個事例。而不是使用依賴的插入的方法去去除涉及到類的硬編碼。我們僅僅需要去保證:我們安全的采用模塊符號或者懶惰的評價去得到默認的引用。以下是一個服務,它需要在ActiveRecord模塊中創建一個小工具。我們采用懶惰的評價去介入的方法來替換直接的引用工具類。這可以解耦我們的代碼,同時不需要ActiveRecord載入。

  1. # A tightly coupled class. We don't want this.  
  2. class MyService  
  3.   def create_widget(params)  
  4.     Widget.create(params)  
  5.   end 
  6. end 
  7.  
  8. # We can inject in the initializer  
  9. class MyService  
  10.   attr_reader :widget_factory  
  11.  
  12.   def initialize(dependencies={})  
  13.     @widget_factory = dependencies.fetch(:widget_factory) { Widget }  
  14.   end 
  15.  
  16.   def create_widget(params)  
  17.     widget_factory.create(params)  
  18.   end 
  19. end 
  20.  
  21. Or we can explictly inject via a setter with a lazy reader  
  22. class MyService  
  23.   attr_writer :widget_factory  
  24.  
  25.   def widget_factory  
  26.     @widget_factory ||= Widget  
  27.   end 
  28.  
  29.   def create_widget(params)  
  30.     widget_factory.create(params)  
  31.   end 
  32. end 
  33.  
  34. # A specification injecting the dependency using the second method  
  35. describe MyService do  
  36.   subject(:service) { MyService.new }  
  37.   let(:widget_factory) { double 'widget_factory'create: nil }  
  38.   before { service.widget_factory = widget_factory }  
  39.  
  40.   it 'creates a widget with the factory' do  
  41.     service.create_widget({name'sprocket'})  
  42.     expect(widget_factory).to have_received(:create).with({name'sprocket'})  
  43.   end 
  44. end 

當你采用這種方式寫代碼時,你可以開始重新組織怎么建立自己的規范和最小化環境需求來運行這些規范和滿足規則需求的代碼。典型spec_helper.rb會有一個如下的一行代碼:

  1. require File.expand_path("../../config/environment", __FILE__)  

這個將會載入整個的Rails程序且降低測試運行速度。為了讓規范達到更快的速度,可以使用一個不含有上面那行代碼的配置文件。那么讓我們開始創建一個輕量級的rb包:base_sepc_helper.rb:

  1. ENV["RAILS_ENV"] ||= 'test' 
  2. require 'rubygems' 
  3.  
  4. RAILS_ROOT = File.expand_path('../..', __FILE__)  
  5. Dir[File.join(RAILS_ROOT, 'spec/support/**/*.rb')].each {|f| require f}  
  6.  
  7. RSpec.configure do |config|  
  8.   config.mock_with :rspec 
  9.   config.order = 'random' 
  10.   # Your prefered config options go here  
  11. end 
  12.  
  13. require 'active_support' 
  14. require 'active_support/dependencies' 

我們通過請求active_support和active_support/dependencies包來訪問Rails使用的自動裝載機,實際上并沒有導入所有的Rails。它是相當的輕量級并且方便性超過了損耗。在每個需要這個base包的helper里,我們將會添加我們程序相對應的部分到ActiveSupport::Dependencies.autoload_paths中。

簡單的Ruby對象說明

取決于你指定的應用程序部分,你可以在任意一個上下文中創建一個你所需要的輔助細則。例如,最簡單的是指定一個任意類型的Ruby純類作為服務類。如下面services_spec_helper.rb例子

  1. require 'base_spec_helper' 
  2. Dir[File.join(RAILS_ROOT, "spec/support_services/**/*.rb")].each {|f| require f}  
  3. ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/services" 

裝飾說明

于你的裝飾而言,你可能會選擇布商,你的decorators_spec_helper.rb就如以下所看到的。

  1. require 'base_spec_helper' 
  2. require 'draper' 
  3. Draper::ViewContext.test_strategy :fast 
  4. Dir[File.join(RAILS_ROOT, "spec/support_decorators/**/*.rb")].each {|f| require f}  
  5. ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/decorators" 

模塊規范

測試模塊還需要做一點事情. 假設你現在正在用ActiveRecord你會需要建立一個和數據庫的連接. 我們并不需要將defactory_girl或者database_cleaner加入你的測試中,而且并不會真的創建對象. 實際上,唯一需要進行創建數據庫對象的地方就是當你進行特定對象測試的時候.當你確實需要創建一些對象的時候,你只需要手動的進行清理和轉換. 這就是一個樣例models_spec_helper.rb:

  1. require 'base_spec_helper' 
  2. require 'active_record' 
  3. # RSpec has some nice matchers for models so we'll pull them in  
  4. require 'rspec/rails/extensions/active_record/base' 
  5. Dir[File.join(RAILS_ROOT, "spec/support_models/**/*.rb")].each {|f| require f}  
  6.  
  7. # Manually connect to the database  
  8. ActiveRecord::Base.establish_connection(  
  9.   YAML.load(File.read(RAILS_ROOT + '/config/database.yml'))['test']  
  10. )  
  11.  
  12. ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/models" 

特點說明

最后, 當我們創建特色應用時, 我們會需要Rails全套知識并且feature_spec_helper.rb看起來就和spec_helper.rb差不多了.

作為總結

我自己也開始在項目中加入這些改變并且這也讓我能用更加簡單的代碼去完成一個項目. 你們可以在Github上找到:https://github.com/Originate/rails_spec_harness

當在項目中引入這些變化時候,我發現速度至少增長了8-12倍. 變化最大的一個項目竟然增長了27倍同時也包括了這些對應的編程效率上的提高.舉個例子,我開始寫一個含有4個簡單例子的Ruby類. 然后我使用time命令行工具去衡量運行的效率,并且之后我能得到如下的結果,FULL Rails VS MINIMAL:

Spec Helper Real User Sys RSpec Reported
Full Rails 4.913s 2.521s 1.183s 0.0706s
Minimal 0.492s 0.407s 0.080s 0.0057s

寫牛逼的代碼,隔離你的單獨模塊,然后,享受編碼的樂趣吧。

英文原文:Speed Up Your Rails Specs by 10x

原文鏈接:http://www.oschina.net/translate/improve-your-rails-specification-speed-by-10x

責任編輯:林師授 來源: 開源中國社區 編譯
相關推薦

2020-07-21 15:40:55

NginxJava服務器

2011-07-01 10:11:39

2017-12-13 13:09:36

NginxWeb應用

2020-03-26 12:38:15

代碼節點數據

2025-05-27 01:55:00

TypeScript開發者項目

2024-10-29 08:21:05

2018-08-23 17:45:52

2019-09-26 08:33:51

Nginx技術Java

2020-07-22 08:30:02

代碼開發工具

2013-04-01 00:16:41

飛魚星無線云無線AP

2021-12-29 11:06:25

Java代碼技巧

2022-11-19 18:18:22

Spring架構

2022-12-13 08:45:01

3F傾聽模型

2024-11-25 09:11:43

2023-06-13 13:52:00

Java 7線程池

2023-10-20 08:12:00

JDK21線程池配置

2023-02-21 13:32:09

Linux 6.3操作系統

2022-09-09 09:33:14

支付寶代碼性能

2014-04-01 09:52:46

MySQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩一区二区在线 | 国产最好的av国产大片 | 色视频在线免费观看 | 在线播放第一页 | 国产一在线观看 | 国产精品成人一区二区三区 | 久久精品成人一区 | 日韩视频在线一区 | 亚洲精品国产一区 | 99国内精品久久久久久久 | 九九热这里 | 久久久久久国产精品 | 精品国产一区二区三区久久 | 免费成人在线网站 | 毛片网站免费观看 | 成人天堂 | 久久久网 | 一区二区三区免费在线观看 | 国产女人第一次做爰毛片 | 精品国产乱码一区二区三区a | 欧美成人h版在线观看 | 日韩欧美在 | 午夜久久av| 亚洲国产成人精品一区二区 | 一级h片 | 综合久 | 欧美日韩一区在线观看 | 日本在线看片 | 欧美日韩中文在线 | 久久视频免费看 | 日韩av免费在线观看 | 中文在线一区 | 精品欧美乱码久久久久久 | 国产黄色在线 | 亚洲精品视频在线观看视频 | 欧日韩不卡在线视频 | 国产美女在线免费观看 | 精品日韩一区二区 | 成人精品国产免费网站 | 欧美三级电影在线播放 | 精品欧美乱码久久久久久1区2区 |