मेरे 'आह-हा!' रूबी और रेल में परीक्षण के बारे में क्षण तब आए जब मैं वास्तव में बैठ गया और इस विषय पर निश्चित संसाधनों, 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'
। और बाकी चरण परिणाम का परीक्षण कर रहे हैं, जो फिर से करने के लिए सीधा होना चाहिए। और जब आप काम पूरा कर लेते हैं, तब आपको पता होता है कि आपकी सुविधा पूर्ण और समाप्त हो गई है। यदि आवश्यक व्यवहार बदल जाता है, तो आप अपनी सुविधा को बदल सकते हैं, अन्यथा आप अपने कार्यान्वयन कोड को पूर्ण सुरक्षा में बदल सकते हैं।
मुझे लगता है कि इसका मतलब बनता है। यह सब मेरे सिर के ऊपर से हट गया है, लेकिन मुझे लगता है कि यह बीडीडी और टीडीडी के बीच के अंतर को दर्शाता है, और क्यों ककड़ी और आरएसपीईसी अलग-अलग जरूरतों को पूरा करते हैं।