क्या आप सीखना चाहते हैं कि RSpec का उपयोग करके अपने रूबी अनुप्रयोगों के लिए परीक्षण कैसे लिखना है?
फिर आप सही जगह पर हैं !
इस ट्यूटोरियल में मैं आपको दिखाऊंगा कि यह कैसे करना है।
सामग्री
- 1 आपको टेस्ट क्यों लिखने चाहिए?
- 1.0.1 यह त्रुटियों के खिलाफ एक सुरक्षा जाल बनाता है (विशेष रूप से रिफैक्टरिंग के लिए उपयोगी)
- 1.0.2 यह आपके कोड का दस्तावेजीकरण करने में मदद करता है
- 1.0.3 यह आपको फीडबैक लूप देता है
- 1.0.4 यह सुनिश्चित करने में आपकी सहायता करता है कि आपका कोड अपेक्षित परिणाम दे रहा है
- 1.0.5 यह आपको रूबी की नौकरी दिलाने में मदद करता है
- 2 आरएसपीईसी के साथ शुरुआत करना
- 3 आरएसपीईसी परीक्षण उदाहरण
- 4 आरएसपीईसी लेट मेथड
- 5 विषय विधि का उपयोग कैसे करें
- 6 अपने सभी परीक्षणों से पहले कोड कैसे चलाएं
- 7 परीक्षण उपसमूह कैसे बनाएं
- 8 किसी परीक्षण को अस्थायी रूप से अक्षम कैसे करें
- 9 नाम से चल रहे उदाहरण
- 10 आरएसपीईसी अपेक्षाएं और मैचर्स
- 11 RSpec फ़ॉर्मेटर
- 12 धीमे परीक्षण कैसे खोजें
- 13 आरएसपीईसी वीडियो ट्यूटोरियल
- 14 सारांश
- 14.1 संबंधित
आपको टेस्ट क्यों लिखना चाहिए?
ऐसा क्यों है:
यह त्रुटियों के खिलाफ सुरक्षा जाल बनाता है (विशेष रूप से रिफैक्टरिंग के लिए उपयोगी)
अगर आपके पास टेस्ट सूट नहीं है तो आप अपने कोड को छूना नहीं चाहते हैं, क्योंकि कुछ टूटने का डर है…
...परीक्षण कराने से आपका आत्मविश्वास बढ़ता है!
यह आपके कोड का दस्तावेजीकरण करने में मदद करता है
आपके परीक्षण बताते हैं कि आपके आवेदन को क्या करना चाहिए।
यह आपको फीडबैक लूप देता है
जब आप टीडीडी कर रहे होते हैं आपको फीडबैक लूप मिलता है यह आपको बताता है कि आगे क्या ध्यान केंद्रित करना है, यदि आप आसानी से विचलित हो जाते हैं तो उपयोगी है।
यह सुनिश्चित करने में आपकी सहायता करता है कि आपका कोड अपेक्षित परिणाम दे रहा है
यह महत्वपूर्ण है!
यदि आप कुछ जटिल तर्क लिख रहे हैं, तो आप यह सुनिश्चित करना चाहते हैं कि यह कई अलग-अलग इनपुट के साथ काम कर रहा है और न केवल एक उदाहरण के साथ आप आए हैं।
परीक्षण आपको कोने के मामलों को उजागर करने और उनका दस्तावेजीकरण करने में मदद कर सकते हैं।
यह आपको रूबी नौकरी दिलाने में मदद करता है
अधिकांश नौकरी के आवेदन आपके परीक्षण कौशल की सराहना करेंगे, जिससे नौकरी उतरने की संभावना बढ़ जाएगी।
RSpec के साथ शुरुआत करना
यह समझने के लिए कि RSpec कैसे काम करता है, आइए एक उदाहरण चरण-दर-चरण देखें ।
हम एक साधारण एप्लिकेशन लिखने जा रहे हैं जो फैक्टोरियल नंबर ढूंढता है।
पहला कदम :
require 'rspec/autorun' describe Factorial do # ... end
यह आपका पहला RSpec . लिखने के लिए आरंभिक कोड है परीक्षण।
आपको rspec रत्न की आवश्यकता है।
फिर आपको एक describe
create बनाना होगा अपने सभी परीक्षणों को एक साथ समूहित करने . के लिए अवरोधित करें &RSpec को यह बताने के लिए कि आप किस वर्ग का परीक्षण कर रहे हैं।
अगला है it
ब्लॉक करें:
describe Factorial do it "does something" do # ... end end
यह परीक्षण का नाम है, साथ ही सभी घटकों . को एक साथ समूहबद्ध करने का एक तरीका है परीक्षण के ही।
घटक हैं:
- सेटअप
- व्यायाम
- सत्यापित करें
सेटअप वह जगह है जहां आप कोई भी ऑब्जेक्ट बनाते हैं जिसे आपको बनाना है।
यह तैयारी का चरण है।
फिर आप उस विधि को कॉल करते हैं जिसे आप उसका रिटर्न वैल्यू प्राप्त करने के लिए प्रयोग करना चाहते हैं।
अंत में, आप अपेक्षा के साथ परिणाम सत्यापित करें (आरएसपीसी) या अभिकथन (मिनीटेस्ट)।
आरएसपीसी परीक्षण उदाहरण
अब अगर हम एक फैक्टोरियल विधि लिखना चाहते हैं, तो हमें ऑनलाइन या हाथ से गणना करके कुछ मान्य मानों का पता लगाना होगा।
फिर हम अपने परीक्षणों के साथ उनका उपयोग करते हैं।
इसे पसंद करें :
describe Factorial do it "finds the factorial of 5" do calculator = Factorial.new expect(calculator.factorial_of(5)).to eq(120) end end
जब आप इस कोड को चलाते हैं (एक नियमित रूबी प्रोग्राम की तरह) तो आपको यह मिलेगा:
uninitialized constant Factorial (NameError)
यह सामान्य है क्योंकि हमारे पास Factorial
नहीं है अभी तक कक्षा।
आइए एक बनाएं:
class Factorial end
अगली त्रुटि होगी:
undefined method 'factorial_of'
मैं इसे factorial_of
. बनाकर ठीक करता हूं विधि:
class Factorial def factorial_of end end
फिर कोड फिर से चलाएँ:
wrong number of arguments (given 1, expected 0)
एक और त्रुटि! लेकिन क्या आप जानते हैं?
यह अच्छी बात है
त्रुटियाँ निराश होने वाली कोई चीज़ नहीं हैं।
वे फ़ीडबैक हैं।
अब:
factorial_of
. में एक विधि तर्क जोड़ें विधि:
class Factorial def factorial_of(n) end end
अब आपको जो मिलता है वह एक परीक्षण विफलता . है :
expected: 120 got: nil
यह वही है जहां आप इस बिंदु पर होना चाहते हैं!
अगला कार्य विधि को लागू करना है:
class Factorial def factorial_of(n) (1..n).inject(:*) end end
और आप अपनी पहली उत्तीर्ण परीक्षा . प्राप्त करेंगे :
. Finished in 0.00315 seconds (files took 0.09083 seconds to load) 1 example, 0 failures
इसे हम टेस्ट-ड्रिवेन डेवलपमेंट (टीडीडी) कहते हैं।
आप पहले परीक्षण लिखते हैं, फिर परीक्षण आपको मार्गदर्शन करते हैं कि आपको आगे क्या करने की आवश्यकता है।
RSpec Let Method
यदि आप कई परीक्षण लिखना चाहते हैं और एक ही ऑब्जेक्ट का पुन:उपयोग करना चाहते हैं आप इन वस्तुओं को let
. के साथ परिभाषित कर सकते हैं बयान।
यह इस तरह दिखता है:
describe Factorial do let(:calculator) { Factorial.new } it "finds the factorial of 5" do expect(calculator.factorial_of(5)).to eq(120) end end
अब आप calculator
का पुन:उपयोग कर सकते हैं आपके सभी परीक्षणों में एक ही describe
. के अंतर्गत ब्लॉक करें।
एक बात जो आपको let
के बारे में जाननी चाहिए क्या यह "आलसी" है।
इससे मेरा क्या मतलब है?
ऑब्जेक्ट तब तक नहीं बनाया जाएगा जब तक आप पहली बार इसका उपयोग नहीं करते ।
इससे फर्क पड़ सकता है अगर इस ऑब्जेक्ट को बनाने के साइड-इफेक्ट्स हैं, जैसे डेटाबेस एंट्री बनाना, या किसी फाइल को लिखना।
इन दुष्प्रभावों से बचना सबसे अच्छा होगा, लेकिन यदि आप ऐसा नहीं कर सकते हैं तो let!
का उपयोग करें। विधि।
उदाहरण :
let!(:user) { User.create("[email protected]") }
let!
विधि गैर-आलसी है, इसलिए किसी भी परीक्षण के चलने से पहले ऑब्जेक्ट बनाया जाएगा।
विषय विधि का उपयोग कैसे करें
let
. का दूसरा संस्करण subject
है ।
अंतर केवल इतना है कि आपके पास केवल एक subject
हो सकता है , और यह एक उदाहरण . होना चाहिए आप जिस मुख्य वस्तु का परीक्षण कर रहे हैं।
RSpec पहले से ही एक डिफ़ॉल्ट subject
बनाता है इस तरह:
subject { Factorial.new }
इसे "अंतर्निहित विषय" कहा जाता है।
आप इसे इस तरह इस्तेमाल कर सकते हैं:
describe Factorial do it "finds the factorial of 5" do expect(subject.factorial_of(5)).to eq(120) end end
आप अपने विषय को एक नाम दे सकते हैं:
subject(:calculator) { Factorial.new }
यह वैसे ही व्यवहार करता है जैसे let
. का उपयोग करना , लेकिन यह एक-पंक्ति अपेक्षाओं के उपयोग को सक्षम बनाता है:
it { should be_empty }
अपने सभी परीक्षणों से पहले कोड कैसे चलाएं
RSpec में निष्पादन हुक हैं जिनका उपयोग आप प्रत्येक परीक्षण से पहले और बाद में या परीक्षणों के पूरे समूह को चलाने के लिए कर सकते हैं।
उदाहरण के लिए :
describe Shop do before(:all) { Shop.prepare_database } after (:all) { Shop.cleanup_database } end
यदि आप प्रत्येक उदाहरण के लिए इस कोड को चलाना चाहते हैं (उदाहरण =RSpec में परीक्षण) तो आप :each
का उपयोग कर सकते हैं :all
. के बजाय ।
परीक्षण उपसमूह कैसे बनाएं
यदि आप अपने ऐप में विभिन्न परिदृश्यों का परीक्षण कर रहे हैं तो यह संबंधित परीक्षणों को एक साथ समूहीकृत करने में सहायक हो सकता है।
आप इसे संदर्भ ब्लॉक . का उपयोग करके कर सकते हैं आरएसपीईसी में।
यहां एक उदाहरण दिया गया है:
describe Course do context "when user is logged in" do it "displays the course lessons" do end it "displays the course description" do end end context "when user it NOT logged in" do it "redirects to login page" do end it "it shows a message" do end end end
किसी परीक्षण को अस्थायी रूप से अक्षम कैसे करें
डिबगिंग उद्देश्यों के लिए परीक्षण को अक्षम करना संभव है।
आपको बस इतना करना है कि it
को बदलना है करने के लिए xit
उन परीक्षणों के लिए जिन्हें आप अक्षम करना चाहते हैं।
उदाहरण :
xit "eats lots of bacon" do end
x
. को हटाना न भूलें जब आपका काम हो जाए!
नाम से उदाहरण चलाना
परीक्षणों को अक्षम करने के बजाय, आप -e
. के साथ उन परीक्षणों को फ़िल्टर कर सकते हैं जिन्हें आप चलाना चाहते हैं झंडा।
उदाहरण :
> ruby person.rb -e bacon
यह फ़िल्टरिंग परीक्षण के नाम पर आधारित है, इसलिए उपरोक्त उदाहरण किसी भी परीक्षण से मेल खाएगा, जिस पर "बेकन" शब्द होगा।
RSpec अपेक्षाएं और मिलानकर्ता
आपको यह उदाहरण याद होगा जिसका हम उपयोग कर रहे हैं:
expect(calculator.factorial_of(5)).to eq(120)
लेकिन यह क्या है eq(120)
भाग?
खैर, 120 वह मूल्य है जिसकी हम अपेक्षा कर रहे हैं…
...और eq
जिसे हम मैचर कहते हैं।
मैचर्स हैं कि कैसे RSpec आपकी पद्धति के आउटपुट . की तुलना करता है आपके अपेक्षित मूल्य . के साथ ।
eq
. के मामले में , RSpec ==
. का उपयोग करता है ऑपरेटर (रूबी ऑपरेटरों के बारे में और पढ़ें)।
लेकिन अन्य मिलानकर्ता हैं आप उपयोग कर सकते हैं।
उदाहरण के लिए, be_something
मैचर:
expect(nil).to be_nil
जहां something
एक विधेय विधि है (जैसे empty?
) जिसे परीक्षा परिणाम पर बुलाया जाएगा।
अन्य उपयोगी मिलानकर्ता:
- शामिल करें (सरणी और हैश के लिए)
- प्रारंभ_साथ
- end_with
- मिलान (रेगुलर एक्सप्रेशन मिलान के लिए)
- बीच में
- have_key / have_value (हैश के लिए)
- be_instance_of
- response_to
- have_attributes (उदाहरण चर के परीक्षण के लिए)
एक मैचर जिसे विशेष ध्यान देने . की आवश्यकता है raise_error
है मैचर।
इसका कारण यह है कि इसका उपयोग करने के लिए आपको अपनी अपेक्षाओं को एक ब्लॉक में लपेटना होगा।
इसे पसंद करें :
expect{ :x.count }.to raise_error(NoMethodError)
change
मैचर भी इस तरह काम करता है:
expect{ stock.increment }.to change(stock, :value).by(100)
आरएसपीसी फॉर्मेटर्स
डिफ़ॉल्ट RSpec आउटपुट "प्रगति" प्रारूप में है।
इस प्रारूप के साथ आप डॉट्स (.
. देखते हैं ) प्रत्येक 1 उत्तीर्ण परीक्षा का प्रतिनिधित्व करता है, एक F
एक असफल परीक्षण के लिए (अपेक्षित और वास्तविक मेल नहीं खाते), या एक E
किसी त्रुटि के लिए।
लेकिन वैकल्पिक स्वरूपण विकल्प हैं जिनका आप उपयोग कर सकते हैं।
यहाँ एक सूची है:
- प्रगति
- दस्तावेज़ीकरण
- जेसन
- एचटीएमएल
आप उन्हें -f ध्वज के साथ सक्षम कर सकते हैं:
> ruby factorial.rb -f d Person eats lots of healthy food writes many articles Finished in 0.00154 seconds (files took 0.09898 seconds to load) 2 examples, 0 failures
दस्तावेज़ीकरण प्रारूप आउटपुट उत्पन्न करने के लिए आपके परीक्षण विवरण का उपयोग करता है।
धीमे परीक्षण कैसे खोजें
RSpec अपने परीक्षणों को प्रोफ़ाइल . करने के लिए एक बहुत ही आसान विकल्प के साथ आता है ।
बस --profile
. पास करके ध्वज आप देख पाएंगे कि प्रत्येक परीक्षण को चलने में कितना समय लगता है और वास्तव में धीमे वाले को ठीक करता है।
यहां एक उदाहरण दिया गया है :
> ruby factorial.rb --profile Factorial finds the factorial of 5 0.00043 seconds
आरएसपीसी वीडियो ट्यूटोरियल
सारांश
आपने सीखा है कि RSpec परीक्षण ढांचे का उपयोग करके परीक्षण कैसे लिखना है।
अब आपकी अपनी परीक्षा लिखने की बारी है!