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


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

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

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

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

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 Postgres त्रुटियों को लॉग करने का कारण बनता है कि यह डेटाबेस नहीं ढूंढ सकता है, लेकिन यह उन्हें (टेबल के बिना) बनाता है। बाद के रन पर, कोई त्रुटि लॉग नहीं होती है, लेकिन कोई भी टेबल नहीं बनाया जाता है। यह संभव है कि मेरा पूरा मुद्दा बस एक बग है prepare, इसलिए मैंने इसे गीथूब पर बताया।

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


77
2018-05-06 19:29


मूल




जवाब:


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

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

समस्या निवारण रेक कार्यों की मूल बातें हुड के नीचे क्या हो रहा है यह देखने के लिए --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


13
2018-05-07 16:48



हां, मैंने --trace के साथ रेक रेक चलाया है और अपने कुछ कार्यों को अपने तैयार specjour हुक में दोहराने का प्रयास किया है, लेकिन यह अभी तक काम नहीं किया है। चीजों को स्थापित करने के लिए मैं संभावित रूप से एक अलग अलग रेक कार्य लिख सकता हूं, लेकिन यह एक और कदम है जिसे मैं टालने की उम्मीद कर रहा था। - gerry3


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

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

gerry3 अवलोकन किया कि:

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

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


139
2018-06-22 14:53



एक आसान समाधान बस चलाने के लिए है rake db:test:prepare। - gerry3
मुझे कोई समस्या नहीं चल रही है rake db:test:prepare पोस्टग्रेस के साथ। आपको किसी अन्य कारण से अपना मुद्दा देखना होगा। - gerry3
rake db:test:prepareयदि डीबी मौजूद नहीं है तो काम नहीं करेगा - iRonin
जैसा दिखता है rake db:test:prepare रेल 4 में बहिष्कृत है। - markquezada
आप इस तरह चेन रेक चेन कर सकते हैं: bundle exec rake db:drop db:create db:schema:load RAILS_ENV=test - TheCha͢mp


प्रदान किए गए समाधानों को सभी को रेल पर्यावरण को लोड करने की आवश्यकता होती है, जो कि ज्यादातर मामलों में, बहुत बड़े ओवरहेड और बहुत कम गति के कारण वांछित व्यवहार नहीं है। DatabaseCleaner मणि भी धीमा है, और यह आपके ऐप पर एक और निर्भरता जोड़ता है।

सुप्रा के कारणों के कारण धन्यवाद और छेड़छाड़ के महीनों के बाद, मुझे आखिरकार निम्नलिखित समाधान मिल गया जो मुझे चाहिए। यह अच्छा, सरल और तेज़ है। में spec_helper.rb:

config.after :all do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end

इसके बारे में सबसे अच्छा हिस्सा यह है: यह केवल उन तालिकाओं को साफ़ करेगा जो आपके पास प्रभावी ढंग से हैं छुआ (बिना छेड़छाड़ वाले मॉडल लोड नहीं होंगे और इस प्रकार दिखाई नहीं देंगे subclasses, यह भी कारण है कि यह काम नहीं करता है से पहले परीक्षण)। इसके अलावा, यह परीक्षण के बाद निष्पादित होता है, इसलिए (उम्मीद है कि) हरे रंग के बिंदु तुरंत दिखाई देंगे।

इसका एकमात्र नकारात्मक पक्ष यह है कि यदि आपके पास परीक्षण चलाने से पहले एक गंदे डेटाबेस है, तो इसे साफ़ नहीं किया जाएगा। लेकिन मुझे संदेह है कि यह एक बड़ा मुद्दा है, क्योंकि परीक्षण डेटाबेस आमतौर पर बाहरी परीक्षणों से छुआ नहीं जाता है।

संपादित करें

इस जवाब के रूप में देखकर कुछ लोकप्रियता प्राप्त हुई है, मैं इसे पूर्णता के लिए संपादित करना चाहता था: यदि आप साफ़ करना चाहते हैं सब टेबल, यहां तक ​​कि स्पर्श नहीं किए गए हैं, आपको नीचे "हैक" की तरह कुछ करने में सक्षम होना चाहिए।

हैक 1 - सभी मॉडलों के लिए पूर्व लोडिंग subclasses तरीका

कॉल करने से पहले इसका मूल्यांकन करें subclasses:

Dir[Rails.root.join("app", "models", "**", "*.rb")].each(&method(:require))

ध्यान दें कि इस विधि में कुछ समय लग सकता है!

हैक 2 - मैन्युअल रूप से टेबल को छोटा कर रहा है

ActiveRecord::Base.connection.tables.keep_if{ |x| x != 'schema_migrations' }

आपको सभी टेबल नाम मिलेंगे, जिनके साथ आप कुछ ऐसा कर सकते हैं:

case ActiveRecord::Base.configurations[Rails.env]["adapter"]
when /^mysql/, /^postgresql/
  ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")
when /^sqlite/
  ActiveRecord::Base.connection.execute("DELETE FROM #{table_name}")
  ActiveRecord::Base.connection.execute("DELETE FROM sqlite_sequence where name='#{table_name}'")
end

14
2017-08-04 03:37



साफ! यह काफी उपयोगी है। - odigity


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

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

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


5
2018-05-20 10:00





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

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

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

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

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

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


3
2017-07-07 19:56