क्या RSpec और ककड़ी वास्तव में इसके लायक हैं?


12

मुझे पता है कि अधिकांश RoR प्रोग्रामर नशेड़ी का परीक्षण कर रहे हैं और मैं एक बड़े परीक्षण सूट के फायदों को समझता हूं लेकिन जब मैं परीक्षण शुरू करता हूं, तो मुझे कभी भी इतना बड़ा सूट नहीं मिलता है और मुझे हमेशा आश्चर्य होता है "क्या मैं सही तरीके से परीक्षण कर रहा हूं? क्या वास्तव में कुशल हैं?" मैं अक्सर एकीकरण परीक्षण के परीक्षण का तरीका केवल आवेदन के व्यवहार से करता हूं।

पहले, परीक्षण वास्तव में इसके लायक है? मेरा मतलब है, क्या वास्तव में परीक्षण लिखने पर खर्च किया गया समय इसके लायक है?

फिर, मैं RSpec का उपयोग करता हूं, मैंने हाल ही में ककड़ी की खोज की है, इसे थोड़ी देर के लिए इस्तेमाल किया है लेकिन मुझे नहीं पता कि क्या इन सभी चरणों को लिखना वास्तव में परेशानी के लायक है? मुझे पता है कि मैं चरणों का पुन: उपयोग कर सकता हूं लेकिन मुझे कभी नहीं पता है कि ये चरण बहुत पूर्ण हैं या नहीं: उदाहरण के लिए, मैं उपयोग कर रहा हूं, Given I am logged in as (.+)लेकिन मुझे नहीं पता कि क्या मुझे इसकी परिभाषा में कहना होगा Given there's a user called $1क्योंकि यह उपयोगकर्ता को कभी भी बना सकता है लेकिन यह हमेशा एक कदम से पहले होने लायक नहीं है Given I am logged in as (.+)। यह काफी कोड है जो शायद ही कभी उपयोगी होगा। मुझे लगता है कि हर दिन परीक्षण किए गए भागों पर नए कीड़े नहीं हैं ... तो क्या आरस्पेक की तुलना में ककड़ी वास्तव में सार्थक है?

जवाबों:


13

मेरे 'आह-हा!' रूबी और रेल में परीक्षण के बारे में क्षण तब आए जब मैं वास्तव में बैठ गया और इस विषय पर निश्चित संसाधनों, Rspec और ककड़ी पुस्तकों को पढ़ा । मैंने आपकी ककड़ी के शुरुआती तिरस्कार को साझा किया, लेकिन तब मुझे महसूस हुआ कि मैं तस्वीर को काफी गलत कोण से देख रहा था।

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

Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.

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

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

पहला रन - मेरी पहली चरण परिभाषा अपरिभाषित है। यह कहकर परिभाषित करने के लिए ब्लॉक को कॉपी करें user_steps.rb या यहां तक ​​कि session_steps.rb क्योंकि यह उपयोगकर्ताओं और उनके सत्रों से संबंधित है। अब, आप कैसे परिभाषित करते हैं कि कोई उपयोगकर्ता लॉग इन है? आप उन्हें लॉगिन प्रक्रिया के माध्यम से ले जा सकते हैं।

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

सभी खुश रहें। दूसरा कदम।

Given /^I can see the post "(.+)"$/ do |name|
  visit post_path(Post.find_by_name(name))
end

फिर से बहुत आसान है। ध्यान दें कि यदि हम अपनी लॉगिन प्रक्रिया को पूरी तरह से फिर से तैयार करते हैं, या हमारे पोस्ट कैसे परिभाषित और दिखाए जाते हैं, तो हमें व्यवहार को बदलना नहीं है। तीसरा चरण।

When /^I vote the post up$/ do
  pending 
end 

यहां आप नई कार्यक्षमता के बारे में बात करना शुरू कर रहे हैं, लेकिन आप यह नहीं जानते कि यह कैसे काम करने वाला है। आप पोस्ट को कैसे वोट करते हैं? आप +1 या कुछ की एक छवि पर क्लिक कर सकते हैं, जो नियंत्रक के लिए एक अजाक्स पोस्ट करता है, जो JSON या कुछ ऐसे देता है। तो अब आप शुद्ध Rspec परीक्षण में जा सकते हैं।

  • यह सुनिश्चित करने के लिए अपने दृश्य का परीक्षण करें कि +1 चित्र प्रदर्शित है,
  • अपने नियंत्रक का परीक्षण करें कि यह सही प्रारूप के दिए गए अजाक्स अनुरोध को प्राप्त करने पर सही ढंग से व्यवहार करता है (दोनों खुश और दुखी पथ - क्या होगा यदि एक अवैध पोस्ट आईडी प्राप्त हो? क्या होगा यदि उपयोगकर्ता ने एक दिन में अपने 25 अपवोट का उपयोग किया है? क्या यह वोटों की संख्या को सही तरीके से बढ़ाता है?)
  • अपनी जावास्क्रिप्ट का परीक्षण करें कि यह सही फॉर्मेट में JSON के ब्लॉब दिए जाने पर सही ढंग से प्रतिक्रिया करता है (क्या यह उपयोग की गई दिखाने के लिए +1 छवि को अपडेट करता है? (यहां Google+ के बारे में सोच रहा है ...) क्या यह आपको धन्यवाद संदेश दिखाता है? आदि। )

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

मुझे लगता है कि इसका मतलब बनता है। यह सब मेरे सिर के ऊपर से हट गया है, लेकिन मुझे लगता है कि यह बीडीडी और टीडीडी के बीच के अंतर को दर्शाता है, और क्यों ककड़ी और आरएसपीईसी अलग-अलग जरूरतों को पूरा करते हैं।


यह वास्तव में मेरे लिए मददगार था। लेकिन मुझे एक और प्रश्न मिला है: मैंने नियंत्रकों और विचारों दोनों का परीक्षण करने के लिए RSpec का उपयोग करके एक परियोजना शुरू की है, कोड लगभग 90% परीक्षणों से ढका है। क्या आपको लगता है कि मुझे वास्तव में खीरे की जरूरत है और अब कदम और परिदृश्य लिखने में समय बिताना चाहिए? मेरा मतलब है, मैं वैसे भी RSpec के साथ वह सब कर सकता हूं।
Cydonia7

@ स्काईड्रेमर: शायद आवश्यक नहीं है, लेकिन यह अच्छा अभ्यास हो सकता है। जब तक आप परीक्षण कर रहे हैं, आप सही रास्ते पर हैं :)
sevenseacat

10

परीक्षण, मेरी राय में, एक कला है। टीडीडी (RSpec या किसी अन्य ढांचे का उपयोग करके) शुरू में ऐसा लगता है जैसे आप "अपना समय बर्बाद कर रहे हैं।" यह समझ में आता है क्योंकि आप कोई उत्पादन कोड नहीं लिख रहे हैं।

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

इसके अलावा, परीक्षण करना कोड समीक्षाओं के लिए फायदेमंद हो सकता है क्योंकि आपका समीक्षक यह देख सकता है कि आप किन परिक्षणों का परीक्षण कर रहे हैं और आपके कोड का उपयोग कैसे किया जाना है।

एक बार जब आप टीडीडी के झूले में जाते हैं, तो कुछ भी करना गलत लगता है।


2
+1 यद्यपि अनुभव से बोलते हुए, "टीडीडी के झूले में घुसना" अपने आप में और डेवलपर्स के बहुमत के लिए बहुत कठिन प्रयास है।
वेन मोलिना

@Wayne M: सहमत हुए। टीडीडी-नाली में प्रवेश करना कठिन है, लेकिन लाभ बहुत बड़ा है। :)
डेविड वेइजर

यह मुश्किल से इसे हल्का सा लगा रहा है .. सालों से कोशिश कर रहा था कि मेरा सिर इसके चारों ओर हो जाए :)
वेन मोलिना

अरे हाँ, यह अच्छी तरह से प्रयास के लायक है।
सेवंसेकत

2

मेरा लेना है कि आप ककड़ी के मोर्चे पर सही हैं। उन सभी चरणों को लिखना बहुत परेशानी है, और लाभ दर्द को सही नहीं ठहराते हैं। मैंने यहाँ खीरे के उपयोग के छह नुकसानों के बारे में विस्तार से लिखा है: क्यों खीरे के साथ खीरे का परीक्षण?

यूनिट परीक्षण और नियमित एकीकरण परीक्षण, Rspec या टेस्ट :: यूनिट के साथ किया जाता है, बहुत समझ में आता है, लेकिन सौभाग्य से ये ककड़ी परीक्षणों की तुलना में लिखने के लिए बहुत तेज़ हैं। एक के लिए आप घेरकिन की वर्डी और अजीब सिंटैक्स से लड़ने के बजाय शुद्ध रूबी का उपयोग कर सकते हैं।


2
मैं काफी सुरक्षित रूप से कह सकता हूं कि मैं ककड़ी परीक्षण के बारे में आपके हर एक बिंदु से असहमत हूं। * यह अच्छे पाठ संपादकों को नहीं तोड़ता है (मेरा गेडिट उजागर होगा और इसे ठीक-ठीक स्वतः पूर्ण करेगा), * आपको अपने मौजूदा Rspec सेटअप से अपने ककड़ी सेटअप के लिए किसी भी परीक्षण सेटअप की नकल नहीं करनी चाहिए (परीक्षण के दो सेट बहुत अलग-अलग स्तरों पर चलते हैं दानेदारता), * यदि आप अपने पृष्ठों के नामकरण के बारे में सुसंगत नहीं हो सकते हैं जो ककड़ी की गलती नहीं है (रेल आपको अलग-अलग दिनों में अलग-अलग चीजों को कॉल करने की अनुमति नहीं देगा, तो क्यों ककड़ी होनी चाहिए?) (जारी रखने के लिए)
sevenseaat

1
* आप कहते हैं कि चरण फ़ाइलों के बारे में क्या सम्मेलन है, लेकिन फिर आप कहेंगे कि सम्मेलन का पालन करने के लिए कहाँ देखना है? Post_steps.rb के अलावा किसी पोस्ट का प्रचार करना किसी अन्य चीज़ में क्यों होगा? * आपकी विशेषताओं को कोड नहीं माना जाता है, इसलिए शब्दहीनता अप्रासंगिक है - आपकी विशेषताएं इस बात का दस्तावेजीकरण करती हैं कि आपका ऐप कैसे व्यवहार करता है; * और अंत में, मैं केवल 'कोड को हतोत्साहित' कर सकता हूँ क्योंकि आप इसे गलत कर रहे हैं
सेवंससैकट

2

मैं व्यक्तिगत रूप से ऐसा मानता हूं RSpec testing is a definite must। उदाहरण के लिए मान लें कि आप एक नई सुविधा लिखना चाहते हैं, और जिसमें किसी अन्य सुविधा का संदर्भ भी है, और उस सुविधा को कुछ अन्य मॉड्यूल या विधियों के साथ संदर्भित किया जा सकता है। तो आप यह कैसे सुनिश्चित कर सकते हैं कि आप जो लिख रहे हैं वह आवेदन के किसी अन्य हिस्से को नहीं तोड़ रहा है?

मान लें कि आपके पास एक बड़ा एप्लिकेशन है और आपने समग्र एप्लिकेशन की तुलना में कुछ तुच्छ कोड किए हैं, तो क्या आप यह सुनिश्चित करने के लिए एप्लिकेशन में प्रत्येक लिंक पर क्लिक करके पूरे एप्लिकेशन को फिर से बनाएंगे कि क्या यह काम करता है जब आप कोड की एक पंक्ति को बदलते हैं?

हालांकि, मेरा मानना ​​है कि ककड़ी परीक्षण एक जरूरी नहीं है। मुझे लगता है कि RSpec का उपयोग करके एकीकरण परीक्षण स्वयं तब तक अधिक समझ में आता है जब तक कि आपको अपने ग्राहक द्वारा परीक्षण प्राप्त नहीं करना पड़ता है। जो मेरे अनुभव में दुर्लभ है। यदि आपकी टीम में पूरी तरह से डेवलपर्स हैं, तो मुझे लगता है कि आपको RSpec सुविधा परीक्षण के लिए ककड़ी चरणों को प्रतिस्थापित करना चाहिए। और मुझे लगता है कि RSpec 3 DSL के बाद, परीक्षण बहुत पठनीय हैं।

Ex:

ककड़ी कदम परिभाषा:

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

RSpec सुविधा परीक्षण:

feature 'Given the user is logged in' do
      visit login_path
      fill_in :name, :with => 'Joe'
      fill_in :password, :with => 'Password'
      click_link_or_button 'submit'
end

मुझे लगता है कि Cucumber विशेषताएँ होने के बजाय, RSpec विशेषताएँ एक और कदम परिभाषा लिखने के अतिरिक्त सिरदर्द के बिना एक ही काम करती हैं।

इसके अलावा यह विशुद्ध रूप से आपकी अपनी पसंद है।

आशा है कि यह आपको थोड़ा समझने में मदद कर सकता है।


0

मेरी राय में पहली बात यह है कि प्रथाओं और ठोस रूपरेखाओं के बीच अंतर करना। ककड़ी इसकी नहीं BDD, RSpec इसकी नहीं TDD है।

यदि आप अपने सिस्टम RSpec को एक अच्छे उपकरण का परीक्षण करना चाहते हैं, तो आप RSDec के साथ TDD या BDD कर सकते हैं, वास्तव में TDD और BDD एक ही बात हैं। कोई कहता है "BDD ने अपने TDD को सही किया है" और मैं इस बात से पूरी तरह सहमत हूं, BDD मुख्य रूप से परीक्षण विधियों / कक्षाओं के बजाय परीक्षण सुविधाओं / व्यवहारों के बारे में है। वास्तव में TDD कि केंट बेक इसकी विशेषताओं के बारे में बताता है, लेकिन BDD इस महत्वपूर्ण अंतर को समझने में बहुत से लोगों की मदद करता है और डैन नॉर्थ से विकास समुदाय के लिए एक महान योगदान है।

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

संक्षेप में:

  • यदि आप स्वयं या आप टीम TDD / BDD करना चाहते हैं -> RSpec का प्रयास करें
  • यदि आप उपयोगकर्ता इतिहास और परिदृश्य के साथ व्यापार के साथ संवाद करने का एक बेहतर तरीका चाहते हैं -> खीरे का प्रयास करें
  • यदि आप अपने सिस्टम फीचर्स का लाइव डॉक्यूमेंटेशन चाहते हैं -> खीरा ट्राई करें।

बेशक, पिछले दो की हाइट लागत जुड़ी हुई है, आपको मूल्यांकन करने की आवश्यकता है कि क्या आपको वास्तव में इसकी आवश्यकता है और प्रयास के लायक है, यह ऑफ कोर्स पूरी तरह से आपकी परियोजना और आपके पर्यावरण और आपके ऊपर निर्णय पर निर्भर करता है।

लेकिन हमेशा याद रखें कि RSpec और ककड़ी केवल उपकरण हैं, और उपकरण ठोस समस्याओं को हल करते हैं, आप किस समस्या को हल करना चाहते हैं?, अपने आप से यह सवाल पूछें और आप सही उपकरण का चयन करने के लिए बेहतर स्थिति में हैं। एक्स या वाई फ्रेमवर्क / टूल / लाइब्रेरी / टेक्नोलॉजी का उपयोग न करने के बारे में निर्णय लेने के बारे में इसके बेहतर प्रोग्रामर बनें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.