परीक्षण सबसे अच्छी तरह से काम कर रहे रेल अनुप्रयोगों का एक अभिन्न अंग हैं जहां रखरखाव एक दुःस्वप्न नहीं है और नई सुविधाओं को लगातार जोड़ा जाता है, या मौजूदा में सुधार किया जाता है। दुर्भाग्य से, कई अनुप्रयोगों के लिए, एक उत्पादन वातावरण वह होता है जहां उन्हें पहली बार भारी कार्यभार या महत्वपूर्ण यातायात के तहत रखा जाता है। यह समझ में आता है क्योंकि ऐसे परीक्षण महंगे होते हैं।
शुक्र है, रेल के पास न केवल यूनिट, एंड-टू-एंड और एकीकरण परीक्षणों के लिए बल्कि प्रदर्शन और लोडिंग से संबंधित परीक्षणों के लिए भी अच्छा समर्थन है। मैं लेख में उन सभी को शामिल करूंगा और कुछ व्यावहारिक उदाहरण दिखाऊंगा जो आपको यह समझने में मदद करेंगे कि आपके एप्लिकेशन के प्रदर्शन स्तर का परीक्षण करने वाले टूल का कुशलतापूर्वक उपयोग कैसे करें।
लेख को दो भागों में बांटा गया है:
-
सैद्धांतिक — मैं आपको दिखाऊंगा कि परीक्षण क्यों आवश्यक है, हम किस प्रकार के परीक्षण कर सकते हैं और किसी एप्लिकेशन पर परीक्षण करते समय आवश्यक मीट्रिक्स
-
व्यावहारिक — हम अपने हाथों को गंदा करेंगे और आउटपुट प्राप्त करने के लिए वास्तविक एप्लिकेशन के लिए परीक्षण लिखेंगे
दो खंडों को पढ़ने के बाद, आपको विभिन्न प्रकार के परीक्षणों की गहरी समझ होगी और उन्हें अपने रेल एप्लिकेशन पर कैसे निष्पादित किया जाए। दिलचस्प लगता है? तो चलिए परीक्षणों के बारे में एक चुटकी सिद्धांत के साथ शुरू करते हैं।
सिद्धांत में परीक्षण
परीक्षण हमेशा किसी भी प्रकार के अनुप्रयोग के विकास का एक अंतर्निहित हिस्सा होना चाहिए। यदि आप अभी भी इसके बारे में आश्वस्त नहीं हैं या आपने अभी तक कोई परीक्षण नहीं लिखा है, तो यहां परीक्षण के लिए कुछ तर्क दिए गए हैं जो आपकी सहायता करेंगे:
- बिना किसी चीज को तोड़ने की चिंता किए बदलाव लाएं - यही प्रमुख कारण है कि परीक्षण आवश्यक हैं। एक विशाल ऐप पर काम करने की कल्पना करें जहां आपको यह सुनिश्चित करने के लिए पूरे ऐप पर क्लिक करना होगा कि हर बार जब आप कुछ बदलाव पेश करते हैं, यहां तक कि एक छोटा सा भी कुछ भी टूटा नहीं जाता है। परीक्षणों के साथ, आप केवल एक कमांड निष्पादित करते हैं और सत्यापन प्रक्रिया स्वचालित और तेज़ होती है।
- आसान रीफैक्टरिंग प्रक्रिया - मैंने ऊपर उल्लेख किया है कि नई सुविधाओं को जोड़ने या परिवर्तन करने के लिए परीक्षण आवश्यक हैं। परीक्षण के साथ, आप अपने मौजूदा कोड को बेहतर बनाने में भी अधिक सहज महसूस करते हैं।
- परीक्षण दस्तावेज़ीकरण का एक रूप है - अच्छी तरह से लिखित परीक्षण आवेदन में सुविधाओं के विभिन्न सेटों के लिए दस्तावेज़ीकरण का एक रूप हो सकता है। वे न केवल यह वर्णन करते हैं कि विशेषता क्या है बल्कि यह भी कि इसे कैसे काम करना चाहिए।
- कार्यान्वयन पर पुनर्विचार करने का अवसर — जब आप एक परीक्षण लिखते हैं, तो आपके पास फिर से सोचने का मौका होता है कि जिस तरह से आप कोड को लागू करना चाहते हैं वह सही और उचित है। साथ ही, आप बस यह जांच लें कि आपका कोड आपकी अपेक्षा के अनुरूप काम कर रहा है या नहीं।
मुझे आशा है कि उपरोक्त तर्कों ने आपको किसी भी ऐप के विकास के दौरान परीक्षणों का उपयोग करने के लिए आश्वस्त किया है। यह जानते हुए कि कोड का परीक्षण करना क्यों आवश्यक है, विभिन्न प्रकार के परीक्षणों के बारे में जानना भी महत्वपूर्ण है।
विभिन्न प्रकार के परीक्षण
तीन प्राथमिक प्रकार के परीक्षण हैं जो आप यह सुनिश्चित करने के लिए लिख सकते हैं कि आपके रेल एप्लिकेशन का प्रदर्शन सही है और बुनियादी ढांचा भारी कार्यभार के तहत अच्छी तरह से काम कर रहा है। वे प्रकार निम्नलिखित हैं:
- लोड परीक्षण — इस प्रकार का परीक्षण निम्नलिखित प्रश्न का उत्तर देता है:एक साथ कितने उपयोगकर्ता एक निश्चित अवधि के लिए सिस्टम को संभाल सकते हैं। कल्पना कीजिए कि आप अपनी वेबसाइट पर एक टॉप-रेटेड उत्पाद लॉन्च करते हैं और हजारों उपयोगकर्ता एक ही समय में ऑर्डर करना चाहते हैं। उचित लोडिंग परीक्षणों के बिना, आप सबसे महत्वपूर्ण समय के दौरान दुर्घटना का जोखिम उठाते हैं।
- तनाव परीक्षण — इस प्रकार के परीक्षण के साथ, आप उन उपयोगकर्ताओं की संख्या को सत्यापित करने पर ध्यान केंद्रित नहीं करते हैं जिन्हें सिस्टम एक साथ संभाल सकता है, लेकिन जब उपयोगकर्ता की सीमा समाप्त हो जाती है तो सिस्टम कैसे व्यवहार करेगा।
- प्रदर्शन परीक्षण - मैं कहूंगा कि इस प्रकार का परीक्षण तनाव और भार परीक्षण का जनक है। इस तरह के परीक्षणों का प्राथमिक उद्देश्य मेट्रिक्स का एक विशिष्ट सेट प्राप्त करना है जिसके आधार पर हम एप्लिकेशन के कोड को बेहतर बनाने के लिए कुछ कार्रवाई कर सकते हैं। मैं थोड़ी देर में उन मीट्रिक के बारे में बात करूंगा।
कहा जा रहा है, अब हम सिद्धांत भाग के अंतिम चरण में जाने के लिए तैयार हैं:यह सीखना कि रेल एप्लिकेशन पर प्रदर्शन परीक्षण करते समय कौन से मेट्रिक्स आवश्यक हैं। उस ज्ञान के बिना, हम परीक्षण आउटपुट की सही व्याख्या नहीं करेंगे और यह तय नहीं करेंगे कि हमें कोड बदलना चाहिए या नहीं।
महत्वपूर्ण मीट्रिक
आपके द्वारा परीक्षण के लिए उपयोग किए जाने वाले टूल के आधार पर आपको प्राप्त होने वाले मीट्रिक का प्रकार भिन्न हो सकता है, लेकिन आम तौर पर, हम उन्हें मीट्रिक के एक समूह में समूहित कर सकते हैं जो बहुत सामान्य हैं:
- प्रतिक्रिया समय - अनुरोध किए जाने और ब्राउज़र में प्रतिक्रिया देने के बीच का समय। यह मीट्रिक हमें दिखाता है कि उपयोगकर्ता को उसके द्वारा अनुरोधित जानकारी प्राप्त करने से पहले कितने समय तक प्रतीक्षा करनी होगी। इसे कभी-कभी प्रक्रिया समय कहा जाता है।
- स्मृति उपयोग - दिए गए अनुरोध के लिए खपत की गई मेमोरी की मात्रा। यह आवश्यक जानकारी का एक हिस्सा है क्योंकि यह आपको उस स्थान की ओर इंगित करता है जहां आप कोड में सुधार कर सकते हैं ताकि सिस्टम तेजी से प्रतिक्रिया दे सके और कम संसाधनों का उपयोग कर सके।
- वस्तु आवंटन - एक उच्च स्मृति आवंटन उच्च स्मृति उपयोग और लंबी प्रतिक्रिया समय का कारण बनता है। यह मीट्रिक आपको कोड में सटीक स्थान पर ले जा सकता है जहां कई ऑब्जेक्ट आवंटित किए जाते हैं, ताकि आप तुरंत उसका निरीक्षण कर सकें।
परीक्षण करते समय आपके पास अधिक मीट्रिक हो सकते हैं, लेकिन वे तीन सबसे महत्वपूर्ण हैं और आपके द्वारा परीक्षण किए जाने वाले किसी भी एप्लिकेशन के लिए मान्य होंगे। अब हम अपने हाथों को गंदा कर सकते हैं और वास्तविक परीक्षण लिख सकते हैं।
अभ्यास
हम परीक्षण करने के लिए कुछ किए बिना परीक्षण लिखने में सक्षम नहीं हैं। इसलिए अभ्यास भाग में पहला कदम एक साधारण रेल एप्लिकेशन लिखना है जिसके लिए हम परीक्षण लिख सकते हैं।
नमूना रेल आवेदन
मैं रूबी 3.0.1 और रेल 6.1.3.1 का उपयोग करूंगा लेकिन किसी भी ऐसे संस्करण का उपयोग करने में संकोच न करें जिसके साथ आप सहज हैं। यदि आपके पास रूबी और रेल स्थापित है, तो अगला कदम एप्लिकेशन का कंकाल बनाना है:
rails new simpleapp -d=postgresql
लेख के उद्देश्य के लिए, मैं एक ऐप बनाउंगा जहां उपयोगकर्ताओं की एक सूची उनके पालतू जानवरों के नाम के साथ प्रस्तुत की जाती है। इस तरह की संरचना हमें आसानी से N+1 क्वेरी बनाने की अनुमति देगी जो प्रदर्शन परीक्षण करते समय और गति और अन्य मेट्रिक्स पर प्रभाव की जाँच करते समय अधिक मज़ेदार प्रदान करेगी।
मॉडल बनाने से पहले, आइए पहले डेटाबेस बनाएं:
cd simpleapp/
bin/rails db:create
अब, हम मॉडल तैयार कर सकते हैं:
rails g model User name:string
rails g model Animal name:string user:references
bin/rails db:migrate
User
. के लिए बस एक छोटा सा अपडेट Animal
. के साथ संबंध दर्शाने के लिए मॉडल मॉडल:
class User < ApplicationRecord
has_many :animals
end
अब हम db/seeds.rb
. में कुछ बीज जोड़ सकते हैं फ़ाइल:
people = {
'Tim' => ['Pinky', 'Rick'],
'Martha' => ['Rudolph'],
'Mark' => ['Niki', 'Miki', 'Bella'],
'Tina' => ['Tom', 'Luna']
}
people.each_pair do |name, pets|
user = User.create(name: name)
pets.each do |pet_name|
user.animals.create(name: pet_name)
end
end
और डेटा को डेटाबेस में लोड करें:
bin/rails db:seed
मैं उपयोगकर्ताओं के असाइनमेंट के साथ एक नियंत्रक बनाऊंगा, और फिर ध्यान में रखते हुए, मैं सभी उपयोगकर्ताओं को उनके पालतू जानवरों के नाम के साथ सूचीबद्ध करूंगा। मैं जानबूझकर उस कोड का उपयोग कर रहा हूं जो प्रदर्शन समस्याओं का कारण बन रहा है ताकि आप बाद में सुधारों को माप सकें।
touch app/controllers/home_controller.rb
mkdir app/views/home
touch app/views/home/index.html.erb
नियंत्रक सरल है:
class HomeController < ApplicationController
def index
@users = User.all
end
end
और दृश्य भी:
<h1>List</h1>
<ul>
<% @users.each do |user| %>
<li><%= user.name %> (<%= user.animals.count %>)
<ul>
<% user.animals.each do |animal| %>
<li><%= animal.name %></li>
<% end %>
</ul>
</li>
<% end %>
</ul>
अंतिम चरण config/routes.rb
. को अपडेट करना है फ़ाइल को रेल को यह बताने के लिए कि हम मुख्य URL पर जाते समय क्या देखना चाहते हैं:
Rails.application.routes.draw do
root to: 'home#index'
end
JMeter के साथ परीक्षण लोड करें
JMeter अपाचे सॉफ्टवेयर फाउंडेशन द्वारा बनाया गया एक ओपन-सोर्स सॉफ्टवेयर है, जिसे परीक्षण कार्यात्मक व्यवहार को लोड करने के लिए डिज़ाइन किया गया है। चूंकि यह जावा के साथ बनाया गया प्रोग्राम है, आप इसे किसी भी ऑपरेटिंग सिस्टम पर इंस्टॉल कर सकते हैं। आप यहां फाइलें डाउनलोड कर सकते हैं:https://jmeter.apache.org/download_jmeter.cgi
यदि आप macOS सिस्टम पर काम कर रहे हैं, तो आप Homebrew के साथ आसानी से JMeter इंस्टॉल कर सकते हैं:
brew install jmeter
स्थापना के बाद, आप निम्न आदेश के साथ प्रोग्राम चला सकते हैं:
jmeter
परीक्षण को कॉन्फ़िगर करना
कॉन्फ़िगरेशन प्रक्रिया में निम्नलिखित चरण होते हैं:
- थ्रेड समूह जोड़ना — उपयोगकर्ताओं की संख्या निर्दिष्ट करना और प्रत्येक आपकी वेबसाइट पर कब तक आएंगे
- HTTP अनुरोध को कॉन्फ़िगर करना — उस समापन बिंदु को निर्दिष्ट करना जिसे JMeter को हिट करना चाहिए
- उन मीट्रिक को सेट करना जिनमें हम रुचि रखते हैं
आइए पहले बनाए गए सरल ऐप के मुख्य पृष्ठ पर एकल उपयोगकर्ता अनुरोध को अनुकरण करने के लिए एक सरल परीक्षण कॉन्फ़िगरेशन के माध्यम से चरण-दर-चरण चलते हैं।
थ्रेड समूह जोड़ें
"टेस्ट प्लान" पर राइट-क्लिक करने के बाद विस्तारित होने वाले मेनू से जोड़ें -> थ्रेड्स (उपयोगकर्ता) -> थ्रेड समूह का चयन करें:
उपयोगकर्ताओं की संख्या और अतिरिक्त विशेषताएं निर्दिष्ट करें:
HTTP अनुरोध कॉन्फ़िगर करें
पिछले चरण में हमारे द्वारा बनाए गए थ्रेड पर राइट-क्लिक करें और Add -> sampler -> HTTP Request चुनें:
प्रोटोकॉल, सर्वर का नाम, पोर्ट और अनुरोध का पथ कॉन्फ़िगर करें:
परिणाम दृश्य निर्दिष्ट करें
HTTP अनुरोध पर राइट-क्लिक करें और जोड़ें -> श्रोता -> परिणाम ट्री देखें चुनें:
परीक्षा चलाना
परीक्षण अब कॉन्फ़िगर किया गया है, और हम इसे ट्रिगर कर सकते हैं। ऐसा करने के लिए, बस हरे रंग के प्ले बटन पर क्लिक करें:
जैसा कि आप देख सकते हैं, आवेदन ने परीक्षा उत्तीर्ण की, लेकिन यह केवल एक ही अनुरोध था, इसलिए परिणाम स्पष्ट था। एप्लिकेशन कैसे व्यवहार करेगा यह देखने के लिए अब आप उपयोगकर्ताओं की संख्या और अन्य कॉन्फ़िगरेशन विकल्पों के साथ प्रयोग कर सकते हैं। मेरे परीक्षणों से, जब लगभग 200 उपयोगकर्ताओं ने इसे एक साथ एक्सेस करना शुरू किया, तो साधारण ऐप क्रैश होना शुरू हो गया।
अगले चरण
लोड परीक्षण करने के बाद, आप अपने आवेदन के दर्द बिंदुओं को जानेंगे। उपयोगकर्ता सीमा को समझते हुए, अब आप यह देखने के लिए तनाव परीक्षण कर सकते हैं कि एप्लिकेशन कैसा व्यवहार करेगा।
रूबी-प्रोफेसर के साथ प्रदर्शन परीक्षण
प्रदर्शन परीक्षण सुविधा को संस्करण 3 तक रेल में अंतर्निहित किया गया था, और फिर इसे अलग मणि https://github.com/rails/rails-perftest पर निकाला गया था। चूंकि मुझे रेल के नवीनतम संस्करण के साथ इसका उपयोग करने में कुछ समस्याएं थीं, इसलिए मैंने इसे इस लेख में शामिल नहीं करने का निर्णय लिया। इसके बजाय, मैं रूबी-प्रोफ लाइब्रेरी का उपयोग करूंगा जो बहुत अच्छी तरह से काम करती है।
हमेशा की तरह, पहला कदम हमारे आवेदन में एक रत्न जोड़ना है:
bundle add ruby-prof
कॉन्फ़िगरेशन प्रक्रिया का दूसरा और अंतिम चरण config/application.rb
. को अपडेट करना है और मणि के लिए मिडलवेयर का उपयोग करें ताकि पुस्तकालय स्वचालित रूप से हमारे अनुरोधों का निरीक्षण कर सके और उनके आधार पर रिपोर्ट तैयार कर सके:
module Simpleapp
class Application < Rails::Application
config.middleware.use Rack::RubyProf, :path => './tmp/profile'
end
end
अब आप ऐप तक पहुंच सकते हैं, और हर बार जब आप अनुरोध करते हैं, तो रत्न एक नई रिपोर्ट तैयार करेगा। यह इस तरह दिखता है:
आप इसे कॉन्फ़िगर किए गए पथ के अंतर्गत पा सकते हैं, जो tmp/profile
. है हमारे मामले में। दूसरी रिपोर्ट भी तैयार की जाती है, और यह कॉल स्टैक को दिखाती है, जो रेल एप्लिकेशन में प्रदर्शन समस्याओं को डीबग करते समय एक बहुत ही उपयोगी मीट्रिक भी है।
यह याद रखना महत्वपूर्ण है कि cache_classes
. सेट करना और cache_template_loading
true
. पर सेटिंग एप्लिकेशन को धीमा कर देगा और एप्लिकेशन मेट्रिक्स को अभिभूत कर देगा क्योंकि रेल आवश्यक फाइलों को लोड करने का प्रयास करेगा।
सारांश
परीक्षण हर विकास प्रक्रिया का एक अनिवार्य हिस्सा है। यह जाँचना कि क्या कोड वैसा ही व्यवहार करता है जैसा हम चाहते हैं, उतना ही महत्वपूर्ण है जितना कि यह सत्यापित करना कि हमारे समाधानों का प्रदर्शन अच्छा है या नहीं। परीक्षण छोड़ने से गंभीर समस्याएं होती हैं जो ऐप के प्रदर्शन और आपके उपयोगकर्ताओं के विश्वास को प्रभावित करती हैं। उम्मीद है, परीक्षण इतना कठिन नहीं है।
इस लेख में, हमने परीक्षण के निम्नलिखित महत्वपूर्ण पहलुओं को शामिल किया है:
- आपके कोड का परीक्षण करने का कारण
- विभिन्न प्रकार के प्रदर्शन परीक्षण
- जिस तरह से आप अपने रेल ऐप के प्रदर्शन का परीक्षण कर सकते हैं
मुझे आशा है कि अब आप अधिक आश्वस्त हो गए हैं कि परीक्षण लिखना क्यों महत्वपूर्ण है क्योंकि आप जानते हैं कि क्यों और कैसे।
यदि आप न केवल स्थानीय रूप से बल्कि उत्पादन या स्टेजिंग वातावरण में भी अपने ऐप के प्रदर्शन की निगरानी में रुचि रखते हैं, तो आपको ऐपसिग्नल भी देखना चाहिए।
पी.एस. यदि आप रूबी मैजिक की पोस्ट प्रेस से बाहर होते ही पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूजलेटर की सदस्यता लें और एक भी पोस्ट मिस न करें!