आज की पोस्ट में, हम रेल्स 6 में सिस्टम टेस्ट को देखेंगे। सिस्टम टेस्ट आपके एप्लिकेशन के साथ उपयोगकर्ताओं के इंटरैक्शन के तरीके को ऑटो-टेस्ट करने के लिए होते हैं, जिसमें आपके यूजर इंटरफेस का जावास्क्रिप्ट भी शामिल है। मिनिटेस्ट, रेल्स में डिफ़ॉल्ट टेस्टिंग फ्रेमवर्क होने के नाते, सिस्टम टेस्टिंग के लिए एक बेहतरीन मैच है। रेल्स द्वारा हमारे लिए संभाली जाने वाली सभी कॉन्फ़िगरेशन के साथ, हमारे पहले टेस्ट को चालू करने से पहले बस कुछ ही चरणों की आवश्यकता होती है।
सिस्टम टेस्ट का परिचय
रेल्स शब्दावली में, सिस्टम टेस्टिंग का अर्थ है "एक एप्लिकेशन का संपूर्ण सिस्टम के रूप में टेस्ट करना"। यह टेस्ट में ब्राउज़र का उपयोग करके किया जाता है। अलग-अलग हिस्सों का टेस्ट करने के बजाय, सिस्टम टेस्ट के साथ, हम एक संपूर्ण 'वर्कफ्लो' का टेस्ट कर सकते हैं, ठीक वैसे ही जैसे एक उपयोगकर्ता हमारे ऐप के साथ इंटरैक्ट करते समय करता है, जिसमें जावास्क्रिप्ट भाग भी शामिल हैं। व्यवहार में, इसका मतलब है कि हम एक सिस्टम टेस्ट को यह चेक नहीं करना चाहते कि क्या जब कोई यूजर बटन पर क्लिक करता है तो डेटाबेस में एक रिकॉर्ड बनता है; हम केवल यह टेस्ट करते हैं कि वह नया रिकॉर्ड उनकी स्क्रीन पर दिखाई देता है या नहीं। इस तरह के उपयोगकर्ता इंटरैक्शन टेस्ट को फीचर टेस्ट या एक्सेप्टेंस टेस्ट भी कहा जाता है। वे इंटीग्रेशन टेस्ट से अलग हैं: इंटीग्रेशन टेस्ट ऐप के सभी हिस्सों के एक साथ व्यवहार का टेस्ट करने के लिए होते हैं, लेकिन यूजर इंटरफेस के माध्यम से नहीं।
कॉन्फ़िगरेशन
कॉन्फ़िगरेशन इतनी सरल है कि यह लगभग भ्रमित करने वाली है।
कैपिबारा जेम का उपयोग ब्राउज़र के साथ इंटरैक्ट करने के लिए किया जाता है। यह कैपिबारा के माध्यम से है कि हम टेस्ट को पेज पर जाने, फॉर्म भरने, लिंक और बटन पर क्लिक करने के लिए कह सकते हैं। यदि आपने पहले कैपिबारा के साथ काम किया है, तो आप डेटाबेस क्लीनिंग रणनीति और ब्राउज़र कॉन्फ़िगरेशन के साथ इसे काम करने के लिए आपको जिन सभी चीजों को समन्वयित करना पड़ता है, उनसे अवगत हैं। रेल्स सिस्टम टेस्ट सेटअप के लिए जय हो: यह कैपिबारा के साथ काम करने के लिए आवश्यक सभी कॉन्फ़िगरेशन का आउट-ऑफ-द-बॉक्स ख्याल रखता है। इसलिए हम वास्तविक टेस्ट लेखन पर ध्यान केंद्रित कर सकते हैं। यह डिफ़ॉल्ट रूप से सेलेनियम ड्राइवर का उपयोग करता है।
डॉक्स से: "डिफ़ॉल्ट रूप से, ActionDispatch::SystemTestCase सेलेनियम ड्राइवर द्वारा संचालित होता है, क्रोम ब्राउज़र के साथ, और 1400x1400 का ब्राउज़र आकार।" सेलेनियम ड्राइवर कैपिबारा के डिफ़ॉल्ट से अलग है और इसे चुना गया है क्योंकि यह जावास्क्रिप्ट के साथ काम करता है।
सभी सेटिंग्स application_system_test_case.rb के माध्यम से उपलब्ध हैं। आपको केवल प्रत्येक टेस्ट फ़ाइल में इसकी आवश्यकता है।
# application_system_test_case.rb (डिफ़ॉल्ट)
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
end
यदि आपने रेल्स 6 के साथ एक नया ऐप जनरेट किया है, तो यह वास्तव में वह सब है जो आपको चाहिए। अर्थात: आप इंटरनेट पर यूजर इंटरफेस टेस्ट या RSpec के फीचर टेस्ट के लिए सेलेनियम ड्राइवर सेटअप करने के बारे में सभी सलाह को छोड़ सकते हैं।
मौजूदा ऐप्स में, स्कैफोल्ड जनरेट करने से स्वचालित रूप से application_system_test_case.rb और सिस्टम टेस्ट के लिए आवश्यक सब कुछ जनरेट हो जाएगा।
जब एलीन उचिटेल ने सिस्टम टेस्ट पेश किए, तो क्रोम को फ़ायरफ़ॉक्स पर चुना गया क्योंकि उस समय FF सेलेनियम के साथ अच्छा नहीं खेलता था। यह फ़ायरफ़ॉक्स के बाद के संस्करणों में ठीक हो गया है। इसलिए मैं क्रोम को FF से बदल देता हूँ, जैसे:
# application_system_test_case.rb (ड्राइवर को फ़ायरफ़ॉक्स में बदलें)
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :firefox, screen_size: [1400, 1400]
end
(प्रारंभ में, ड्राइवर बदलने के बाद मैंने $ rails db:test:prepare चलाया ताकि एक साफ शुरुआत सुनिश्चित हो सके, लेकिन नया टेस्ट रनर इसका भी ख्याल रखता है: टेस्ट चलाने से :prepare ऑटोरन हो जाएगा।)
रेल्स 6 में नया
सिस्टम टेस्ट की 5.1 में शुरुआत के बाद से, chromedriver-helper जेम को डिप्रिकेट कर दिया गया है। नए रेल्स 6 ऐप्स में, इसे webdrivers जेम से बदल दिया गया है। रेल्स 5 ऐप्स में, यदि आपने अभी तक नहीं किया है तो आपको chromedriver-helper को webdrivers जेम से बदल देना चाहिए। webdrivers जेम के साथ, आपको selenium-webdriver जेम की भी आवश्यकता नहीं है; webdrivers इसका भी ख्याल रखता है। मजेदार तथ्य: रेल्स 6 हमें selenium-webdriver जेम और webdrivers जेम दोनों देता है।
सैनिटी चेक: अब आपको क्या चाहिए नहीं
कैपिबारा सेटअप करना एक दर्द हुआ करता था। यह स्पष्ट नहीं था कि इसे स्क्रैच से सेट करने के लिए आपको क्या चाहिए, जिसमें सही डेटाबेस क्लीनिंग रणनीति ढूंढना, capybara-webkit जेम की निर्भरताएं और सभी प्रकार की अप्रत्याशित आवश्यकताएं शामिल थीं जिन्हें आपको टेस्ट लिखना शुरू करने से पहले समझना पड़ता था। अब जब रेल्स हमें वह सब कुछ प्रदान करता है जिसकी हमें आवश्यकता है, तो मुझे गाइड और डॉक्यूमेंटेशन में उपलब्ध सभी जानकारी जो अब अप्रचलित है, केवल भ्रमित करने वाला हिस्सा लगा। यहां कुछ चीजें हैं जिन्हें हम अब नज़रअंदाज कर सकते हैं।
सबसे पहले, प्री-कुक्ड रेल्स सेटअप का अर्थ है कि हम उन जेम्स को छोड़ सकते हैं जो अक्सर टेस्टिंग के संबंध में उल्लिखित होते हैं, जैसे minitest-rails-capybara, या मिनिटेस्ट के लिए एक्स्ट्रा: जैसे रंगीन आउटपुट, फास्ट फेलिंग टेस्ट और एक लाइन/टेस्ट चलाना। ये मिनिटेस्ट फीचर रेल्स 5.0 में पेश किए गए टेस्ट रनर में हैं।
database_cleaner जेम की अब आवश्यकता नहीं है; रेल्स हमारे लिए क्लीनअप करता है ('ट्रांजैक्शनल टेस्ट')।
चूंकि रेल्स कैपिबारा डिफ़ॉल्ट के बजाय सेलेनियम का उपयोग करता है, हमें capybara-webkit की आवश्यकता नहीं है और हमें जावास्क्रिप्ट एलिमेंट्स के टेस्ट को शामिल करने के लिए कोई एक्स्ट्रा करने की आवश्यकता नहीं है।
आपको कैपिबारा के save_and_open_screenshot का उपयोग करने की भी आवश्यकता नहीं है, क्योंकि रेल्स एक take_screenshot मेथड प्रदान करता है। यह /tmp में एक स्क्रीनशॉट सेव करता है और टेस्ट आउटपुट में आसान एक्सेस के लिए एक लिंक प्रदान करता है।
असली ब्राउज़र और हेडलेस ब्राउज़र के बीच चयन
मैं सिस्टम टेस्ट को ब्राउज़र में चलते हुए देखने और यह देखने का आनंद नहीं ले सकता कि सभी लिंक कैसे क्लिक किए जाते हैं, फॉर्म कैसे भरे जाते हैं, आदि। लेकिन, यह धीमा है। टेस्ट रन को तेज करने के लिए, आप एक 'हेडलेस' ब्राउज़र का उपयोग कर सकते हैं: यह एक ब्राउज़र है जिसकी आपके ऐप तक वही पहुंच है जो एक नियमित ब्राउज़र की होती है, लेकिन बिना ग्राफिकल यूजर इंटरफेस के। अर्थात: यह उसी तरह काम करता है लेकिन आप वास्तव में टेस्ट को अपना काम करते हुए नहीं देखते क्योंकि हेडलेस ड्राइवर वास्तविक ब्राउज़र विंडो नहीं खोलता।
यदि आप हेडलेस जाना चाहते हैं, तो headless_chrome और headless_firefox हैं। उनका उपयोग करने के लिए, एक छोटा सा परिवर्तन आवश्यक है:
# हेडलेस_* में ड्राइवर बदलने के लिए
# application_system_test_case.rb (ड्राइवर को headless_* में बदलें:)
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :headless_firefox
end
नोट: रेल्स डॉक्यूमेंटेशन और कई लेखों में, पोल्टरजिस्ट को ड्राइवर के विकल्प के रूप में नामित किया गया था। यह Capybara के लिए हेडलेस PhantomJS ड्राइवर के रूप में लोकप्रिय था। PhantomJS को छोड़ दिया गया है। इसलिए, इसके विवरण में जाने की कोई आवश्यकता नहीं है—मैं इसे यहां उल्लेख करता हूं क्योंकि पोल्टरजिस्ट और PhantomJS अभी भी रेल्स डॉक्स में उल्लिखित हैं।
आप अधिक कस्टमाइज़ेशन कर सकते हैं, लेकिन शुरू करने के लिए, यह वास्तव में वह सब है जो आपको चाहिए।
टेस्ट चलाना
$ rails test सिस्टम टेस्ट को छोड़कर सभी टेस्ट चलाएगा। आपको स्पष्ट रूप से $ rails test:system चलाने की आवश्यकता है। (मजेदार तथ्य: $ rails कमांड हमेशा bin/rails के माध्यम से चलेगा। अब $ bin/rails टाइप करने की आवश्यकता नहीं है।)
- सभी सिस्टम टेस्ट चलाएं:
$ rails test:system - किसी विशिष्ट फ़ाइल में टेस्ट चलाएं (यहां: users_test.rb)
$ rails test/system/users_test - ... या एक विशिष्ट टेस्ट:
$ rails test test/system/users_test.rb:21 - सभी टेस्ट चलाने के लिए: पहले सिस्टम टेस्ट चलाएं:
$ rails test:system test
नोट: विकल्प फ्लैग test:system के साथ काम नहीं करते; यदि आप -f (फेल फास्ट के लिए) या -v (वर्बोज़ के लिए) जैसे फ्लैग का उपयोग करना चाहते हैं, तो $ rails test test/system -v -f का उपयोग करें
क्या टेस्ट करें (और क्या नहीं)
सिस्टम टेस्ट यूनिट टेस्ट के पूरक हैं, विकल्प नहीं। एक हैप्पी पथ का टेस्ट करना पर्याप्त है, साथ ही शायद एक पथ जिसमें एक त्रुटि संदेश या रीडायरेक्ट हो। सिस्टम टेस्ट का उद्देश्य ब्राउज़र में सभी एज केस का टेस्ट करना नहीं है; बस मुख्य फीचर्स को कवर करें।
अपने टेस्ट विषय को चुनते समय, मैं एक ऐसी एंटिटी ढूंढने की कोशिश करता हूं जो यह दर्शाती हो कि यूजर ऐप का उपयोग कैसे करता है। अपने टेस्ट के नामकरण के लिए, मैंने GitLab के ROLE_ACTION_test.rb नामकरण कन्वेंशन को अपनाया, जो इस दृष्टिकोण को अच्छी तरह से फिट करता है। उदाहरण के लिए: user_shares_card_test.rb।
सामान्य टिप्स और ट्रिक्स
- यदि आप ऑथेंटिकेशन के लिए Devise का उपयोग करते हैं, तो आप टेस्ट यूजर्स को लॉग इन और लॉग आउट करने के लिए Devise इंटीग्रेशन हेल्पर्स का उपयोग कर सकते हैं। एक टेस्ट क्लास में
include Devise::Test::IntegrationHelpersजोड़ें, या इसेtest_helper.rbफ़ाइल में जोड़ें ताकि यह सभी टेस्ट में उपलब्ध हो। अब आप एक यूजर बना सकते हैं औरsign_in(@user)कर सकते हैं। यदि आप इसेsetupमेथड में डालते हैं, तो आपको टीर्डाउन में यूजर को लॉग आउट करने की आवश्यकता नहीं है। रेल्स सेटअप मेथड में मौजूद चीजों को साफ करने का ख्याल रखता है। - फॉर्म के साथ काम करते समय, रेल्स द्वारा मॉडल नाम + फील्ड नाम से स्वचालित रूप से बनाए गए आईडी और बटन प्रकार को
click_onके लिए संदर्भित करना आकर्षक होता है। (fill_in "user_email",click_on :commit)। लेकिन चूंकि सिस्टम टेस्ट इस बारे में हैं कि यूजर वास्तव में अपनी स्क्रीन पर क्या देखता है, विजिबल एलिमेंट्स, यानी टेक्स्ट का उपयोग करना समझ में आता है। एक उचित विकल्प i18n लोकेल फ़ाइलों में रेफरेंस कुंजी रखना और उन कुंजियों का उपयोग बदलते शाब्दिक टेक्स्ट के बजाय करना होगा। (fill_in :user_email)। कैपिबारा I18n सिंटैक्स के साथ ही टेक्स्ट ढूंढता है:assert_selector "h1", text: I18n.t("activerecord.models.things")। - पाथ हेल्पर्स डिफ़ॉल्ट रूप से शामिल हैं। कुछ लाइब्रेरी के लिए आपको टेस्ट क्लास में हेल्पर्स शामिल करने की आवश्यकता होती है, उदाहरण के लिए
include ActionMailer::TestHelper,assert_emailsमेथड का उपयोग करने के लिए। - विभिन्न स्क्रीन आकारों पर टेस्ट चलाने के लिए कस्टम क्लास बनाएं। गाइड देखें।
- स्क्रीनशॉट सुविधा का उपयोग आपके डॉक्यूमेंटेशन और प्रचार सामग्री के लिए स्क्रीनशॉट लेने के लिए भी किया जा सकता है। यदि आप इसे स्क्रीनकास्ट बनाते हैं और प्लेबैक गति को धीमा करते हैं, तो आपके पास मिनटों में एक उत्पाद वीडियो होगा!
- रेल्स सिस्टम टेस्ट के लिए एक जनरेटर प्रदान करता है।
- रेल्स में मिनिटेस्ट मिनिटेस्ट से थोड़ा अलग है, और रेल्स-विशिष्ट मेथड और असर्शन भी जोड़ता है। मिनिटेस्ट डॉक्स से पहले रेल्स डॉक्स देखें।
मुझे सिस्टम टेस्ट के साथ अच्छा मज़ा आया, और अधिकांश भाग के लिए, यह इस वजह से था कि आउट-ऑफ-द-बॉक्स इसका उपयोग करना कितना आसान था।
निष्कर्ष
इस पोस्ट में, हमने देखा कि रेल्स आउट-ऑफ-द-बॉक्स क्या कॉन्फ़िगरेशन देता है और हम न्यूनतम कस्टमाइज़ेशन क्या जोड़ना चाह सकते हैं। मिनिटेस्ट सिस्टम टेस्ट लिखने के लिए बहुत अच्छा है। कुछ टिप्स और ट्रिक्स आपके पहले सिस्टम टेस्ट को चालू करने और चलाने में मदद करेंगे। ब्राउज़र में उनका जादू करते हुए देखें!