हाल ही में मैंने परियोजना को बदल दिया - मैं एक नए विकास में आया, जहां मेरे सामने कोई परीक्षण नहीं था, या तो मैनुअल या स्वचालित। ग्राहक ने टूलकिट पर शर्तों को लागू नहीं किया (सिवाय इसके कि यह पायथन था), इसलिए मैंने अपनी पसंद बनाई। इस लेख में, मैं बताऊंगा कि ऐसी स्थितियों में मैंने रोबोट फ्रेमवर्क को क्यों चुना। और अंत में लेख के लिए विशेष रूप से लिखे गए कुछ उदाहरण होंगे जो बताएंगे कि हम किस बारे में बात कर रहे हैं।

मैं 10 वर्षों से परीक्षण स्वचालन कर रहा हूं, और उनमें से तीन ने रोबोट फ्रेमवर्क के साथ बातचीत की।
जैसा कि मैंने ऊपर उल्लेख किया है, बहुत पहले नहीं मैं एक नई परियोजना के लिए आया था, जहां मैंने खरोंच से स्वचालन का परीक्षण शुरू किया था। मैं आपको प्रोजेक्ट - एनडीए के बारे में नहीं बता सकता। मैं केवल ध्यान देता हूं कि यह एक शांत स्वचालन उपकरण है, जिसे भविष्य में बहुत सारे मानव संसाधनों को बचाना चाहिए। इसे माइक्रोसर्विसेज से बनाया गया है। अब तक, मेरा काम उनमें से चार की चिंता करता है, लेकिन भविष्य में मैं अपनी गतिविधियों का विस्तार दूसरों के लिए करूंगा - यह सब इस तथ्य से कम होता है कि मेरे पास दिन में केवल 8 कार्य घंटे हैं। हर चीज में समय लगता है।
इस परियोजना के मामले में परीक्षण की कमी अनुशंसित उपकरणों की कमी के समान थी। पायथन स्टैक के हिस्से के रूप में, मुझे पसंद की स्वतंत्रता थी। और मैंने इसका फायदा उठाया।
रोबोट फ्रेमवर्क क्यों?
मुझे लगता है कि मुझे रोबोट फ्रेमवर्क के प्रशंसकों के लिए जिम्मेदार ठहराया जा सकता है। यह मुझे लगता है कि इस पर लगभग सब कुछ किया जा सकता है।
अन्य परियोजनाओं पर, कंपनी pytest का उपयोग करती है। हालांकि, मेरी राय में, इसमें ऐसी क्षमताएं नहीं हैं, क्योंकि यह पायथन की क्षमताओं से सीमित है। आप बस पायथन कोड लिखते हैं और ध्यान दें कि आप इस तरह के एक चर में एक निश्चित मूल्य की उम्मीद करते हैं। मेरे स्वाद के लिए, यह सरल है लेकिन बहुत सार है। डेवलपर की दया पर बहुत कुछ छोड़ दिया गया है, जिसे सभी उपयोगी सुविधाओं को हाथ से जोड़ना होगा। रोबोट फ्रेमवर्क इसे स्वयं करता है। आपकी परियोजना के लिए चार बिंदु यहां दिए गए हैं।
लचीलापन
रोबोट फ्रेमवर्क खुद पाइथन में लिखा गया है (अर्थात यह पाइथन कुछ भी कर सकता है), और इसके लिए समुदाय द्वारा बनाई गई कई लाइब्रेरी हैं, जो बहुत सी समस्याओं को हल करती हैं।
रोबोट फ्रेमवर्क के तहत, आप आसानी से अपने स्वयं के पुस्तकालयों को लिख सकते हैं, इसे लगभग किसी भी चीज के साथ एकीकृत कर सकते हैं, और सब कुछ तुरंत काम करेगा। कोई बैसाखी या साइकिल की आवश्यकता नहीं है।
और इसके अलावा, रोबोट फ्रेमवर्क आपको पैरामीट्रिक परीक्षण (टेम्प्लेट) लिखने की अनुमति देता है, जो स्वचालन उपकरण के काम को बहुत तेज करता है।
परीक्षणों में रूसी भाषा
मूल बिंदुओं में से एक यह है कि कीवर्ड (रोबोट फ्रेमवर्क में पारंपरिक तरीकों का एनालॉग, जिसे ऐतिहासिक रूप से किसी कारण से कहा जाता है) रूसी में लिखा जा सकता है। नतीजतन, परीक्षण ग्रंथ निश्चित रूप से, साहित्यिक भाषा से दूर हैं, लेकिन पहली नज़र में यह स्पष्ट हो जाता है कि वहां क्या हो रहा है। सबसे पहले, यह अंत डेवलपर्स द्वारा नहीं, बल्कि उदाहरण के लिए, हितधारकों द्वारा आवश्यक है। वे स्वतंत्र रूप से परीक्षण खोल सकते हैं और देख सकते हैं कि वास्तव में वहां क्या होता है: "से एक यादृच्छिक तत्व का चयन करें ...", आदि।
टैगिंग
रोबोट फ्रेमवर्क टैग के साथ अच्छी तरह से काम करता है। आप न केवल एक विशिष्ट टैग के साथ परीक्षण चला सकते हैं, बल्कि उनकी मदद से रिपोर्ट का विश्लेषण भी कर सकते हैं। लॉग फ़ाइल में टैग पर आँकड़े होते हैं, जिसके आधार पर यदि आप पहले से टैग की व्यवस्था के बारे में सोचते हैं तो आप कुछ कार्रवाई कर सकते हैं।
आसानी से, आपको प्रत्येक परीक्षण में एक लंबे फुटक्लॉथ में सभी टैग लिखने की आवश्यकता नहीं है, लेकिन आप एक पेड़ की संरचना में परीक्षण एम्बेड कर सकते हैं। मेरे मामले में, यह इस तरह दिखता है: पहला स्तर एक माइक्रो सर्विस है, दूसरा परीक्षण का प्रकार है, तीसरा स्वयं परीक्षण है (जो अंदर अंतर्निहित है उसके लिए एक इनिट फ़ाइल टैग लगाने के लिए सुविधाजनक है)।
मैंने प्रत्येक माइक्रोसेवा, प्रत्येक परीक्षण दृष्टिकोण (धूम्रपान परीक्षण, सीआरयूडी परीक्षण, एकीकरण, आदि) के लिए एक टैग बनाया। मैं एक विशिष्ट प्रकार के परीक्षण चला सकता हूं या केवल एक विशिष्ट सेवा के लिए। मैं फ़ंक्शन के प्रकार - सूची या विस्तृत को भी टैग करता हूं। और यदि उत्पाद में लिस्ट फ़ंक्शंस "ब्रेक" के लिए जिम्मेदार उत्पाद, इस टैग के साथ सभी परीक्षण लाल हो जाएंगे, भले ही वे कहाँ स्थित हैं और वे किससे संबंधित हैं।
टैग से मैं ऑटोटैस्ट को जीरा से बांधता हूं। जब ट्रैकर से बग बंद हो जाता है, और लाल से परीक्षण हरा हो जाता है, हमारे पास अभी भी एक इतिहास है कि वास्तव में क्या बदल गया है। कई महीनों बाद, यदि परीक्षण फिर से लाल हो जाता है, तो हम देख सकते हैं कि पिछली बार समस्या को ठीक करने के लिए क्या कदम उठाए गए थे, और यहां तक कि मान लिया गया था कि बग के बार-बार प्लेबैक के कारण।
एक और विशेष टैग मैंने गैर-महत्वपूर्ण बग के लिए जोड़ा है। अगर कम से कम एक परीक्षण क्रैश हो जाता है तो GitLab हमें असेंबली के साथ कुछ भी करने की अनुमति नहीं देता है। यह तर्कसंगत है - जब तक सभी कीड़े ठीक नहीं हो जाते, तब तक हम एक उत्पाद या एक साप्ताहिक स्प्रिंट जारी नहीं कर सकते। लेकिन हमारे पास कम प्राथमिकता और महत्वहीन बग हैं। उनके लिए, मैंने एक टैग का चयन किया, जो रोबोट फ्रेमवर्क को पूरी असेंबली को नहीं गिराने की अनुमति देता है, जब तक कि विशेष रूप से ये परीक्षण (इस टैग के साथ परीक्षण) विफल न हों।
महान लॉग
लॉग विश्लेषण परीक्षण का एक अभिन्न हिस्सा है। परीक्षण चलाए जाने के समय जो कुछ भी होता है, रोबोट फ्रेमवर्क बिल्कुल सब कुछ लिखता है। इस बिंदु पर कि मुझे एक विशेष आवरण लिखना था जो डेटाबेस से जुड़ने के लिए लॉग से लॉगिन और पासवर्ड छुपाता है।
इस तरह की डिटेलिंग बहुत तेज़ी से समझने में मदद करती है कि टेस्ट क्रैश होने का कारण क्या है - क्या परीक्षण के तहत प्रणाली गलत तरीके से काम कर रही है या परीक्षण में कुछ पर ध्यान नहीं दिया गया है और इसे ठीक करने की आवश्यकता है? इस सवाल का जवाब हमेशा स्पष्ट नहीं होता है। डेवलपर्स और परीक्षकों की त्रुटियों को 50/50 वितरित किया जाता है।
अन्य उपकरणों में - एक ही पाइस्टेस्ट में - आप एक ही विस्तृत लॉग बना सकते हैं। लेकिन इसे बनाने का कार्य डेवलपर के साथ टिकी हुई है जो परीक्षण लिखते हैं। उसे इस बारे में सोचने की जरूरत है कि वास्तव में किस तरह की लॉग प्रविष्टियों की आवश्यकता है।
अभी प्रोजेक्ट पर क्या है
जिस समय से मैंने रोबोट फ्रेमवर्क का उपयोग करना शुरू किया है, कई महीने बीत चुके हैं। फिलहाल, रोबोट फ्रेमवर्क ने 200 से अधिक परीक्षणों को लागू किया है और, जैसा कि ऊपर उल्लेख किया गया है, गीतालाब के साथ एकीकरण है, जो विकसित उत्पाद में किए गए परिवर्तनों की जांच करने में मदद करता है (पहचानकर्ताओं के साथ परीक्षण के मामले जो आपको ऑटोटैस्ट को बांधने की अनुमति देते हैं, उन्हें टेस्ट्राइल में संग्रहीत किया जाता है)।
कवरेज की गणना करने के लिए, मैंने एक उपयोगिता लिखी जो स्वैगर से बैकएंड एपीआई की एक सूची लेती है और इसकी तुलना की जाती है कि क्या परीक्षण किया गया था। इस प्रकार, हमें वर्तमान कवरेज की स्पष्ट समझ है। उदाहरण के लिए, हम जानते हैं कि आज यह माइक्रोसर्विस पूरी तरह से कवर किया गया है, जबकि दूसरा 98% कवर किया गया है। और नई कार्यक्षमता जोड़ने के बाद जो परीक्षण में अभी तक परिलक्षित नहीं हुई है, कवरेज कम हो जाती है। तदनुसार, आप मेरे द्वारा लागू किए जाने वाले अगले स्प्रिंट के लिए योजना बना सकते हैं।
स्वाभाविक रूप से, परियोजना आगे विकसित हो रही है। उदाहरण के लिए, अब हम एक मॉक सर्वर तैनात कर रहे हैं (
मेरे सहयोगी ने पहले से ही हैबे पर लिखा है कि यह क्या है और इसकी आवश्यकता क्यों है)।
अब अभ्यास करना है
उपरोक्त उदाहरण लेख के लिए विशेष रूप से उपरोक्त विचारों को चित्रित करने के लिए डिज़ाइन किए गए हैं। यदि आप स्वयं इन उदाहरणों के साथ प्रयोग करना चाहते हैं, तो वे सभी
हमारे भंडार में तैनात हैं।
सबसे सरल परीक्षण उदाहरण
आइए रोबोट फ्रेमवर्क पर सबसे सरल परीक्षण से शुरू करें।
नीचे दिए गए उदाहरण में, एक सत्र पहली बार एक निश्चित रूप से सुलभ संसाधन में बनाया गया है (हमारे मामले में,
en.wikipedia.org/wiki )। गेट रूट (/) को कॉल करके, हम स्थिति कोड 200 की जांच करते हैं।
*** Settings *** Documentation smoke-. Library RequestsLibrary *** Variables *** ${base_url} https://en.wikipedia.org/wiki ${url} / *** Test Cases *** Wiki Create session conn ${base_url} disable_warnings=1 ${response} Get request conn ${url} Delete all sessions Should be equal ${response.status_code} ${200}
टेम्प्लेट (पैरामीट्रिक) परीक्षण
रोबोट फ्रेमवर्क आपको परीक्षण पैटर्न बनाने की अनुमति देता है। यदि हम पिछले उदाहरण से टेम्प्लेट दृश्य में परीक्षण को स्थानांतरित करते हैं, तो हम आवश्यक तर्कों के साथ कॉल जोड़कर इसे आसानी से माप सकते हैं। उदाहरण के लिए, आइए वैज्ञानिकों की जीवनी वाले पृष्ठों के लिए उत्तर 200 की जांच करें।
*** Settings *** Documentation smoke-. . ... . Library RequestsLibrary Test Setup Test Teardown Test Template Smoke- *** Variables *** ${base_url} https://en.wikipedia.org/wiki *** Test Cases *** /Isaac_Newton /Albert_Einstein /Stephen_Hawking *** Keywords *** Create session conn ${base_url} disable_warnings=1 Delete all sessions Smoke- [Arguments] ${url} ${response} Get request conn ${url} Should be equal ${response.status_code} ${200}
लॉगिंग को पढ़ना और पढ़ना
हम सबसे सरल परीक्षण में सुधार जारी रखते हैं।
एकल प्रविष्टि बिंदु के रूप में एक टेम्प्लेट होने पर, हम आसानी से वैज्ञानिक के जन्म के वर्ष का सत्यापन जोड़ सकते हैं। इस तरह हम पुष्टि करते हैं कि लोड किया गया पृष्ठ सही डेटा प्रदर्शित करता है।
इसके अलावा, नीचे दिए गए उदाहरण में, मैंने मौजूदा कीवर्ड को रूसी नामों में लपेटा - मेरे स्वाद के लिए, इसलिए परीक्षण अधिक व्यवस्थित रूप से पढ़ता है। एक परीक्षक के रूप में, मैं हमेशा "अंग्रेजी में मानो" जैसे तरीकों से नाराज था, लेकिन पूरी तरह से अनपढ़ था। जो भाषा आप जानते हैं उसमें लिखना हमेशा बेहतर होता है।
*** Settings *** Documentation smoke-. . ... . ... . ... . Library RequestsLibrary Test Setup Test Teardown Test Template Smoke- *** Variables *** ${base_url} https://en.wikipedia.org/wiki *** Test Cases *** [Tags] Newton /Isaac_Newton 1642 [Tags] Einstein /Albert_Einstein 1879 [Tags] Hawking /Stephen_Hawking 1942 ( ) [Tags] Numbers /123456789 1899 *** Keywords *** Create session conn ${base_url} disable_warnings=1 Delete all sessions Smoke- [Arguments] ${url} ${expected_word} ${response} Get request conn ${url} Should be equal ${response.status_code} ${200} ... msg= GET ${url} , 200 . ${response.text} ${expected_word} [Arguments] ${text} ${expected_word} Should contain ${text} ${expected_word} msg= ${expected_word}!
[Tags]
ध्यान दें। आप यहां टैग जोड़ सकते हैं, जैसा कि मैंने ऊपर लिखा था, रिपोर्ट स्तर पर समस्याओं का आकलन करने में मदद करेगा। इसी तरह, __init__ में
Force Tags
। रोबोट फ़ाइल (
हमारे भंडार में उदाहरण देखें) आपको नेस्टेड सहित निर्देशिका में सभी परीक्षणों के लिए टैग सेट करने की अनुमति देता है। यदि टैगिंग को सही तरीके से किया जाता है, तो बिना परीक्षणों के नामों को पढ़े बिना और उनके तर्क को क्रॉल किए बिना, हम काफी सटीक रूप से यह मान सकते हैं कि यह परीक्षण परियोजना में काम नहीं करता है।
इन परीक्षणों के प्रक्षेपण पर रिपोर्ट देखें। स्पष्टता के लिए, मैंने एक परीक्षण जोड़ा जो त्रुटि पाएगा।
रिपोर्ट के आँकड़े इसका सबसे महत्वपूर्ण हिस्सा हैं।

हमारे उदाहरण में,
numbers
टैग के साथ परीक्षण पूरी तरह से पास नहीं हुए (हमारे पास 1 में से 1 है, लेकिन वास्तविक जीवन में, उदाहरण के लिए, 20 में से 17 होगा)। यह माना जा सकता है कि समस्या इस पृष्ठ में है।
टैग चयनात्मक परीक्षण चलाने में मदद करते हैं। लॉन्च लाइन में एक विशिष्ट टैग के साथ सभी परीक्षण चलाने के लिए, आपको निर्दिष्ट करना होगा:
--include <tag>
यहां तक कि टैग के साथ तार्किक संचालन समर्थित हैं:
-- include <tag>AND<tag>
उदाहरण के लिए, यदि आप संख्या टैग के साथ परीक्षण के लिए केवल स्मोक टेस्ट चलाना चाहते हैं, तो आपको जोड़ना चाहिए:
--include smokeANDnumbers
गैर-महत्वपूर्ण परीक्षण
आइए उन चालों पर चलते हैं जो काम को बहुत सरल बनाती हैं।
टैग के साथ परीक्षण को चिह्नित करने के बाद, आप उनमें से एक या अधिक को "गैर-महत्वपूर्ण" के रूप में परिभाषित कर सकते हैं। इस तरह के टैग के साथ एक परीक्षण अभी भी त्रुटियों (यदि कोई हो) दिखाएगा, लेकिन अंत में, इन त्रुटियों को "अमान्य" के रूप में व्याख्या नहीं की जाएगी। मैं इस विकल्प का उपयोग करता हूं जब कुछ छोटे कीड़े को ध्यान में रखा गया था, बग ट्रैकर में प्रवेश किया गया था, लेकिन अभी तक तय नहीं किया गया है। इसके बिना, ऐसी ज्ञात समस्याओं का पता लगाने पर, CI में शामिल ऑटोटेस्ट्स आपको प्रोजेक्ट को इकट्ठा करने की अनुमति नहीं देगा, और यह हमेशा सुविधाजनक नहीं होता है।
एक नई परीक्षा जोड़ें:
( ) [Tags] Letters Known /abcdefghi 1799
स्टार्टअप में, जोड़े गए टैग को कुंजी का उपयोग करके "गैर-महत्वपूर्ण" के रूप में परिभाषित किया गया है:
--noncritical Known
अजगर में कीवर्ड
निम्नलिखित उदाहरण के साथ, मैं यह बताऊंगा कि अपने पुस्तकालय को कैसे जोड़ा जाए।
एक नया कीवर्ड बनाएँ "संख्याओं की एक सरणी बनाएँ"। इसका उद्देश्य स्पष्ट है (इसके लिए मुझे रूसी नाम पसंद हैं)।
from random import randint from typing import List from robot.api.deco import keyword class ArrayGeneratorLibrary: ROBOT_LIBRARY_SCOPE = 'GLOBAL' @keyword(" ") def generate_array(self, length: int, minimal: int, maximal: int) -> List[int]: result = [] for i in range(int(length)): result.append(randint(int(minimal), int(maximal))) return result
हम पुस्तकालय को परीक्षण में जोड़ते हैं:
Library libraries.ArrayGeneratorLibrary
और इसका उपयोग करें:
, python. ${array} ${5} ${2} ${8} Log to console ${array}
यह मत भूलो कि यदि आपके पास एक नेस्टेड संरचना है, तो आपको इसे डॉट्स के साथ अलग करना चाहिए, जैसे कि उदाहरण में।
एक और चाल:
${}
में पारित संख्याओं को इंट के रूप में माना जाता है, न कि तार के रूप में!
इनलाइन तर्क
एक और अच्छी बात बिल्ट-इन तर्कों की है, जो कॉल के अंत में पारित नहीं होते हैं, हमेशा की तरह, लेकिन सीधे उसके शरीर में।
वर्णन करने के लिए, हम ऊपर बनाए गए सरणी जनरेटर के लिए एक आवरण लिखेंगे, जो अंतर्निहित तर्कों का उपयोग करने की अनुमति देता है:
${n} , ${from} ${to} ${result} ${n} ${from} ${to} [Return] ${result}
अब आप इस तरह लिख सकते हैं:
. ${array} 5 , 2 8 Log to console ${array}
विधि नाम, अजगर डालने और लूप के भाग का प्रतिस्थापन
अगली चाल जो मुझे वास्तव में रोबोट फ्रेमवर्क के बारे में पसंद है, नाम के हिस्से का प्रतिस्थापन है। मान लें कि हमारे पास दो विधियाँ हैं: एक संख्या का चयन करता है, दूसरा विषम।
[Arguments] ${list} ${evens} Evaluate [i for i in $list if i % 2 == 0] [Return] ${evens} [Arguments] ${list} ${odds} Evaluate [i for i in $list if i % 2 != 0] [Return] ${odds}
ऊपर प्रयोग किया गया कीवर्ड
Evaluate
आपको अजगर कोड "यहीं" की एक पंक्ति निष्पादित करने की अनुमति देता है। कृपया ध्यान दें कि यदि आप चर की सामग्री के साथ स्ट्रिंग के एक टुकड़े को बदलना नहीं चाहते हैं, अर्थात्, इसके लिए एक लिंक पास करें, तो आपको घुंघराले ब्रेसिज़ के बिना
$
साइन के तुरंत बाद चर नाम निर्दिष्ट करना होगा!
और इसलिए, आप दोनों तरीकों को कॉल कर सकते हैं, उनके नाम के अलग-अलग हिस्से को बदल सकते हैं:
, . . ${types} Create list ${array} 5 , 12 28 FOR ${type} IN @{types} ${numbers} Run keyword ${type} ${array} log to console ${numbers} END
विधि सज्जाकार
हां, रोबोट फ्रेमवर्क आपको अन्य कीवर्ड के लिए डेकोरेटर लिखने की अनुमति देता है!
इस विशेषता का वर्णन करने के लिए, हम एक डेकोरेटर लिखते हैं जो किसी भी विधि की प्रतिक्रिया में नकारात्मक संख्या का चयन करता है जो एक सूची देता है।
, [Arguments] ${keyword} @{args} &{kwargs} ${list} Run keyword ${keyword} @{args} &{kwargs} ${negs} Evaluate [i for i in $list if i < 0] [Return] ${negs}
कृपया ध्यान दें:
@{args}
सभी अनाम तर्क हैं;
&{kwargs}
सभी नामित तर्क हैं।
इस गुच्छा के बाद, आप उन्हें पुनर्निर्देशित कर सकते हैं, वास्तव में एक डेकोरेटर बना सकते हैं।
डेकोरेटर के साथ काम करना इस तरह होगा:
${negs} , 10 -5 5 log to console ${negs}
एक निष्कर्ष के बजाय
ऊपर दिए गए उदाहरणों में, मैंने रोबोट फ्रेमवर्क की मुख्य विशेषताओं को दिखाया, जो जीवन को बहुत आसान बनाते हैं। लेकिन उसके चिप्स इस सूची तक सीमित नहीं हैं।
यदि आपके कोई प्रश्न हैं, तो टिप्पणियों में लिखें। हम रुचि पढ़ने की मुख्य दिशा का पता लगाएंगे और पाठ की निरंतरता के साथ प्रश्नों का उत्तर देंगे।
लेख के लेखक: व्लादिमीर वासिवेव।
पुनश्च हमने अपने लेख रनेट की कई साइटों पर प्रकाशित किए हैं।
वीके ,
एफबी या
टेलीग्राम-चैनल पर हमारे सभी प्रकाशनों और अन्य मैक्सिलैक्ट समाचारों के बारे में जानने के लिए हमारे पेज की सदस्यता लें।