2016-01-23 13 views
6

मुझे Faker पसंद है, मैं इसे अपने seeds.rb में वास्तविक समय के साथ अपने देव पर्यावरण को पॉप्युलेट करने के लिए हर समय उपयोग करता हूं।क्या हमें रेल कारखानों में फेकर का उपयोग करना चाहिए?

मैंने अभी भी Factory Girl का उपयोग करना शुरू कर दिया है जो बहुत समय बचाता है - लेकिन जब मैं कोड उदाहरणों के लिए वेब के चारों ओर सोता हूं तो मुझे दो लोगों के संयोजन के बारे में ज्यादा सबूत नहीं दिखते हैं।

प्रश्न। क्या कोई अच्छा कारण है कि लोग कारखाने में फ़कर का उपयोग नहीं करते हैं?

मेरी भावना यह है कि ऐसा करने से मैं यादृच्छिक बीजिंग करके अपने परीक्षणों की मजबूती में वृद्धि करूंगा - लेकिन अनुमानित - प्रत्येक बार डेटा, जो उम्मीद है कि एक बग पॉपिंग की संभावना बढ़ जाएगी।

लेकिन शायद यह गलत है और कारखाने को हार्ड कोडिंग पर कोई लाभ नहीं है या मुझे संभावित नुकसान नहीं दिख रहा है। क्या कोई अच्छा कारण है कि इन दो रत्नों को संयुक्त क्यों जोड़ा जाना चाहिए या नहीं?

+0

हर बार जब आप परीक्षण मॉडल बनाते हैं तो आप डेटा को गतिशील रूप से क्यों उत्पन्न करना चाहते हैं? यह सिर्फ ओवरहेड –

+0

सही है, परीक्षण प्रदर्शन पर असर पड़ेगा - लेकिन यह एक जटिल ऐप पर विशेष रूप से मान्य नहीं हो सकता है, विशेष रूप से एक सत्यापन के भार के साथ, यह जांचने के लिए कि मैंने कुछ बेवकूफ नहीं लिखा है जो 'firstName: Michal 'लेकिन नहीं 'firstName: Huw', निश्चित रूप से फकर की विविधता अधिक मजबूत परीक्षण का कारण बन जाएगी? – Huw

+0

इसे एज केस परीक्षण कहा जाता है। अभी भी यादृच्छिक डेटा –

उत्तर

5

कुछ लोगों को यह खिलाफ बहस चल रहा है, के रूप में here खोज सकता है।

यादृच्छिक विशेषता का उपयोग नहीं करते मूल्यों

एक आम पैटर्न (ठग या जालसाजी की तरह) एक नकली डेटा पुस्तकालय का उपयोग करने के मक्खी पर यादृच्छिक मान उत्पन्न करने के लिए है। यह नाम, ईमेल पते या टेलीफोन नंबरों के लिए आकर्षक लग सकता है, लेकिन यह कोई वास्तविक उद्देश्य नहीं देता है। अद्वितीय मूल्यों बनाना दृश्यों के साथ काफी सरल है:

FactoryGirl.define do 
    sequence(:title) { |n| "Example title #{n}" } 

    factory :post do 
    title 
    end 
end 

FactoryGirl.create(:post).title # => 'Example title 1' 

आपका बेतरतीब डेटा अपने परीक्षण में किसी चरण ट्रिगर अप्रत्याशित परिणाम में, अपने कारखानों के साथ काम करने निराशा बनाने सकता है।

समय के साथ, कि आपने नई विशेषताएं है कि के लिए अपने परीक्षण के कारण कभी कभी असफल की खोज करेंगे: किसी भी मूल्य है कि किसी तरह से अपने परीक्षण के परिणाम को प्रभावित कर सकता अर्थ ओवरराइड करने के लिए है, होगा। यह एक निराशाजनक प्रक्रिया है, क्योंकि परीक्षण प्रत्येक दस या सौ रनों में केवल एक बार विफल हो सकता है - कितने गुण और संभावित मान हैं, और किस संयोजन को बग ट्रिगर करता है। में प्रत्येक ऐसी यादृच्छिक विशेषता को सूचीबद्ध करने के लिए आपको प्रत्येक परीक्षण को ओवरराइड करना होगा, जो मूर्खतापूर्ण है। इसलिए, आप गैर-यादृच्छिक कारखानों को बनाते हैं, जिससे मूल यादृच्छिकता के किसी भी लाभ को अस्वीकार कर दिया जाता है। कोई तर्क दे सकता है, हेनरिक Nyh करता है, कि यादृच्छिक मूल्य आपको कीड़े की खोज में मदद करते हैं। जबकि संभव हो, इसका मतलब है कि आपके पास समस्या है: आपके परीक्षण सूट में छेद। सबसे खराब स्थिति परिदृश्य में बग अभी भी ज्ञात नहीं है; सबसे अच्छे मामले परिदृश्य में आपको एक क्रिप्टिक त्रुटि संदेश मिलता है जो अगली बार परीक्षण चलाता है, को डीबग करना मुश्किल होता है। सच है, कोई त्रुटि से कोई क्रिप्टिक त्रुटि बेहतर नहीं है, लेकिन यादृच्छिक कारखानियां उचित यूनिट परीक्षणों के लिए एक खराब विकल्प हैं, कोड समीक्षा और इन समस्याओं को रोकने के लिए टीडीडी।

यादृच्छिक कारखानों न केवल प्रयास के लायक हैं, आपको अपने परीक्षणों में भी झूठा विश्वास देते हैं, जो कि से भी कम नहीं है।

लेकिन अगर आप चाहें तो ऐसा करने से आपको कुछ भी रोक नहीं है, बस इसे करें।

ओह, और हाल ही में फैक्टरीगर्ल में अनुक्रम को रेखांकित करने का एक आसान तरीका है, यह उद्धरण पुराने संस्करण के लिए लिखा गया था।

+0

धन्यवाद Jrochkind, लिंक की बहुत सराहना करते हैं, दिलचस्प है कि वह उस [हेनरिक Nyh पोस्ट] के एक लिंक सूचीबद्ध करता है (http://thepugautomatic.com/2012/07/randomize-your-factories/), मुझे लगता है कि मैं गहराई से लुभाना चाहता हूं इस दृष्टिकोण और ऊपर एफ़ के योगदान से। लेकिन मुझे लगता है कि अर्जुन वैन डेर गाग एक अच्छा मामला बनाते हैं कि फकर का उपयोग करना "इन समस्याओं को रोकने के लिए उचित इकाई परीक्षण, कोड समीक्षा और टीडीडी के लिए एक गरीब विकल्प है।" दृष्टिकोण के लिए सभी को धन्यवाद। – Huw

+0

किसी बिंदु पर बढ़ती परियोजनाओं में इतनी अधिक संयोजी जटिलता होगी, कि आपके पास हमेशा परीक्षण कवरेज में अंतराल होगा, भले ही यह कागज पर 100% हो। और जैसा कि मैंने अपने जवाब में कहा था, कारखानों का निर्माण करने का प्रयास आमतौर पर कोई अतिरिक्त लागत नहीं है, क्योंकि यदि आप कुछ सभ्य, गैर वैयक्तिकृत डेमो डेटा वाले ग्राहकों को आसानी से सुविधाएं पेश करने में सक्षम होना चाहते हैं तो आप इसे तब भी कर सकते हैं। – aef

1

मुझे फ़कर का उपयोग करना पसंद है और आमतौर पर बड़े कोड बेस के साथ काम करते समय ऐसा करते हैं।

संभावित नुकसान: मैं निम्नलिखित फायदे और नुकसान ठग का उपयोग करते समय फैक्टरी लड़की के साथ देख

  • थोड़ा मुश्किल ठीक उसी परीक्षण परिदृश्य (कम से कम RSpec यादृच्छिक संख्या जनरेटर प्रदर्शित करके इस के आसपास काम करता है पुन: पेश करने

    : हर बार बीज और आप इसके साथ ठीक उसी परीक्षण पुन: पेश करने)
  • उत्पन्न डेटा कचरे प्रदर्शन का एक सा

संभावित लाभ की अनुमति देता है

  • आमतौर पर अधिक मानवीय समझ में प्रदर्शित डेटा बनाता है। टेस्ट-डेटा मैन्युअल रूप से बनाते समय, लोग कठोरता से बचने के लिए सभी प्रकार के शॉर्ट-कट होते हैं।
  • एक ही समय में परीक्षण के लिए फेकर के साथ निर्माण कारखानों आपको प्रस्तुतियों के लिए अच्छा डेमो डेटा उत्पन्न करने के साधन प्रदान करता है।
  • आप बेतरतीब ढंग से बढ़त मामले कीड़े जब परीक्षण एक बहुत
+0

धन्यवाद एफ़, यह एक अच्छा सारांश है- क्या आप ऊपर माइकल के बिंदु से बात कर सकते हैं? क्या आपको लगता है कि यह ज्ञात मूल्यों के परीक्षण के आधार का उल्लंघन करता है? जब भी आप कहते हैं कि यह डेमो के लिए अच्छा परीक्षण डेटा देता है, तो मुझे लगता है कि वहां बीज फ़ाइलों के बारे में आपकी बात है? परीक्षण के लिए कारखानों का उपयोग करने में यह कारक कैसा है? क्या आप अपनी बीजों की फाइल में कारखानों का उपयोग कर रहे हैं? – Huw

+0

परीक्षण लिखते समय मुझे अक्सर क्या अनुभव होता है, यह अक्सर कोई फर्क नहीं पड़ता कि वास्तविक मूल्य क्या है, लेकिन यह भी उतना ही मूल्य है जो किसी कोड के माध्यम से कहीं ट्रैवर्स दिया गया था और या तो ठीक उसी तरह या संशोधित किया गया है एक विशिष्ट तरीका यहां, इससे कोई फर्क नहीं पड़ता कि मान तय या यादृच्छिक है या नहीं। फेकर डेटा आगे का उपयोग प्रदान करता है क्योंकि यह वास्तविक डेटा के करीब होने की कोशिश करता है ताकि परीक्षण डिबगिंग करते समय मनुष्य इसे बेहतर समझ सकें। जब परीक्षण की सामग्री परीक्षण के लिए महत्वपूर्ण होती है, तो आमतौर पर आप इसके लिए फ़कर का उपयोग नहीं करते हैं। – aef

+0

मैं आम तौर पर टेस्ट कोड के साथ बंडल करने के बजाय कारखानों को अपने मुख्य कोड बेस के (शायद वैकल्पिक) भाग के रूप में परिभाषित करता हूं। फिर मैं हर जगह डेमो डेटा बना सकता हूं, इसे बीज फ़ाइल में, या लाइव कंसोल में, या वास्तव में किसी भी अन्य संदर्भ में चाहता हूं। – aef

1

यह आपके ऊपर है।

मेरी राय में परीक्षणों में यादृच्छिक डेटा रखने का एक बहुत अच्छा विचार है और यह हमेशा मुझे बग और कोने के मामलों को खोजने में मदद करता है, जिनके बारे में मैंने नहीं सोचा था।

मुझे यादृच्छिक डेटा होने पर कभी पछतावा नहीं है। सभी बिंदुओं @jrochkind द्वारा वर्णित सही होगा (और आपके पास एक पढ़ने से पहले अन्य जवाब पढ़ना चाहिए) लेकिन यह आप कर सकते हैं कि यह भी सच है (और चाहिए) लिखते हैं कि अपने spec_helper.rb

config.before(:all) { Faker::Config.random = Random.new(config.seed) } 

में यह इतना कर देगा कि आपके पास दोहराने योग्य डेटा के साथ दोहराने योग्य परीक्षण भी हैं। यदि आप ऐसा नहीं करते हैं तो आपके पास अन्य उत्तरों में वर्णित सभी समस्याएं हैं।

+0

मुझे विशेष रूप से यह उत्तर पसंद है, मुझे यह सुनिश्चित करने के लिए पर्याप्त यादृच्छिकता मिलती है कि मैं अपनी शुरुआती उम्मीदों का परीक्षण कर सकता हूं, लेकिन जब मुझे इसकी ज़रूरत होती है तो पुनरावर्तनीयता, धन्यवाद @coorasse :) – Huw

संबंधित मुद्दे