step argument transformations specflow tables
कदम तर्क रूपांतरण और स्पंदन प्रवाह ट्यूटोरियल:
हमारे पिछले Specflow Tutorial ने हम सभी को जानकारी दी साझा और बंद बाइंडिंग, हुक और चरण पुन: उपयोग विस्तार से। इस ट्यूटोरियल में, हम स्पेकट्रीम में स्टेप अर्ग्यूमेंट ट्रांसफॉर्मेशन के बारे में अधिक जानकारी प्राप्त करेंगे।
हमारे माध्यम से पढ़ने के लिए स्वतंत्र महसूस करें शुरुआती के लिए कम्पलीट कॉम्फ़्लो ट्रेनिंग गाइड अवधारणा की स्पष्ट समझ के लिए। स्टेपफ्लो का कदम तर्क परिवर्तन सुविधा, उपयोगकर्ता को चरणों में दिए गए मापदंडों के लिए कस्टम परिवर्तन प्रदान करने की अनुमति देता है।
यह इनपुट पैरामीटर को विशिष्ट पैरामीटर में बदलने के लिए कस्टम लॉजिक को जोड़ने की अनुमति देता है। उदाहरण के लिए, आप सीधे मापदंडों से एक वर्ग ऑब्जेक्ट बना सकते हैं और निर्माण फ़ंक्शन को परिवर्तन फ़ंक्शन से वापस कर सकते हैं।
Specflow की एक और विशेषता जिस पर हम इसे देखेंगे वह है Specflow Tables जो कि एक ही चरण के साथ सारणीबद्ध रूप में इनपुट डेटा को पारित करने की अनुमति देता है और तालिका सहायकों को इच्छित वस्तु के रूप में सीधे मैप किया जा सकता है।
वीडियो देखना:
यहाँ स्टेप अर्ग्युमेंट ट्रांसफ़ॉर्मेशन एंड स्पेकफ़्लो टेबल पर एक वीडियो ट्यूटोरियल है:
आप क्या सीखेंगे:
कदम तर्क रूपांतरण
तर्क रूपांतरों को बेहतर तरीके से समझने के लिए, पहले यह पता लगाने की कोशिश करें कि पैरामीटर कितना सटीक मेल खाते हैं। जैसा कि हमने अपने पिछले लेखों में देखा है, YouTube खोज उदाहरण के लिए, हम निष्पादित करने के लिए परिदृश्य के लिए खोज शब्द एक पैरामीटर के रूप में पारित कर रहे थे।
पैरामीटर मिलान आमतौर पर एक नियमित अभिव्यक्ति के माध्यम से होता है और मिलान रेगेक्स कदम में आपूर्ति की गई खोज पद के लिए विधि पैरामीटर की स्थापना करता है।
चलिए पहले समझने की कोशिश करते हैं कि Specflow में डिफ़ॉल्ट समर्थित रूपांतरण क्या हैं और तर्क परिवर्तन कब सहायक हो सकते हैं।
समर्थित बातचीत
रेक्सएक्स मैच के बाद डेटा टाइप को देखकर ही बॉक्स से बाहर रूपांतरणों का समर्थन करता है। यह स्वतः ही रूपांतरणों का ध्यान रख सकता है जैसे - स्ट्रिंग, पूर्णांक, GUID, Enums, आदि।
आइए, इनमें से कुछ के लिए एक उदाहरण देखें:
Scenario: Get Transactions in my account Given I have entered customer name as Test Customer And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e And I select sorting order as DESCENDING And I select number of transactions to be displayed as 25 Then I should see my account transactions
उपरोक्त कोड नमूने में, हमने विभिन्न इनपुट प्रकारों पर प्रकाश डाला है जो हम चरणों में पास कर रहे हैं, और चरण कार्यान्वयन में, ये संबंधित डेटा प्रकारों में परिवर्तित हो रहे हैं।
आइए नीचे इन के लिए चरण कार्यान्वयन देखें (सादगी के लिए हमने अभी-अभी प्रत्येक चरण के लिए सांत्वना दी है कि यह तर्क देने के लिए कि आपूर्ति की गई तर्क स्वचालित रूप से अपेक्षित प्रकार में परिवर्तित हो गया है):
(Given(@'I have entered customer name as (.*)')) public void GivenIHaveEnteredCustomerNameAsTestCustomer(String customerName) { Console.Out.WriteLine(customerName); } (Given(@'I have entered customer account id as (.*)')) public void GivenIHaveEnteredCustomerAccountIdAs(Guid accountId) { Console.Out.WriteLine(accountId.ToString()); } (Given(@'I select sorting order as (.*)')) public void GivenISelectSortingOrderAsAscending(SortOrder sortOrder) { Console.Out.WriteLine(sortOrder.ToString()); } (Then(@'I should see my account transactions')) public void ThenIShouldSeeMyAccountTransactions() { Console.Out.WriteLine('success!'); } (Given(@'I select number of transactions to be displayed as (.*)')) public void GivenISelectNumberOfTransactionsToBeDisplayedAs(int p0) { Console.Out.WriteLine(p0.ToString());
उपरोक्त परिदृश्य को निष्पादित करने पर, आउटपुट सभी मानों को सफलतापूर्वक संकेत देता है कि यह दर्शाता है कि अपेक्षित डेटा प्रकारों के लिए तर्कों का ऑटो रूपांतरण सफल रहा।
इस तरह से आउटपुट दिखता है:
Given I have entered customer name as Test Customer Test Customer -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerNameAsTestCustomer('Test Customer') (0.0s) And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e 0f8fad5b-d9cb-469f-a165-70867728950e -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerAccountIdAs(0f8fad5b-d9cb-469...) (0.0s) And I select sorting order as DESCENDING DESCENDING -> done: SupportedSpecflowConversions.GivenISelectSortingOrderAsAscending(DESCENDING) (0.0s) And I select number of transactions to be displayed as 25 25 -> done: SupportedSpecflowConversions.GivenISelectNumberOfTransactionsToBeDisplayedAs(25) (0.0s) Then I should see my account transactions success! -> done: SupportedSpecflowConversions.ThenIShouldSeeMyAccountTransactions() (0.0s)
तर्क रूपांतरण
इसे समझने के लिए कार्रवाई में एक उदाहरण देखें। समर्थन, आपके पास एक एप्लिकेशन है जो दिए गए समय को परिवर्तित करता है और इसे मिनटों में परिवर्तित करता है। उदाहरण: यदि उपयोगकर्ता इनपुट 1 दिन है - आउटपुट है - 1440, यदि उपयोगकर्ता इनपुट 1 दिन 2 घंटे 2 मिनट है, तो आउटपुट 1562 होना चाहिए।
अब, यह देखा जा सकता है कि विभिन्न प्रकार के इनपुटों का समर्थन करने के लिए, किसी को इनपुट के प्रकार के आधार पर अलग-अलग बाध्यकारी कार्यान्वयन लिखना होगा। उदाहरण के लिए: सिर्फ डेपार्ट वाले इनपुट्स के लिए, एक अलग स्टेप इम्प्लीमेंटेशन होगा, एक दिन, महीने पार्ट वाले इनपुट्स के लिए - अलग स्टेप इम्प्लीमेंटेशन होगा, आदि।
आइए देखें कि यह कैसे कदम तर्क परिवर्तन के माध्यम से एक एकल चरण कार्यान्वयन के माध्यम से लागू किया जा सकता है और प्रदान किए गए इनपुट को केवल टाइमस्टैम्प ऑब्जेक्ट में बदल दिया जाता है और मूल चरण में वापस आ जाता है जिसे चरण परिवर्तन कहा जाता है।
इसे अपने इनपुट के लिए पहले स्तर के रेगेक्स स्कैन के रूप में सोचें जो कॉलिंग चरण में आंशिक रूप से परिवर्तित मूल्य लौटाता है।
फीचर फाइल को 3 अलग-अलग इनपुट वेरिएंट में देखें, जिसमें एक ही ट्रांसफॉर्मेशन के साथ इसे पूरा टाइमपास ऑब्जेक्ट में बदलकर वापस आ जाएगा।
Scenario: Convert timestamp to minutes - variant 1 Given I have entered 50 days into the timestamp to minute converter When I press calculate Then the result should be 72000.00 on the screen Scenario: Convert timestamp to minutes - variant 2 Given I have entered 1 day, 2 hours, 3 minutes into the timestamp to minute converter When I press calculate Then the result should be 1563.00 on the screen Scenario: Convert timestamp to minutes - variant 3 Given I have entered 1 day, 1 hour, 1 minute, 30 seconds into the timestamp to minute converter When I press calculate Then the result should be 1501.50 on the screen
उपरोक्त कोड उदाहरण में हाइलाइट किए गए मानों को देखें। इन सभी को ठीक उसी परिवर्तन का ध्यान रखा जाएगा और अंतिम परिणाम एक परिवर्तित टाइमस्पैन इनपुट मान होगा जिसे कॉलिंग स्टेपफ़्लो स्टेप पर वापस भेजा जाएगा।
नीचे परिवर्तन के कार्यान्वयन पर नजर डालते हैं:
(StepArgumentTransformation(@'(?:(d*) day(?:s)?(?:, )?)?(?:(d*) hour(?:s)?(?:, )?)?(?:(d*) minute(?:s)?(?:, )?)?(?:(d*) second(?:s)?(?:, )?)?')) public TimeSpan convertToTimeSpan(String days, String hours, String minutes, String seconds) { int daysValue; int hoursValue; int minutesValue; int secondsValue; int.TryParse(days, out daysValue); int.TryParse(hours, out hoursValue); int.TryParse(minutes, out minutesValue); int.TryParse(seconds, out secondsValue); return new TimeSpan(daysValue, hoursValue, minutesValue, secondsValue); }
फ्रेमवर्क के लिए यह जानना कि यह एक परिवर्तनकारी बंधन है, Argument रूपांतरण को लागू करने की विधि में StepArgumentTransformation विशेषता को जोड़ना होगा।
तर्क रूपांतरण के बारे में ध्यान दिए जाने वाले अन्य महत्वपूर्ण बिंदु हैं:
# 1) स्टेप आर्ग्युमेंट ट्रांसफॉर्मेशन प्रत्येक मैचिंग स्टेप के लिए चलता है यानि कि स्टेप के प्रकार के बावजूद, चाहे वह दिया गया हो, कब या फिर, प्रत्येक मिलान रेगेक्स के लिए ट्रांसफॉर्मेशन होगा।
#दो) रूपांतरित आउटपुट के रिटर्न प्रकार के आधार पर, यदि वास्तविक कॉलिंग चरण में इनपुट पैरामीटर के लिए मिलान रिटर्न प्रकार नहीं है, तो परिवर्तन नहीं होगा।
इसका मतलब यह है कि, मान लीजिए कि कॉलिंग चरण के लिए एक रूपांतरित इनपुट की आवश्यकता होती है, लेकिन इसमें इनपुट का उल्लेख टाइमस्टैम्प होता है, जो कि बदले हुए तरीके के रिटर्न प्रकार से मेल नहीं खाता है, तो रेगेक्स मैच को ओवरराइड कर दिया जाएगा और रूपांतरण नहीं होगा।
आइए 'दिए गए' चरण को लागू करने के कार्यान्वयन पर नज़र डालें:
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
यहां इनपुट पैरामीटर के प्रकार को देखें अर्थात् इसका टाइमस्पैन, जो कि परिवर्तन चरण से लौटाए गए प्रकार से मेल खाता है यदि इसे किसी अन्य प्रकार में बदल दिया जाए। उदाहरण के लिए स्ट्रिंग, तब तर्क रूपांतरण नहीं होगा और रेगेक्स मैच को मूल चरण कार्यान्वयन द्वारा ओवरराइड किया जाएगा।
प्रो टिप: यहां ध्यान देने योग्य एक महत्वपूर्ण बात यह है कि संपूर्ण पाठ को चरण तर्क परिवर्तन के माध्यम से बदलना / मेल खाना चाहिए। इसलिए, दिया गया कदम अब सभी संभावित इनपुट प्रारूपों को एक स्ट्रिंग में लपेट देगा और रूपांतरण रेगेक्स इसे टाइमस्पैन ऑब्जेक्ट में बदल देगा और वापस आ जाएगा।स्पंदन प्रवाह
कार्यान्वयन तालिका को चरणबद्ध करने के लिए मानों की सूची को पास करने का एक तरीका है स्पेकफ़्लो टेबल्स। हमारे पिछले लेखों में, हमने परिदृश्य-रूपरेखा और उदाहरणों का उपयोग करके डेटा-संचालित परीक्षणों को लागू करने के तरीके को देखा। लेकिन यह मुख्य रूप से विभिन्न आदानों के साथ परिदृश्य को निष्पादित करना था।
यहाँ, तालिकाओं में, यह सभी डेटा को सारणीबद्ध रूप में एक बार चरणबद्ध रूप से पारित करने के बारे में है जो डेटा की आपूर्ति कर रहा है।
उदाहरण के लिए, एक उदाहरण पर विचार करें जहां आप एक छात्र प्रबंधन प्रणाली का परीक्षण कर रहे हैं और एक नया छात्र ऑब्जेक्ट बनाने के लिए, आपको पहले नाम, अंतिम नाम, आयु, जन्म का वर्ष आदि जैसे कई विवरण भरने का अनुरोध किया जाता है।
एक तरीका यह है कि इस जानकारी को प्रत्येक एक अलग चरण के रूप में पारित किया जाए जो अनिवार्य रूप से बहुत सारे बॉयलरप्लेट कोड होंगे और प्रत्येक चरण में, आप उसी वस्तु को अपडेट करेंगे जिसे परीक्षण करने की आवश्यकता है। एक अन्य तरीका एक जटिल रीगेक्स का निर्माण हो सकता है और सभी डेटा को एक ही चरण में पारित करने की कोशिश कर सकता है, लेकिन यह काफी त्रुटिपूर्ण और परतदार है।
टेबल हमारे बचाव में आते हैं। सभी छात्र संबंधित इनपुट डेटा को एक ही चरण कार्यान्वयन में एक अच्छा सारणीबद्ध तरीके से तालिका के माध्यम से भेजा जा सकता है।
आइए फ़ीचर और चरण कार्यान्वयन के लिए नीचे एक कोड नमूना देखें:
Scenario: Pass data through Specflow tables for StudentInfo object Given I have entered following info for Student | FirstName | LastName | Age | YearOfBirth | | test | student | 20 | 1995 | When I press add Then i student should get added to database and entered info should be displayed on the screen
उपरोक्त परिदृश्य चरण में तालिका डेटा पर प्रकाश डाला गया है।
आपके लिए एनीमे टीवी सब मुफ्त
स्पेकफ़्लो बहुत सारे टेबलहेल्पर्स प्रदान करता है, जो सीधे अपने आप ही प्रत्येक क्षेत्र को पार्स करने के बजाय उपयोगकर्ता-प्रदत्त इनपुट डेटा से ऑब्जेक्ट इंस्टेंट बनाने जैसी उपयोगी सुविधाओं के लिए अनुमति देते हैं।
चलो नीचे चरण कार्यान्वयन देखें:
private StudentInfo studInfo; (Given(@'I have entered following info for Student')) public void GivenIHaveEnteredFollowingInfoForStudent(Table table) { // converting supplied input data directly to instance of StudentInfo object studInfo = table.CreateInstance(); }
ऊपर हाइलाइट किए गए अनुभाग को देखें। यहाँ कोड की केवल एक छोटी सी रेखा है, संपूर्ण स्टूडेंटइन्फो ऑब्जेक्ट (जो कि एक POCO है जिसमें स्टूडेंट डेटा फील्ड्स हैं। पहला नाम, अंतिम नाम, आयु, जन्म का वर्ष, आदि)
Specflow तालिका से संबंधित कुछ अन्य विशेषताएं / अवधारणाएँ नीचे दी गई हैं:
# 1) टेबल्स क्षैतिज या ऊर्ध्वाधर हो सकते हैं। वर्टिकल टेबल की-वैल्यू पेयर की तरह अधिक होते हैं और ऊपर के परिदृश्य में नाम-वैल्यू मैपिंग जैसे अधिक होते हैं जबकि क्षैतिज टेबल में किसी ऑब्जेक्ट के लिए एक ही पंक्ति में सभी डेटा होते हैं (जैसे कि हमने अपने उदाहरण में देखा)।
#दो) वर्टिकल टेबल को केवल एक .NET ऑब्जेक्ट पर मैप किया जा सकता है जबकि क्षैतिज टेबल को ऑब्जेक्ट के सेट या कलेक्शन में मैप किया जा सकता है।
# 3) तालिका में प्रत्येक फ़ील्ड मान परमाणु होना चाहिए क्योंकि यह पार्स की गई ऑब्जेक्ट में एक ही संबंधित फ़ील्ड में मैप किया जाएगा।
यहां ध्यान देने वाली एक महत्वपूर्ण बात यह है कि भले ही आप स्वत: जनरेट सारणीबद्ध डेटा के साथ चरण बाइंडिंग, स्पेकफ्लो बाइंडिंग जनरेटर स्वचालित रूप से इस तरह के इनपुट प्रकारों के लिए खाता होगा और इसे एक मान्य सारणीबद्ध डेटा के रूप में पहचानता है।
निष्कर्ष
इस लेख में, हमने Specflow में 2 महत्वपूर्ण और आसान अवधारणाओं को समझाने की कोशिश की।
पहला कदम है चरण तर्क परिवर्तन जो बॉयलरप्लेट कोड से बचने के लिए Specflow के तर्कों के लिए कस्टम प्रकार रूपांतरण की अनुमति देता है (और परीक्षण स्क्रिप्ट को और अधिक संशोधित और तार्किक दिखने में सक्षम बनाता है) और दूसरी विशेषता जिसे हमने देखा है। स्पंदन प्रवाह जो तब काम आता है जब आपको उपयोगकर्ता के अनुकूल सारणीबद्ध प्रारूप में एक ही चरण में बहुत सारे फ़ील्ड / डेटा पास करने की आवश्यकता होती है।
हमारे आगामी ट्यूटोरियल में, हम इस बारे में अधिक जानेंगे कि कैसे आप अचार जैसे ओपन सोर्स टूल्स का उपयोग करके विभिन्न स्वरूपों में स्पेकट्वोलेट का उपयोग करके सुंदर प्रलेखन को ऑटो-जनरेट कर सकते हैं जो परियोजना के सभी हितधारकों के लिए एक आसान संदर्भ प्रदान कर सकता है।
PREV ट्यूटोरियल | अगले ट्यूटोरियल
अनुशंसित पाठ
- MongoDB में तैनाती: चरण-दर-चरण ट्यूटोरियल
- स्टेप-बाय-स्टेप इंस्टालेशन और अप्पियम स्टूडियो का सेटअप
- स्पेकफ्लो और सेलेनियम वेबड्राइवर एंड टू एंड उदाहरण
- ALM / QC के साथ QTP को एकीकृत करने के लिए चरण-दर-चरण गाइड
- टॉप 15 पॉपुलर स्पेसफ्लो इंटरव्यू प्रश्न
- एडवांस्ड स्पेकफ्लो साझा और स्कोप्ड बाइंडिंग, हुक और स्टेप रीयूज
- Windows पर MongoDB स्थापित करें: एक चरण-दर-चरण मार्गदर्शिका
- QTest के साथ JIRA को कैसे एकीकृत करें: एक कदम से कदम गाइड