2011-07-05 17 views
5

मैं रेल 3 पर रूबी का उपयोग कर रहा हूं और परीक्षण लिख रहा हूं लेकिन यह बहुत धीमा है। क्या यह तेज़ करने के लिए कुछ अच्छा कॉन्फ़िगरेशन या टूल्स है?मैं आरओआर पर तेजी से परीक्षण कैसे चला सकता हूं?

+3

आप [Spork] (साथ http://rubygems.org/ बूटस्ट्रैप कर सकता है रत्न/स्पार्क) –

उत्तर

2

@eml कहते हैं, अगर आप RSpec उपयोग कर रहे हैं, तो आप Spork उपयोग कर सकते हैं। यह मूल रूप से पर्यावरण को सक्रिय करता है (जो धीमा हिस्सा होता है) और फिर इसे अपने चश्मे चलाने पर हर बार मजबूर करता है।

"पर्यावरण हमेशा लोड" समस्या के लिए एक सामान्य समाधान के लिए rails-sh स्थापित कर सकते हैं और अपने परीक्षण खोल के भीतर से चला सकते हैं।

साइड-नोट: रूबी 1.9.3 को इस समस्या को थोड़ा कम करना चाहिए क्योंकि आवश्यक समय को अनुकूलित किया गया है।

4

शायद सबसे बड़ी गति लाभ डेटाबेस हिट करने के लिए नहीं है जब तक आप की जरूरत है सावधान किया जा रहा से आता है। डेटाबेस से उन्हें लाने के बजाय मॉक ऑब्जेक्ट्स, और/या (यदि आप फ़ैक्टरी लड़की का उपयोग कर रहे हैं) फैक्टरी (: सामान) के बजाय फैक्ट्री (बिल्डिंग) का उपयोग करें जहां भी संभव हो। केवल तभी जब आप ऐसा करते हैं तो आपको स्पार्क

अद्यतन: व्यक्तिगत रूप से, मुझे यह भी लगता है कि आपको अपने परीक्षणों की गति के बारे में भी लटका नहीं देना चाहिए। तेज़ी से बेहतर है, लेकिन एक आवेदन बढ़ने के साथ, परीक्षण सूट बढ़ेगा, और फिर भी सावधान रहें कि आप अंततः धीमे हो जाएंगे। मैं autotest मणि पर अधिक से अधिक भरोसा करने के लिए आ रहा हूँ जो पृष्ठभूमि में कोड बदलता है और काम करता है (गार्ड-आरएसपीसी एक समान काम करता है)। जब तक आपका ऐप 1000 परीक्षण तक पहुंचता है तब तक आप पूरे सूट को हर बार बदलने के लिए इंतजार नहीं करना चाहेंगे, हालांकि परीक्षण तेज हो जाते हैं।

+0

महान सलाह। मैं वास्तव में कोड की सराहना करता हूं जहां आप बता सकते हैं कि डेवलपर ने इस क्षेत्र में देखभाल की है। मेरी एकमात्र चेतावनी, मैं जरूरी नहीं कि स्पार्क के लिए जरूरी तेज परीक्षणों पर जोर दे। विशेष रूप से जब चुनिंदा चश्मा के एक छोटे से सेट को निष्पादित करते हैं, जहां रेल वातावरण को लोड करना वास्तविक प्रतिबाधा हो सकता है। –

+0

उचित बिंदु - मुझे लगता है कि यह वास्तव में पाठ्यक्रमों के लिए घोड़े हैं - मैं उन अन्य उत्तरों में से एक प्रतिक्रिया कर रहा था जो सुझाव देते थे कि स्पार्क कुछ प्रकार की चांदी की बुलेट थी ... मुझे नहीं लगता कि यह लेखक का इरादा है, लेकिन मैं सोचा था कि यह थोड़ा भ्रामक था – chrispanda

2

IMHO परीक्षण का मुख्य धीमा हिस्सा जुड़नार के डिफ़ॉल्ट कॉन्फ़िगरेशन है। आपके विन्यास (test/test_helper.rb में) है:

class ActiveSupport::TestCase 
    self.use_transactional_fixtures = false 
    self.pre_loaded_fixtures = false 
    self.use_instantiated_fixtures = true 

तो पहले प्रत्येक परीक्षा विधि अपने परीक्षण डेटाबेस पुराने डेटा से साफ किया जाता है, सभी तालिकाओं भर जाती है, सभी रिकॉर्ड स्मृति में पढ़ा जाता है।

आप विपरीत करने के लिए सेटिंग में बदलाव हैं:

class ActiveSupport::TestCase 
    self.use_transactional_fixtures = true 
    self.pre_loaded_fixtures = true 
    self.use_instantiated_fixtures = false 

तो डेटाबेस प्रत्येक परीक्षा फ़ाइल के लिए केवल एक बार निर्मित है, और आप केवल रिकॉर्ड क्या तुम सच में प्रत्येक परीक्षा पद्धति में आवश्यकता लोड।

यह आपके परीक्षण डेटासेट के आकार पर निर्भर करता है कि क्या आपको परीक्षण डेटाबेस निर्माण का समय स्वीकार्य है। जब मेरे पास टेस्ट डेटा का कुछ बड़ा सेट था, तो मैंने पूरे परीक्षण सूट से पहले केवल एक बार फिक्स्चर लोड किए थे, लेकिन वह परियोजना रेल 1 में थी (और) मैंने इसे बहुत अधिक संशोधित किया है, इसलिए मैं यह नहीं बता सकता कि इसे कैसे किया जाए रेल 3 में (कम से कम जब तक समस्या कुछ नई परियोजना में दर्दनाक होने लगती है;)।

एक गंभीर चर्चा है कि परीक्षण डेटाबेस को मारा जाना चाहिए या नहीं। यदि आप मानते हैं कि उन्हें (डेटाबेस सहयोग का परीक्षण भी किया जाना चाहिए), तो आप जांच सकते हैं कि इन पैरामीटर को सेट करने से आप (या इन उत्तरों को पढ़ने वाले किसी भी व्यक्ति) की सहायता कर सकते हैं।

0

मैं Spork और Guard की सिफारिश करता हूं, वे दोनों RSpec के साथ पूरी तरह से काम कर सकते हैं।

Spork मदद कर सकते हैं और अधिक तेजी से परीक्षण चलाने के लिए, http://railscasts.com/episodes/285-spork

Guard मदद कर सकते हैं परीक्षण स्वचालित रूप से चलाने के लिए। http://railscasts.com/episodes/264-guard

0

विकसित करने का प्रयास करें ताकि आपके अधिकांश परीक्षण पूरे रेल एप्लिकेशन ढांचे को लोड किए बिना निष्पादित किए जा सकें। अपने कल्पना सहायक में, पर्यावरण या rpec लोड हो रहा है छोड़/रेल अगर केवल तेजी से परीक्षण निष्पादित किया जा रहा है, कुछ की तरह ...

# /spec/spec_helper.rb 
if RSpec.configuration.inclusion_filter[:fast] 
    # Setup required for fast tests in particular (if any) 
    # ... 
else 
    ENV["RAILS_ENV"] ||= 'test' 
    require File.expand_path("../../config/environment", __FILE__) 
    require 'rspec/rails' 

    Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 
end 

RSpec.configure do |config| 
    # ... 

    unless RSpec.configuration.inclusion_filter[:fast] 
    # If you're not using ActiveRecord, or you'd prefer not to run each of your 
    # examples within a transaction, remove the following line or assign false 
    # instead of true. 
    config.use_transactional_fixtures = true 
    end 
end 

के रूप में "तेज" एक परीक्षण चिह्नित करने के लिए, अपने it कॉल करने के लिए , :fast => true विकल्प जोड़ने या आसपास के describe कॉल पर।

केवल तेज़ परीक्षण चलाने के लिए, अपने कमांड शैल से rspec --tag fast निष्पादित करें।

यह पता लगाना मुश्किल हो सकता है कि आपके कोड को कैसे व्यवस्थित किया जाए ताकि परीक्षण रेल से अलग हो सकें (और निश्चित रूप से, आप अभी भी कार्यात्मक और एकीकरण परीक्षण करना चाहते हैं जो अलग से नहीं चलते हैं)।

मेरे शस्त्रागार में एक चाल सीधे ActiveRecord मॉडल या अन्य ऐसी कक्षा पर कोड लिखने से बचने के लिए है, और इसे इसके बजाय एक मिश्रण मॉड्यूल पर लिखना पसंद करते हैं। आप RSpec उपयोग कर रहे हैं आप एक वस्तु है कि कि मॉड्यूल के लिए बढ़ा दी है हो के अधीन रहते हुए को परिभाषित करते हुए mixin मॉड्यूल परीक्षण कर सकते हैं ...

describe 'MyModule', :fast => true 
    subject{ Object.new.tap{|o| o.extend MyModule} } 

    it 'does something' do 
    # ... 
    end 
end 
संबंधित मुद्दे