bdd cucumber tutorial with examples
यह गहराई से ककड़ी ट्यूटोरियल बीडीडी और उसके लाभ, ककड़ी रूपरेखा, पर्यावरण सेटिंग्स, टेस्ट स्क्रिप्ट निर्माण, ककड़ी सुविधाएँ, रिपोर्ट, आदि पर चर्चा करता है:
ककड़ी बहुत लोकप्रिय हो गई है और अब इसका व्यापक रूप से सॉफ्टवेयर परीक्षण उद्योग में उपयोग किया जाता है।
आवश्यक शर्तें - इच्छुक प्राप्तकर्ताओं को स्क्रैम, मेवेन, टेस्टएनजी आदि का ज्ञान होना चाहिए।
आप क्या सीखेंगे:
- बीडीडी की पृष्ठभूमि
- व्यवहार चालित विकास (बीडीडी) के लाभ
- BDD उपकरण
- खीरा क्यों?
- ककड़ी कैसे काम करती है?
- पर्यावरण सेटिंग्स
- ककड़ी का उपयोग करके टेस्ट केस लिखना
- ककड़ी के लिए फाइलें बनाना
- ककड़ी सुविधाएँ
- ककड़ी के साथ टेस्टएनजी
- निष्कर्ष
- अनुशंसित पाठ
बीडीडी की पृष्ठभूमि
चुस्त कार्यप्रणाली के टीडीडी फ्रेमवर्क में, हम आम तौर पर परीक्षण मामलों को पहले लिखते हैं और फिर उन्हें निष्पादित करते हैं। यह टेस्ट कवरेज पाने के लिए अच्छा है और सुनिश्चित करें कि निर्माण उत्पादन के लिए तैयार है।
हालांकि, हम परीक्षण के लिए व्यवहार, सुविधाएँ आदि को शुरू करके TDD ढांचे को बढ़ा सकते हैं और फिर उसी पर अमल कर सकते हैं। TDD के लिए इस वृद्धि को BDD (व्यवहार प्रवृत्त विकास) कहा जाता है।
व्यवहार चालित विकास (बीडीडी) के लाभ
BDD का उपयोग करने के कुछ लाभ हैं:
# 1) एक साझा मंच के माध्यम से व्यावसायिक हितधारकों और तकनीकी टीम के बीच की खाई को पाटता है। इसलिए, टीम के बीच संचार अधिक पारदर्शी हो जाता है।
#दो) परिदृश्य क्लाइंट-साइड, बिजनेस टीम के सदस्य, प्रबंधन आदि के लोगों सहित किसी द्वारा भी लिखे जा सकते हैं, इसलिए, आवश्यकताओं, परिदृश्यों को कवर किया जा रहा है।
# 3) डेवलपर्स कोड को अपनी समझ के अनुसार कोड लिखने / विकसित करने के बजाय BDD ढांचे में लिखे गए परिदृश्यों के अनुरूप लिखेंगे।
# 4) परीक्षण तेज हो जाता है, निर्माण में लगने वाला समय और परीक्षण के बाद के निष्पादन को बचाया जाता है, विशेष रूप से महत्वपूर्ण दोषों को बचाया जाता है, जो व्यवसाय को प्रभावित कर सकता है जो सामने के अंत में पाया जा सकता है।
# 5) कोड, बीडीडी से संबंधित प्रलेखन आसानी से समझ में आता है और बनाए रखा जाता है क्योंकि कोड को बनाए रखने के लिए किसी अन्य प्रयास की आवश्यकता नहीं होती है क्योंकि दस्तावेज और इसके संबंधित कोड पहले से ही संबंधित हैं। इसलिए दस्तावेज़ीकरण यानी परिदृश्यों में जो उल्लेख किया गया है, उसका एक ही कोड होगा।
# 6) चूंकि हमारे पास बहुत आसान समझने योग्य परिदृश्य हैं, इसलिए हम उन्हें तार्किक तरीके से कार्यों, उप-कार्यों आदि में आसानी से तोड़ सकते हैं।
# 7) टीम अधिक गतिशील, चुस्त हो सकती है क्योंकि परिदृश्यों, स्वीकृति मानदंडों और लगभग सटीक परीक्षण अनुमान के बारे में एक स्पष्ट स्पष्टता है।
# 8) न्यू के लिए बहुत अच्छा प्लेटफ़ॉर्म प्रलेखन और कोड की सादगी के कारण मौजूदा टीम के साथ जुड़ने के लिए तैयार है।
# 9) न केवल परिदृश्यों को सत्यापित करने में मदद करता है (ज्यादातर यूआई, व्यवहार-संबंधी), बल्कि यह इकाई-स्तरीय परीक्षण मामलों में भी मदद करता है।
# 10) इसके अलावा, टीम की प्रगति को पहले दिन से ट्रैक करना उपयोगी है क्योंकि आवश्यकताओं और परिदृश्यों को स्पष्ट रूप से परिभाषित किया जाता है (कुछ ऐसा जो डेवलपर्स आमतौर पर टीडीडी में इकट्ठा करने के लिए संघर्ष करते हैं)।
इसलिए बीडीडी का कार्यान्वयन इस धारणा को दूर करता है कि 'अंतिम ग्राहक परीक्षण के महत्व के बारे में नहीं सोचता है', 'ग्राहक खुद को परीक्षण गतिविधियों में शामिल नहीं करना चाहता', आदि।
BDD उपकरण
कई परीक्षण उपकरण हैं जो हमें BDD दृष्टिकोण को लागू करने में सक्षम बनाते हैं।
जैसे कि:
- खीरा
- SpecFlow
- जब्बेवे
- सलाद
- सामंजस्य
- फिटनैस
- बीनस्पेक
- आसान बी
- जदवे
- Givwenzen- फ्लेक्स
- GivWenZen
- स्वाभाविक
- गिलास-गिलास
- Gospecify
- बहुत शानदार
- dSpec
- ऐनक
- स्टेक
- JSSpec
उपरोक्त उपकरणों के बीच, जेहेववे ककड़ी के समान काम करते हैं, हालांकि, ये उनके कार्यान्वयन के संदर्भ में थोड़ा अलग हैं।
JBEHAVE | खीरा |
---|---|
बाहरी डेटा स्रोतों का समर्थन करता है | यह बाहरी डेटा स्रोतों का समर्थन नहीं करता है |
कहानियों का समर्थन करता है | सुविधाओं का समर्थन करता है |
बहुत अच्छा प्रलेखन | कोई मानक प्रलेखन नहीं |
समग्र कदमों का समर्थन करता है | समग्र चरणों का समर्थन नहीं करता है |
इतना लचीला नहीं है | गुजर मापदंडों में लचीला |
पृष्ठभूमि का समर्थन नहीं करता है | पृष्ठभूमि का समर्थन करता है |
इतनी व्यापक रिपोर्ट नहीं | बेहतर स्वरूपण लचीलापन, अंतर्निहित रिपोर्ट |
जावा का उपयोग करके विकसित | रूबी का उपयोग कर विकसित |
खीरा क्यों?
खीरे का उपयोग सभी प्रकार के परीक्षण मामलों को लिखने के लिए किया जाता है, विशेष रूप से स्वीकृति स्तर परीक्षण मामलों (जिसके बारे में अंत उपयोगकर्ता अधिक चिंतित हैं) को व्यवहार चालित विकास शैली में लिखा जाता है। यह गेरकिन जैसे भाषा पार्सर्स के उपयोग का समर्थन करता है।
मूल रूप से, ककड़ी को रूबी प्रोग्रामिंग भाषा का उपयोग करते हुए लिखा गया था और विशेष रूप से रूबी परीक्षण के लिए विकसित किया गया था। लेकिन अब, यह जावा जैसी अन्य प्रोग्रामिंग भाषाओं द्वारा समर्थित किया जा रहा है।
गेरकिन का उपयोग उस भाषा के रूप में किया जा रहा है जिसमें परीक्षण के मामलों को एक सरल प्रारूप में लिखा गया है और इसे गैर-तकनीकी उपयोगकर्ता द्वारा पढ़ा और संशोधित भी किया जा सकता है।
अंग्रेजी के अलावा, ककड़ी अन्य भाषाओं का भी समर्थन करती है।
ककड़ी कैसे काम करती है?
इसकी कार्य प्रणाली पर आते हुए, सबसे पहले, हम उपयोगकर्ताओं (तकनीकी / गैर-तकनीकी) को उनके वांछित परीक्षण मामलों (जैसे फीचर्स) को Gherkin सिंटैक्स का उपयोग करते हुए लिखते हैं, एक बार जब हमें यह सुनिश्चित करने की आवश्यकता होती है कि उन्हें अनुमोदित किया जाए ताकि वे जा सकें अगला स्तर।
उसके बाद, हमें लागू करने की आवश्यकता है यानी फीचर फ़ाइल में वर्णित प्रत्येक पंक्ति के लिए स्क्रिप्ट (एक स्टेपडेफ़ फ़ाइल का उपयोग करके) लिखें। एक बार कोड लागू हो जाने के बाद, अगली बात स्क्रिप्ट को चलाने के लिए होगी (एक रनर फ़ाइल का उपयोग करके)।
पर्यावरणीय सेटअप
किसी भी अन्य उपकरण जैसे एक्लिप्स या किसी अन्य आईडीई के साथ काम करने की तुलना में ककड़ी के लिए पर्यावरण सेटअप थोड़ा जटिल है।
चुनौतियों
हमें यह सुनिश्चित करने की आवश्यकता है कि ककड़ी जार के संस्करण स्थापित जावा संस्करण के साथ-साथ उस आईडीई से मेल खाते हैं जिसमें हम वर्तमान में काम कर रहे हैं।
पर्यावरण सेटिंग्स
# 1) Cucumber Plugin ग्रहण करें : यह ग्रहण को गेरकिन सिंटैक्स को समझने में मदद करता है और फ़ीचर फ़ाइल के सिंटैक्स को एक सादे पाठ के बजाय हाइलाइट करता है।
हमें जाने की जरूरत है ग्रहण >> मदद >> नया सॉफ्टवेयर स्थापित करें >> ऐड बटन पर क्लिक करें >> स्थान निर्दिष्ट करें जैसा यह । नाम कहता है 'ककड़ी' और फिर ठीक पर क्लिक करें और बाकी स्थापना प्रक्रिया का पालन करें।
आखिरी में अपना आईडीई यानी ग्रहण शुरू करें।
#दो) नीचे बताए अनुसार सभी जार यानी निर्भरता, प्लगइन्स आदि के लिए मावेन का उपयोग करें।
4.0.0 com cucumber.example 0.0.1-SNAPSHOT jar cucumber.example http://maven.apache.org UTF-8 org.seleniumhq.selenium selenium-java 3.6.0 org.seleniumhq.selenium selenium-chrome-driver 3.6.0 info.cukes cucumber-core 1.2.5 info.cukes cucumber-java 1.2.5 test info.cukes cucumber-junit 1.2.5 test junit junit 4.11 test info.cukes cucumber-testng 1.2.0 info.cukes gherkin 2.12.2 provided log4j log4j 1.2.17 org.apache.poi poi-ooxml 3.9 org.apache.poi poi 3.11-beta3 xml-apis xml-apis 2.0.2 xerces xercesImpl 2.8.0 info.cukes cucumber-jvm-deps 1.0.5 provided org.apache.maven.plugins maven-surefire-plugin 2.18 org.apache.maven.surefire surefire-junit47 2.18
# 3) सुनिश्चित करें कि हम या तो Ctrl + s करते हैं या मावेन इंस्टॉल करते हैं।
# 4) उसके बाद किसी भी निर्भरता संबंधित त्रुटि से बचने के लिए मावेन बिल्ड का प्रदर्शन करना सुनिश्चित करें ताकि बाद में हमारे पास कोई निर्भरता, प्लगइन, संस्करण बेमेल त्रुटि न हो।
मुफ्त सॉफ्टवेयर में घड़ी घड़ी
# 5) एक बार उपरोक्त चरणों को पूरा करने के बाद हमारा पर्यावरण तैयार है।
ककड़ी का उपयोग करके टेस्ट केस लिखना
ककड़ी में निम्नलिखित तीन फाइलें शामिल हैं:
- फ़ीचर फ़ाइल: यहां हम Gherkin प्रारूप में परीक्षण किए जाने वाले फीचर्स को लिखते हैं, अर्थात जब तब। हम स्टेपडेफ फाइल में लिखी गई टेस्ट स्क्रिप्ट को निष्पादित करने के लिए फीचर फाइल भी चला सकते हैं।
- Stepdef फ़ाइल: एक बार फ़ीचर फ़ाइल तैयार हो जाने पर, फ़ीचर फ़ाइल के प्रत्येक वाक्य को Stepdef फ़ाइल पर और लागू किया जा सकता है।
- धावक फ़ाइल: यह केवल फ़ीचर फ़ाइल के संदर्भ में Stepdef फ़ाइल पर लिखी गई वास्तविक परीक्षण स्क्रिप्ट को निष्पादित करने के लिए है। इसके अलावा, इसके पास अनुकूलन, रिपोर्टिंग, चयनात्मक निष्पादन आदि के लिए कई अन्य विकल्प हैं।
यहाँ एक रनर फ़ाइल का एक सरल उदाहरण है
package runner; import org.junit.runner.RunWith; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) @CucumberOptions( features='Features', glue='com.Multi', plugin={'html:target/cucumber-html-report', 'json:target/cucumber.json', 'pretty:target/cucumber-pretty.txt','usage:target/cucumber-usage.json', 'junit:target/cucumber- results.xml'}, dryRun = false, monochrome = true, tags={'@Smoke,@Regression'} ) public class Runner { }
ककड़ी के लिए फाइलें बनाना
- Stepdef फ़ाइल - Src / परीक्षण / जावा >> नया >> अन्य >> ककड़ी >> StepDef वर्ग।
- फ़ीचर फ़ाइल - प्रोजेक्ट >> नया >> फाइल >> एक्सटेंशन के साथ फाइल के लिए नाम निर्दिष्ट करें '.feature'।
- रनर फाइल - यह किसी भी अन्य जावा वर्ग निर्माण के समान है लेकिन हमें यहां कुछ विधि लागू करने की आवश्यकता हो सकती है।
ककड़ी सुविधाएँ
यहां खीरे की कुछ बुनियादी विशेषताएं दी गई हैं, जिन्हें हम अपनी टेस्ट स्क्रिप्ट में लागू करेंगे।
(1) ककड़ी के हुक
ये कोड के ब्लॉक हैं जो प्रत्येक परिदृश्य से पहले या बाद में चलते हैं। ताकि हम अपनी परियोजना में कहीं भी, इन्हें परिभाषित कर सकें। उदाहरण के लिए, स्टेप डेफिनिशन।
परिभाषा के अनुसार, ये केवल दो एनोटेशन @After और @Before हैं। कंसोल में, हम ब्लॉक को निष्पादित करते हुए और स्पष्ट आउटपुट देते हुए देख सकते हैं। हम विशिष्ट टैग के लिए हुक भी निष्पादित कर सकते हैं।
# 2) ककड़ी टैग
ये आम तौर पर फीचर फाइल पर उनके दिए गए टैग नाम के अनुसार फीचर फाइलों पर परिदृश्यों को वर्गीकृत करने के लिए उपयोग किया जाता है। फ़ीचर फ़ाइल में दिए गए परिदृश्य के लिए हमारे पास कई टैग हो सकते हैं।
टैग उपयोगकर्ता-परिभाषित हैं और हम इसे कोई भी नाम दे सकते हैं जैसे @Smoke, @Regression, आदि।
# 3) ककड़ी एनोटेशन
ये ककड़ी के लिए इनबिल्ट हैं। आम तौर पर टैग @Given, @When, @Then हैं।
हालाँकि, बाद में अगर हमें जरूरत है तो हम अपना एनोटेशन बना सकते हैं और फिर अपने प्रोग्राम में इसका उपयोग कर सकते हैं। निष्पादन के दौरान, मिलान गोंद कोड यानी फ़ंक्शंस एक Stepdef फ़ाइल में लिखे होते हैं जिसमें @Given, @When, @Then निष्पादित होता है।
# 4) ककड़ी पृष्ठभूमि
ये चरण या चरण हैं जो फ़ीचर फ़ाइल के सभी परिदृश्यों के लिए सामान्य हैं।
यह हमें एक सुविधा के लिए परिदृश्यों में कुछ संदर्भ जोड़ने की अनुमति देता है जहां इसे परिभाषित किया गया है। यह प्रत्येक परिदृश्य से पहले एक विशेषता के लिए चलता है जिसमें इसे परिभाषित किया गया है।
# 5) ककड़ी डेटा टेबल्स
ककड़ी में डेटा-संचालित परीक्षण का समर्थन करने की सुविधा है, जो हमें दिए गए स्क्रिप्ट के लिए अलग-अलग इनपुट और सत्यापन मूल्यों के साथ कई बार स्वचालित रूप से एक परीक्षण मामले को चलाने की अनुमति देता है।
ककड़ी डेटा टेबल का समर्थन करती है। पहली पंक्ति को स्तंभ माना जाता है और उसके आगे की पंक्तियाँ लिपियों के लिए डेटा होती हैं।
# 6) ककड़ी संक्रमण
यह ककड़ी डेटा टेबल के लिए एक मामूली संशोधन है। यहां पहले कॉलम को कॉलम माना जाएगा और इसके बाद वाले कॉलम को स्क्रिप्ट्स के लिए डेटा माना जाएगा।
# 7) ककड़ी मल्टी परिदृश्य
खीरा हमें एक फीचर फाइल के तहत कई परिदृश्यों का परीक्षण करने की अनुमति देता है।
# 8) ककड़ी रिपोर्टिंग
रिपोर्टिंग और अन्य तृतीय-पक्ष टूल के विपरीत, जहां हमें रिपोर्टिंग को देखने के लिए कुछ कॉन्फ़िगरेशन करने की आवश्यकता होती है।
यहां खीरे में, हमारे पास सुंदर, JSON, HTML, XML जैसे प्लगइन्स हैं जो हमें परीक्षण निष्पादन की व्यापक रिपोर्ट देते हैं।
ककड़ी के साथ टेस्टएनजी
हम अभी भी Cucumber में TestNG का उपयोग करके लिखे गए JUnit परीक्षण मामलों को निष्पादित कर सकते हैं अनुगमन करते हुए:
- हमें मावेन परियोजना पर निर्भरता को जोड़ना होगा।
- रनर क्लास में AbstractTestNGCucumberTests पैकेज रनर के रूप में क्लास बढ़ाएँ।
- मावेन प्रोजेक्ट में कनवर्ट करें और पैकेज जोड़ें (जहां धावक वर्ग मौजूद है)।
उसके बाद, हम पूरे ककड़ी परीक्षण मामले को TestNG के रूप में चला सकते हैं और उसी से संबंधित रिपोर्ट उत्पन्न कर सकते हैं (यदि हमारे पास श्रोता हैं)।
इस ट्यूटोरियल में, हम उपरोक्त अवधारणाओं को कवर करने के लिए 3 अलग-अलग ककड़ी उदाहरणों पर चर्चा करेंगे
उदाहरण 1
यह ककड़ी के साथ हुक, टैग, एनोटेशन, पृष्ठभूमि, कई परिदृश्य और TestNG को कवर करेगा।
एक बार टेस्ट पर्यावरण सेटअप होने के बाद:
- ग्रहण में एक्लिप्स ककड़ी प्लगइन जोड़ें।
- एक मावेन परियोजना बनाएं और इसमें सभी आवश्यक निर्भरताएं जोड़ें और मावेन में टेस्टएनजी से संबंधित निर्भरता भी जोड़ें।
- एक नई सुविधा फ़ाइल बनाएँ।
- Stepdef फ़ाइल में इसके लिए आवश्यक कार्यान्वयन जोड़ें।
- अब AbstractTestNGCucumberTests फैली हुई एक रनर फ़ाइल बनाएँ।
- Maven प्रोजेक्ट को TestNG में बदलें और testng.xml में ककड़ी धावक वर्ग का पैकेज पथ जोड़ें।
- TestNG.xml फ़ाइल चलाएँ।
फ़ीचर फ़ाइल
फ़ीचर:
एक उपयोगकर्ता के रूप में
मैं सिस्टम में नए क्लाइंट जोड़ना चाहता हूं
ताकि मैं उस ग्राहक के लिए लेखांकन डेटा जोड़ सकूं
पृष्ठभूमि:
यह देखते हुए कि मैं जीथब होम पेज पर हूं
जब मैं उपयोगकर्ता नाम 'xxxxxxxxxxxxxxxxxxxx' और पासवर्ड 'xxx' के रूप में निर्दिष्ट करता हूं
और SignIn बटन पर क्लिक करें
@ सोमोके
परिदृश्य: प्रोफ़ाइल का संपादन
यह देखते हुए कि मैं आपके प्रोफाइल विकल्प पर क्लिक करता हूँ
जब मैं एडिट प्रोफाइल बटन पर क्लिक करता हूँ
और नई तस्वीर अपलोड की है
फिर मुझे नई प्रोफ़ाइल तस्वीर देखनी चाहिए
@Regression @Everytime
परिदृश्य: नई जिस्ट बनाएं
यह देखते हुए मैं आपके जिस्ट विकल्प पर क्लिक करता हूं
जब मैं फ़ाइल नाम, विवरण प्रदान करता हूं
और Create public gist मेथड पर क्लिक करें
तब मुझे नया जिन्न देखना चाहिए
Stepdef फ़ाइल
package com.Multi; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.But; import java.util.List; import cucumber.api.PendingException; import cucumber.api.java.it.Data; import cucumber.runtime.ScenarioImpl; import gherkin.formatter.model.Scenario; import gherkin.formatter.model.ScenarioOutline; import cucumber.api.DataTable; import org.junit.Assert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.cli.Main; public class Step2 { static public String sb; static public String sa; static WebDriver driver = null; @Before('@Smoke,@Regression') public void beforeScenario(){ System.out.println('New scenario begins'); } @After('@Smoke,@Regression') public void afterScenario(){ System.out.println('Scenario ends'); } @MyAnnotation public static void myanno() { System.out.println('my annot gets executed'); } @Given('^I am on Github home page$') public void i_am_on_Github_home_page(){ String site = 'https://www.github.com/login'; System.setProperty('webdriver.chrome.driver', 'Executables\chromedriver.exe'); driver = new ChromeDriver(); driver.navigate().to(site); //driver.findElement(By.cssSelector('a(contains(@href, 'login'))').click(); // Write code here that turns the phrase above into concrete actions } @When('^I specify Username as '((^')*)' and Password as '((^')*)'$') public void i_specify_Username_as_and_Password_as(String arg1, String arg2){ driver.findElement(By.cssSelector('input#login_field')).sendKeys(arg1); driver.findElement(By.cssSelector('input#password')).sendKeys(arg2); // Write code here that turns the phrase above into concrete actions } @When('^Click on SignIn button$') public void click_on_SignIn_button(){ driver.findElement(By.cssSelector('input.btn')).click(); // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Profile option$') public void i_click_on_Your_Profile_option(){ driver.findElement(By.xpath('//*(@id='user -links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id= 'user-links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your profile')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I click on edit profile button$') public void i_click_on_edit_profile_button(){ driver.findElement(By.xpath('//*(@id='js-pjax -container')/div/div(2)/div(1)/a')).click(); // Write code here that turns the phrase above into concrete actions } @When('^Uploaded new picture$') public void uploaded_new_picture() throws InterruptedException{ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload -container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); driver.findElement(By.id('upload-profile -picture')).sendKeys('D://cucumberFinal//multiple//Files//images.jpg'); Thread.sleep(10000); String wh = driver.getWindowHandle(); driver.switchTo().window(wh); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//div(@class='facebox -content')/form/div(3)/button')); Thread.sleep(10000); actions.moveToElement(element); //Thread.sleep(10000); actions.click(); //actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//div(@class='facebox -content')/form/div(3)/button')).click(); Thread.sleep(3000); // Write code here that turns the phrase above into concrete actions } @Then('^I should be seeing new profile picture$') public void i_should_be_seeing_new_profile_picture(){ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload -container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); if(!(sb.equals(sa))) { Assert.assertTrue('File Upload successful', true); } // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Gists option$') public void i_click_on_Your_Gists_option(){ driver.findElement(By.xpath('//*(@id='user-links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id= 'user-links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your Gists')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I provide filename, description$') public void i_provide_filename_description() throws InterruptedException { // Write code here that turns the phrase above into concrete actions driver.findElement(By.xpath('//div(@class='edit container')/div(@id='gists')/input')).sendKeys('Gist1'); Thread.sleep(2000); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1)/ div/div/div/div(5)/div/pre/span')); actions.moveToElement(element); actions.click(); actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1)/ div/div/div/div(5)/div/pre/span')).sendKeys('GIST1 Description'); Thread.sleep(2000); } @When('^click on Create public gist method$') public void click_on_Create_public_gist_method() { driver.findElement(By.xpath('//*(@id='new_gist')/div(2)/div(2)/button(1)')).click(); // Write code here that turns the phrase above into concrete actions } @Then('^i should be seeing the new gist$') public void i_should_be_seeing_the_new_gist(){ List glist = driver.findElements(By.xpath('//div(@class='container repohead-details- container')/ul(1)/li(@class='flex-auto')/div/a')); for(WebElement o:glist) { if(o.getText().equals('Gist1')) { System.out.println('Gist created successfully'); } } // Write code here that turns the phrase above into concrete actions } }
यहां TestNG XML का टेस्ट रिजल्ट दिया गया है
डिफ़ॉल्ट TestNG रिपोर्ट नीचे दी गई की तरह दिखती है।
उदाहरण 2
यह डेटा टेबल को कवर करेगा और स्थानांतरित करेगा।
एक बार पर्यावरण सेटअप है:
- ग्रहण में एक्लिप्स ककड़ी प्लगइन जोड़ें।
- एक मावेन परियोजना बनाएं और इसमें सभी आवश्यक निर्भरताएं जोड़ें।
- एक नई सुविधा फ़ाइल बनाएँ।
- चरणबद्ध फ़ाइल में इसके लिए आवश्यक कार्यान्वयन जोड़ें।
- फ़ाइल पर राइट-क्लिक करके फ़ीचर फ़ाइल से सीधे निष्पादित करें >> Cucumber.feature के रूप में चलाएँ
फ़ीचर फ़ाइल
फ़ीचर: अपनी सुविधा का शीर्षक
मैं अपनी सुविधा फ़ाइल के लिए इस टेम्पलेट का उपयोग करना चाहता हूं
पृष्ठभूमि:
यह देखते हुए कि मैं जीमेल लॉगइन पेज पर हूं
जब मैं यूजरनेम और पासवर्ड निर्दिष्ट करता हूं
और SignIn बटन पर क्लिक करें
परिदृश्य: डेटा टेबल से नया संदेश बनाएं
जब मैं New Email Page पर हूँ
और मैं निम्नलिखित विवरण निर्दिष्ट करता हूं
| To1 | विषय |
| Person1@email.com | व्यक्ति 1 विषय |
| Person2@email.com | व्यक्ति 2 विषय |
परिदृश्य: ट्रांसपोज़्ड डेटा टेबल से नया संदेश बनाएं
जब मैं New Email Page पर हूँ
और मैं ट्रांज़ोज़ टेबल से निम्नलिखित विवरण निर्दिष्ट करता हूं
| To1 | Person1@email.com | Person2@email.com |
| विषय | व्यक्ति 1 विषय | व्यक्ति 2 विषय |
Stepdef फ़ाइल
package com.datatable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.time.*; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.DataTable; import cucumber.api.Transpose; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import gherkin.formatter.model.Examples; import cucumber.runtime.CucumberException; import cucumber.runtime.ParameterInfo; import cucumber.runtime.xstream.LocalizedXStreams; public class Step3 { static public WebDriver driver; @Given('^I am on Gmail login page$') public void i_am_on_Gmail_login_page() throws InterruptedException{ System.setProperty('webdriver.chrome.driver', 'Executables/chromedriver.exe'); driver= new ChromeDriver(); Actions act = new Actions(driver); driver.manage().window().maximize(); driver.navigate().to('https://www.google.com/gmail/about'); driver.findElement(By.xpath('//nav/div/a(2)')).click(); Thread.sleep(3000); } @When('^I specify Username and Password$') public void i_specify_Username_and_Password() throws InterruptedException{ driver.findElement(By.xpath('//input(@type='email')')).sendKeys('xxxxxx@xxx. com'); driver.findElement(By.xpath('//*(@id='identifierNext')/content/span')).click(); Thread.sleep(3000); driver.findElement(By.xpath('//input(@type='password')')).sendKeys('xxxxxxxx xxx'); } @When('^Click on SignIn button$') public void click_on_SignIn_button() throws InterruptedException{ driver.findElement(By.xpath('//*(@id='passwordNext')/content/span')).click(); Thread.sleep(5000); } @When('^I am on New Email Page$') public void i_am_on_New_Email_Page(){ } @When('^I specify following details$') public void i_specify_following_details(DataTable tables)throws Throwable{ for (Map row : tables.asMaps(String.class, String.class)) { driver.findElement(By.xpath('//*(@id=':x4')/div/div')).click(); //driver.switchTo(). System.out.println(row.get('To1')); System.out.println(row.get('Subject')); String whandle = driver.getWindowHandle(); driver.switchTo().window(whandle); driver.findElement(By.xpath('//td(@class='eV')/div(1)/div/textarea')).sendKeys (row.get('To1')); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).sendKeys(row.get('Subject')); driver.findElement(By.xpath('//table(@class='IZ')/tbody/tr/td/div')).click(); Thread.sleep(3000); } } @When('^I specify following details from transpose table$') public void i_specify_following_details_from_transpose_table(DataTable tables) throws InterruptedException { // DataTable tables = null; for (Map row : tables.transpose().asMaps(String.class, String.class)) { driver.findElement(By.xpath('//*(@id=':x4')/div/div')).click(); //driver.switchTo(). Thread.sleep(2000); System.out.println(row.get('To1')); System.out.println(row.get('Subject')); String whandle = driver.getWindowHandle(); driver.switchTo().window(whandle); driver.findElement(By.xpath('//td(@class='eV')/div(1)/div/textarea')).sendKeys (row.get('To1')); Thread.sleep(3000); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).click(); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).sendKeys(row.get('Subject')); Thread.sleep(3000); driver.findElement(By.xpath('//table(@class='IZ')/tbody/tr/td/div')).click(); Thread.sleep(3000); } } @When('^then click on Send button$') public void then_click_on_Send_button(){ // Write code here that turns the phrase above into concrete actions } @Then('^I should be able to send the email successfully$') public void i_should_be_able_to_send_the_email_successfully() { // Write code here that turns the phrase above into concrete actions }
उत्पादन : तो उपरोक्त उदाहरण जीमेल में लॉग इन करेगा और प्रत्येक परिदृश्य के लिए दो ईमेल भेजेगा जो डेटा टेबल और ट्रांसपोज़्ड डेटा टेबल के लिए है।
उदाहरण 3
यह रिपोर्टिंग को कवर करेगा।
एक बार पर्यावरण सेटअप है:
- ग्रहण में एक्लिप्स ककड़ी प्लगइन जोड़ें।
- मावेन परियोजना बनाएं और इसमें सभी आवश्यक निर्भरताएं जोड़ें।
- एक नई सुविधा फ़ाइल बनाएँ।
- Stepdef फ़ाइल में इसके लिए आवश्यक कार्यान्वयन जोड़ें।
- एक धावक वर्ग बनाएं और धावक वर्ग को निष्पादित करें।
- सभी प्रकार की रिपोर्ट देखें।
फ़ीचर फ़ाइल
फ़ीचर: अपनी सुविधा का शीर्षक
मैं अपनी सुविधा फ़ाइल के लिए इस टेम्पलेट का उपयोग करना चाहता हूं
@ टैग 1
परिदृश्य: अपने परिदृश्य का शीर्षक
यह देखते हुए कि मैं जीथब होम पेज पर हूं
जब मैं यूजरनेम और पासवर्ड निर्दिष्ट करता हूं
और SignIn बटन पर क्लिक करें
तब मुझे लॉगआउट विकल्प देखने में सक्षम होना चाहिए
Stepdef फ़ाइल
package com.cucumber; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.en.But; import java.util.List; import cucumber.api.PendingException; import cucumber.api.java.it.Data; import cucumber.api.DataTable; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import cucumber.api.cli.Main; public class Step1 { static WebDriver driver = null; @Given('^I am on Github home page$') public void i_am_on_Github_home_page(){ String site = 'https://www.github.com/login'; System.setProperty('webdriver.chrome.driver', 'Executables\chromedriver.exe'); driver = new ChromeDriver(); driver.navigate().to(site); //driver.findElement(By.cssSelector('a(contains(@href, 'login'))').click(); // Write code here that turns the phrase above into concrete actions } @When('^I specify Username and Password$') public void i_specify_Username_and_Password() { driver.findElement(By.cssSelector('input#login_field')).sendKeys('chintamoni .patra@gmail.com'); driver.findElement(By.cssSelector('input#password')).sendKeys('Test@123'); // Write code here that turns the phrase above into concrete actions } @When('^Click on SignIn button$') public void click_on_SignIn_button(){ driver.findElement(By.cssSelector('input.btn')).click(); // Write code here that turns the phrase above into concrete actions } @Then('^I should be able to see logout option$') public void I_should_be_able_to_see_logout_option() throws InterruptedException{ driver.findElement(By.xpath('//*(@id='user -links')/li(3)/details/summary/img')).click(); WebElement opt = driver.findElement(By.xpath('//*(@id='user- links')/li(3)/details/ul/li')); List olist = opt.findElements(By.xpath('//li/form/button')); for(WebElement o : olist) { System.out.println(o); } //int a = olist.size(); System.out.println(olist.get(0).getText()); olist.get(0).click(); Thread.sleep(2000); // Write code here that turns the phrase above into concrete actions } }
यहां विभिन्न प्रकार की रिपोर्टें हैं जो ककड़ी द्वारा बनाई गई हैं:
HTML रिपोर्ट
सुंदर
JUnit
निष्कर्ष
एक ओपन-सोर्स टूल होने के नाते, ककड़ी का व्यापक रूप से बीडीडी में उपयोग किया जाता है। और यह समझना बहुत आसान है और इसमें नई विशेषताओं के संबंध में बहुत गुंजाइश है और सेल्युनिअम या किसी अन्य तीसरे पक्ष के उपकरण / जार आदि के साथ ककड़ी को एकीकृत करना व्यावहारिक रूप से संभव है।
जैसा कि इसमें सक्रिय सहायता समूह / सदस्य हैं, यह वास्तव में किसी के लिए भी आसान हो जाता है, जिसने अभी-अभी ककड़ी सीखना शुरू किया है या उन लोगों के लिए जो ककड़ी / बीडीडी में मध्यवर्ती ज्ञान रखते हैं।
खीरा आगे एक्सेल शीट और जेनकिंस के साथ एकीकरण का समर्थन करता है।
अनुशंसित पाठ
- ककड़ी सेलेनियम ट्यूटोरियल: ककड़ी जावा सेलेनियम वेबड्राइवर एकीकरण
- उदाहरणों के साथ अजगर डेटाइम ट्यूटोरियल
- बीडीडी दृष्टिकोण का उपयोग करके ककड़ी के साथ रीस्ट एपीआई परीक्षण
- ककड़ी उपकरण और सेलेनियम का उपयोग करके स्वचालन परीक्षण - सेलेनियम ट्यूटोरियल # 30
- ककड़ी गेरकिन ट्यूटोरियल: ऑटोमेशन टेस्टिंग गेरकिन का उपयोग करना
- उदाहरणों के साथ यूनिक्स शैल स्क्रिप्टिंग ट्यूटोरियल
- सेलेनियम उदाहरणों के साथ पाठ ट्यूटोरियल द्वारा तत्व का पता लगाएं
- जावा 'यह' कीवर्ड: कोड उदाहरण के साथ ट्यूटोरियल