2014-10-15 6 views
22

टेस्ट स्वचालन के पृष्ठ ऑब्जेक्ट मॉडल के साथ हम पृष्ठों को एक साथ लिंक इस तरह:पृष्ठ ऑब्जेक्ट मॉडल क्यूम्बर के गेरकिन के साथ संगत लिंकिंग है?

WebDriver driver = new WebDriver() 
HomePage homePage = new HomePage(driver); 
LoginPage loginPage = homePage.GoToLoginPage(); 
WelcomePage welcomePage = loginPage.Login(); 
etc 
etc 

इस बात का बड़ा लाभ है, तो Devs मुखपृष्ठ जिससे अब वह loginpage के लिए लिंक बदलने के लिए, मैंने अपने मुखपृष्ठ वर्ग को अद्यतन करने और कर सकते हैं परीक्षण चलाने से पहले मुझे अपडेट करने के लिए आवश्यक सभी परीक्षणों (त्रुटियों के साथ) देखें।

हालांकि गेरकिन के साथ, प्रत्येक पंक्ति ऊपर एक अलग 'चरण' और इसलिए एक अलग विधि बनाती है। इसलिए, यह लिंक कैसे किया जा सकता है?

पृष्ठ ऑब्जेक्ट क्लास (उदा। होमपेज, लॉगिनपेज, आदि) के उदाहरणों को एक क्रॉस गेरकिन स्टेटमेंट लगातार स्टोर (उदाहरण के लिए एक स्पेकफ़्लो पॉको या 'वर्ल्ड') में रखने का एकमात्र तरीका है?

+1

शायद यह अच्छा [पोस्ट] (http://thomassundberg.wordpress.com/2011/10/18/testing-a-web-plication-with-selenium-2/) आपकी मदद कर सकता है। – troig

+0

यह एक महान पोस्ट है। केवल मामूली चिंता यह है कि चरणों के बीच पारित पृष्ठ वस्तुओं के उदाहरण तब नहीं रहेंगे जब कई चरण वर्गों का उपयोग किया जाता था। दुनिया/ओओटीबी निर्भरता इंजेक्शन का उपयोग करने से यह हल हो जाता है लेकिन कोड को पृष्ठ के साथ काफी शब्द मिल जाता है पृष्ठ प्रत्येक पृष्ठ ऑब्जेक्ट उदाहरण के सामने। –

उत्तर

4

ठीक है इसलिए कई देव और परीक्षण स्वचालन विशेषज्ञों से पूछा गया है, ऐसा लगता है कि [e.g. WelcomePage welcomePage = loginPage.loginWithValidUser(validUser)] को जोड़ने के साथ समाधान जारी रखना है।

चरणों में पेज ऑब्जेक्ट्स का उदाहरण जारी रखने के लिए (उदाहरण के लिए ऊपर उदाहरण में स्वागत पृष्ठ) आप निर्भरता इंजेक्शन टूल (रूबी के ककड़ी के कार्यान्वयन में विश्व एक्सटेंशन के समान कार्यक्षमता) का उपयोग कर सकते हैं। https://cukes.info/docs/reference/java-di

हालांकि, ज्यादातर परियोजनाओं एक निर्भरता इंजेक्शन मॉड्यूल से लाभ होगा अपने कोड बेहतर व्यवस्थित करने के लिए और कदम परिभाषाएँ के बीच स्थिति साझा:

यहाँ और अधिक जानकारी है। SpecFlow से

अधिक जानकारी (.net आधिकारिक ककड़ी कार्यान्वयन):

http://specflow.org/getting-started/beyond-the-basics/

और अंत में, मैं इस क्षेत्र है कि लोगों को बाहर मदद कर सकता है चारों ओर एक पूरे ब्लॉग बनाया है, के बाद से खीरा/पेज एक समान रूप से Plau इस विषय पर

http://www.seligmanventures.com/dev-blog/test-automation-page-object-model-with-gherkin

+1

मैंने जो किया है वह मैंने किया है और मैं वास्तव में इसकी अनुशंसा नहीं करता हूं। जब आप नेविगेशन बदलते हैं तो यह आपको त्रुटियों को संकलित करता है, लेकिन समस्या यह है कि आप क्या होता है ('मैं स्वागत पृष्ठ पर समाप्त होता हूं) के बारे में एक दावा के साथ एक क्रिया (जैसे लॉगिन) मिश्रण कर रहा हूं। यह चीजों का परीक्षण करने के लिए बदसूरत बनाता है जैसे कि जब आप अपना पासवर्ड गलत करते हैं तो क्या होता है - आप लॉगिनपेज लॉगिन पेज = loginPage.loginButExpectError() जैसी चीजें करने के लिए समाप्त होते हैं। यह सिर्फ तेजी से गन्दा हो जाता है। –

+1

आजकल मैं इसके बजाय क्या करता हूं, क्या मैं कार्रवाई को अलग करता हूं, और कार्रवाई पूरी होने पर मुझे कहां होना चाहिए। LoginPage.login() की तरह कुछ; WelcomePage welcomePage = onPage (WelcomePage.class); –

+0

पेरीन मैं सुनता हूं कि आप अमान्य लॉग इन के बारे में क्या कह रहे हैं, लेकिन यह अतिरिक्त विधियों को जोड़कर बस समाप्त हो जाता है (उदा। LoginWithValidUser() और loginWithInvalidUser())। कुल मिलाकर अतिरिक्त तरीकों से अधिक होने का लाभ उठाने का लाभ आवश्यक है। दोनों विधियों के पीछे बैठे कोड को एक निजी विधि के रूप में बाहर निकाला जा सकता है जो पृष्ठ वस्तु में चुपचाप से बाहर बैठता है। –

-2

काफी चर्चा के बाद: वस्तु बातचीत मेरे लिए बहुत रुचि का विषय है sible विकल्प gherkin के साथ पेज ऑब्जेक्ट पैटर्न का उपयोग करते समय नए पृष्ठों के उदाहरण वापस नहीं करना है। आप आमतौर पर पीओएम के साथ मिलकर जोड़ने का लाभ खो देंगे, लेकिन कोड तर्कसंगत रूप से बेहतर पढ़ा जाएगा और कम जटिल होगा। इस वैकल्पिक उत्तर को पोस्ट करना, इसलिए एक परीक्षण समुदाय के रूप में हम वोट दे सकते हैं कि कौन सी विधि लोगों की प्राथमिकता है।

+0

महसूस -2 इस उत्तर के लिए थोड़ा कठोर है। यह मेरा पसंदीदा उत्तर नहीं है, लेकिन निश्चित रूप से एक व्यवहार्य विकल्प है और जटिलता को कम करता है।कृपया 'सुधार' उत्तर –

+0

का उत्पादन करने में मदद कर सकते हैं, जो कम से कम अंक के कारण पर टिप्पणी करें, यहां पृष्ठों के माध्यम से नेविगेशन द्वारा लौटाई गई पेज ऑब्जेक्ट्स को संग्रहीत करने का एक उदाहरण दिया गया है: https://www.testautomationtribe.com/specflow-with-page -object –

+0

वास्तव में इस दृष्टिकोण को पसंद कर रहा था, खासतौर पर जब मुझे यह इंगित किया गया कि गेरकिन चरणों को स्वतंत्र संस्थाओं के रूप में कोडित किया गया है और इस प्रकार प्रासंगिक पृष्ठ वस्तु के उदाहरणों को अर्थात् बहुत अच्छी तरह से फिट किया गया है। हालांकि, इस दृष्टिकोण को लागू करने की कोशिश करने के बाद ही एहसास हुआ, मुझे लगता है कि आपको चरण स्तर पर चालक उदाहरण को उजागर करने की आवश्यकता होगी (इसे पृष्ठ वस्तुओं के भीतर encapsulated रखने के बजाय और आप उनके बीच नेविगेट के रूप में चारों ओर पारित करने के बजाय)। क्या कोई रास्ता इस बारे में सोच सकता है? –

0

जब अधिकांश वेबसाइटों (जहां यूआरएल का उपयोग किया जा सकता है) की बात आती है, तो मेरी राय में यह वही यूआरएल प्राप्त करने के लिए कार्रवाई के बजाय यूआरएल का उपयोग करने का सबसे अच्छा अभ्यास है।

उदाहरण के लिए:

# Suggested by OP: 
driver = Selenium::Webdriver.for :chrome, prefs: prefs 
homepage = Homepage.new(driver) 
login = homepage.go_to_login 
welcome = login.log_in_as('dave4429') 

# My Suggestion: 
homepage = Url.new('/') 
login = Url.new('/login') 
welcome = Url.new('/welcome') 

इसका मतलब है कि आप के बजाय हर परीक्षा के लिए मुखपृष्ठ पर शुरू करने के लिए होने का एक यूआरएल से शुरू करते हैं। आपके पास अभी भी आपके द्वारा सुझाए गए तरीके होंगे, लेकिन यह सुनिश्चित करने के लिए कि उपयोगकर्ता यूआरएल के अलावा अन्य माध्यमों के माध्यम से पृष्ठ तक पहुंच सकते हैं, अन्य क्षेत्रों में उनका उपयोग किया जाएगा।

हालांकि, यह एक स्टॉप शॉप समाधान नहीं है। मोबाइल और डेस्कटॉप अनुप्रयोगों के साथ, आपका एकमात्र विकल्प होम स्क्रीन के माध्यम से जाना पड़ सकता है, इस मामले में, जिस विधि का आपने सुझाव दिया है वह निश्चित रूप से जाने वाला है।

"पेज ऑब्जेक्ट्स को कभी भी सत्यापन या दावे नहीं करना चाहिए। यह आपके परीक्षण का हिस्सा है और हमेशा परीक्षण के कोड में होना चाहिए, कभी भी पृष्ठ वस्तु में नहीं होना चाहिए।" - Selenium HQ

उदाहरण मैं एक बहुत ही बुनियादी एक था, और मैं सबसे अधिक संभावना इस तरह कोडिंग सक्षम करने के लिए मॉड्यूल और वर्गों में इन लपेट होगा, दिया:

google = Project::Pages::Google.new 

google.search_for('Hello, World!') 
expect(google.found_result?).to_equal(true) 

संपादित

इसके अलावा, आपको एक गलत धारणा प्रतीत होती है कि कैसे ककड़ी गेरकिन के साथ काम करती है।

आपके पास प्रति चरण कोड की कई पंक्तियां हो सकती हैं, क्योंकि चरण स्वयं चरण के भीतर कार्यों का विवरण है।

उदाहरण के लिए:

Given I am logged in as "dave4429" 
When I have submitted the "Contact Us" form with the following data: 
    | [email protected] | David McBlaine | I want to find out more about your Data Protection services, can I talk to a staff member or get a PDF? | 
Then an email should be sent to "[email protected]" with the details specified 

"जब" कुछ ऐसा दिखाई देगा के लिए परिभाषा:

When(/^I have submitted the "Contact Us" form with the following data:$/) do |table| 
    rows = table.raw 
    row = rows[0] 

    contact_us.fill_form({email: row[0], username: row[1], message: row[2]}) 
    contact_us.submit_message 
    expect(browser.title).to_equal("Message Sent!") 
end 

यह सब आप कितना परिभाषा के दायरे में चरणों को तोड़ने पर निर्भर करता है।

# संपादित 2

यह भी मेरे लिए स्पष्ट है कि आप तकनीक है कि मैं का उपयोग करते समय विधि श्रृंखलन, contact_us.fill_form({email: row[0], username: row[1], message: row[2]}).submit_message का रास्ता है, जो फिर से, सवाल से बाहर नहीं है में कुछ करना चाहता हूँ एम सुझाव दे रहा है, लेकिन यह सवाल यह है कि क्या यह श्रृंखला प्रत्येक व्यक्तिगत पृष्ठ के लिए होनी चाहिए, या क्या सब कुछ एक वर्ग या मॉड्यूल में शामिल किया जाना चाहिए, केवल आपकी ज़रूरतों का उत्तर दिया जा सकता है।

यह मेरी राय है कि यह एक वर्ग में बहुत अधिक डाल देगा, और उस वर्ग को तोड़ने से टेस्टर्स को अधिक नियंत्रण दिया जा सकता है, और कम अनावश्यक कोड लिखा जाएगा।

संबंधित मुद्दे