ruby on rails - मैं रैक स्पेक चलाने के बिना रेल आरएसपीईसी परीक्षणों के लिए टेस्ट डेटाबेस कैसे तैयार करूं?




ruby-on-rails ruby-on-rails-3 (4)

महत्वपूर्ण समस्या निवारण के बाद, मुझे पता चला कि मुझे एक बार rspec चला सकता है (उदाहरण के लिए हमारे चश्मे के सबसेट पर) चलाने से पहले मुझे एक बार rake spec चलाने की आवश्यकता होती है (मैं नियंत्रण-सी के साथ रोक सकता हूं)। हम रेल 3.0.7 और आरएसपीसी 2.5.0 चला रहे हैं।

जाहिर है, रेक कुछ महत्वपूर्ण डेटाबेस सेटअप कार्यों / कोड चला रहा है (हमारे पास मूल स्तर रेल राकफाइल और संभवतः अन्य स्थानों में कस्टम कोड है)।

मैं rake spec चलाने के बिना रेक परीक्षण डेटाबेस सेटअप कार्य / कोड कैसे चला सकता हूं?

फ़ाइलों के सबसेट पर rspec चलाने में सक्षम होने के अलावा, मैं अपने कोर को कई कोरों में फैलाने के लिए specjour का उपयोग कर रहा हूं (उन्हें अभी तक लैन में फैलाने में सफलता नहीं मिली है), लेकिन मुझे rspec चलाने के समान व्यवहार दिखाई देता है सीधे: मुझे specjour कार्यों से पहले प्रत्येक टेस्ट डेटाबेस (दो कोर मानते हुए) पर rake spec चलाने की आवश्यकता है:

rake spec TEST_ENV_NUMBER=1
control-c (after tests start)
rake spec TEST_ENV_NUMBER=2
control-c (after tests start)
specjour

नोट: मेरी कॉन्फ़िगरेशन / database.yml में परीक्षण के लिए यह प्रविष्टि है (समानांतर परीक्षण रत्नों के लिए सामान्य है):

test:
  adapter: postgresql
  encoding: unicode
  database: test<%=ENV['TEST_ENV_NUMBER']%>
  username: user
  password:

parallel_tests अपने डेटाबेस को सही ढंग से स्थापित करने लगता है, लेकिन हमारे कई चश्मे विफल हो जाते हैं।

मुझे यह भी उल्लेख करना चाहिए कि चलने वाले specjour prepare से पोस्टग्रेस त्रुटियों को लॉग इन कर देता है कि यह डेटाबेस नहीं ढूंढ सकता है, लेकिन यह उन्हें (टेबल के बिना) बनाता है। बाद के रन पर, कोई त्रुटि लॉग नहीं होती है, लेकिन कोई भी टेबल नहीं बनाया जाता है। यह संभव है कि मेरा पूरा मुद्दा बस prepare में एक बग है, इसलिए मैंने इसे गिटूब पर बताया।

मुझे लगता है कि मैं Specjour::Configuration.prepare को .specjour / hooks.rb में सेट करके प्रत्येक specjour परीक्षण डेटाबेस पर मनमाना कोड चला सकता हूं, इसलिए यदि कोई रेक कार्य या अन्य कोड है जिसे मुझे चलाने की आवश्यकता है, तो यह वहां काम कर सकता है।


एक वसंत-ified रेल 4 ऐप में, मेरे bin/setup आमतौर पर शामिल करने के लिए बढ़ाया जाता है

puts "\n== Preparing test database =="
system "RAILS_ENV=test bin/rake db:setup"

यह लेविथन के जवाब के समान ही है, साथ ही परीक्षण डीबी को बीजिंग भी करता है

rake db:setup # डेटाबेस बनाएं, स्कीमा लोड करें, और बीज डेटा के साथ आरंभ करें
( db:reset उपयोग करें db:reset डेटाबेस को पहले छोड़ने के लिए db:reset करें)

जैसा कि टिप्पणी का उल्लेख है, अगर हम पहले डीबी छोड़ना चाहते हैं, तो rake db:reset बस यही करता है।

मुझे यह भी लगता है कि rake db:test:prepare की तुलना में यह अधिक प्रतिक्रिया प्रदान करता है rake db:test:prepare


ऐसा लगता है कि रेल 4.1+ में, सबसे अच्छा समाधान केवल ActiveRecord::Migration.maintain_test_schema! जोड़ने के लिए है ActiveRecord::Migration.maintain_test_schema! require 'rspec/rails' बाद आपके rails_helper में।

यानी आपको डेटाबेस तैयार करने के बारे में चिंता करने की ज़रूरत नहीं है।

https://relishapp.com/rspec/rspec-rails/docs/upgrade#pending-migration-checks


मुझे सीआई सिस्टम को काम पर स्थापित करने में भी एक ही समस्या थी, इसलिए मैंने धीरे-धीरे इसे संभालने के लिए एक सिस्टम तैयार किया। यह सबसे अच्छा समाधान नहीं हो सकता है, लेकिन यह मेरी स्थिति में मेरे लिए काम करता है और मैं हमेशा चीजों को करने के बेहतर तरीकों की तलाश में हूं।

मेरे पास एक परीक्षण डेटाबेस है जिसे मुझे सेटअप की आवश्यकता है, लेकिन काम करने के लिए हमारे परीक्षणों के लिए लोड किए गए बीज वाले डेटा की भी आवश्यकता है।

समस्या निवारण रेक कार्यों की मूल बातें हुड के नीचे क्या हो रहा है यह देखने के लिए --trace विकल्प के साथ रेक चलाने के लिए है। जब मैंने ऐसा किया, तो मैंने पाया कि रेक स्पेक चलाने से कई चीजें होती हैं जिन्हें मैं एक कस्टम रेक कार्य में दोहराना (या संशोधित रूप में संशोधित) कर सकता हूं।

यहां हम क्या करते हैं इसका एक उदाहरण दिया गया है।

desc "Setup test database - drops, loads schema, migrates and seeds the test db"
task :test_db_setup => [:pre_reqs] do
  Rails.env = ENV['RAILS_ENV'] = 'test'
  Rake::Task['db:drop'].invoke
  Rake::Task['db:create'].invoke
  result = capture_stdout { Rake::Task['db:schema:load'].invoke }
  File.open(File.join(ENV['CC_BUILD_ARTIFACTS'] || 'log', 'schema-load.log'), 'w') { |f| f.write(result) }
  Rake::Task['db:seed:load'].invoke
  ActiveRecord::Base.establish_connection
  Rake::Task['db:migrate'].invoke
end

यह केवल एक उदाहरण है, और हमारी स्थिति के लिए विशिष्ट है, इसलिए आपको यह पता लगाना होगा कि आपके टेस्ट डीबी सेटअप को प्राप्त करने के लिए क्या करने की आवश्यकता है, लेकिन रेक के --trace विकल्प का उपयोग करना निर्धारित करना बहुत आसान है।

इसके अतिरिक्त, यदि आपको लगता है कि परीक्षण सेटअप बहुत लंबा समय ले रहा है (जैसा कि यह हमारे मामले में करता है), तो आप डेटाबेस को .sql प्रारूप में भी डंप कर सकते हैं और परीक्षण डेटाबेस को सीधे लोड करने के लिए mysql में पाइप कर सकते हैं। हम परीक्षण डीबी सेटअप से कई मिनट बचाते हैं। मैं इसे यहां नहीं दिखाता क्योंकि यह चीजों को काफी हद तक जटिल बनाता है - इसे बिना किसी बेवकूफ के ठीक से उत्पन्न किया जाना चाहिए।

HTH


मैं आपके परीक्षण डेटाबेस को छोड़ने की अनुशंसा करता हूं, फिर इसे फिर से बनाएं और माइग्रेट करें:

bundle exec rake db:drop RAILS_ENV=test
bundle exec rake db:create RAILS_ENV=test
bundle exec rake db:schema:load RAILS_ENV=test

इन चरणों के बाद आप अपने चश्मा चला सकते हैं:

bundle exec rspec spec

ने नोट किया कि:

एक आसान समाधान सिर्फ rake db:test:prepare चलाने के लिए है rake db:test:prepare

हालांकि, अगर आप PostgreSQL का उपयोग कर रहे हैं तो यह काम नहीं करेगा क्योंकि रेल वातावरण लोड हो जाता है, जो डेटाबेस कनेक्शन खोलता है। इससे prepare कॉल विफल हो जाती है, क्योंकि डीबी को नहीं छोड़ा जा सकता है। मुश्किल चीज





specjour