2016-03-29 6 views
7

मैं एक विरासत वेबसाइट का परीक्षण करने के लिए परीक्षण का एक नया सेट बनाने की कोशिश कर रहा हूं जिस पर मैं काम कर रहा हूं। साइट बैक एंड पर डेटाबेस का उपयोग करती है। मैं SpecFlow और सेलेनियम का उपयोग करने की योजना बना रहा हूं, हालांकि मैं थोड़ा सा स्टंप हूं कि डेटा साफ करने से निपटने का सबसे अच्छा तरीका क्या है।एक specflow परिदृश्य teardown कैसे करें

वर्तमान में मेरे पास नमूना डेटा के एक सेट के साथ डेटाबेस बैकअप है जिसे मैं प्रत्येक परीक्षण चलाने से पहले पुनर्स्थापित करता हूं। हालांकि यह बोझिल है इसलिए मैं रिलीज से पहले महत्वपूर्ण परीक्षण रनों के लिए ऐसा करना चाहता हूं और निरंतर एकीकरण को उसी डेटाबेस पर काम करने के लिए छोड़ देता हूं।

वर्तमान में मैं परीक्षण है कि कुछ इस तरह जाना की एक बड़ी संख्या है:

Secenario: Test Item Creation 
    Given I am logged in 
    When I create an item with a unique name 
    Then an item exists with the unique name 

जब कदम सुनिश्चित करने के लिए नाम अद्वितीय है और उसके बाद चरण के लिए एक मॉड्यूल चर के माध्यम से इस तक पहुँच गया है एक GUID का उपयोग करता है जांचें कि यह मौजूद है।

जैसा कि मैंने कहा था, हालांकि मेरे पास इस तरह के कई परीक्षण हैं और मैं उन्हें एक ही डेटाबेस पर कई बार चला रहा हूं, इसलिए परीक्षण प्रणाली उन वस्तुओं से भरा हुआ हो रही है जो खोजों को धीमा कर रही हैं और इसी तरह।

मेरा सवाल यह है कि इससे निपटने का सबसे अच्छा तरीका क्या है? मैं इस तरह फिर से परीक्षण है कि आइटम को हटा देता है में एक और कदम बनाना चाहिए:

Secenario: Test Item Creation 
    Given I am logged in 
    When I create an item with a unique name 
    Then an item exists with the unique name 
    Then delete the item with the unique name 

या अपने परीक्षण ढांचा किसी भी तरह इस से निपटने के लिए सक्षम होना चाहिए? यदि ऐसा है तो लोग क्या करते हैं? स्पीकफ्लो चरण की वैश्विक प्रकृति को देखते हुए मैं कल्पना करता हूं कि सही आदेश में टियरडाउन कदम प्राप्त करना यदि माता-पिता के संबंधों के साथ कई आइटम समस्याग्रस्त हो सकते हैं।

उत्तर

6

एक अच्छे परीक्षण में कोई निर्भरता नहीं होनी चाहिए, इसलिए टेस्ट चरण बनाने और परीक्षण डेटा को "फाड़ना" एक अच्छा विचार है। जैसे ScenarioContext वस्तु में

When I create an item with a unique name 

:

एक दृष्टिकोण आप ले सकता है अद्वितीय द्वारा उत्पन्न नाम स्टोर करने के लिए है

यह आपको परिदृश्य की अवधि के लिए इस मूल्य को जारी रखने की अनुमति देगा।

फिर परिदृश्य पूरा होने पर आप इस डेटा को फाड़ने के लिए एक विशिष्ट टैग से जुड़े SpecFlow hook बना सकते हैं।

@deleteTestItem 
Secenario: Test Item Creation 
Given I am logged in 
When I create an item with a unique name 
Then an item has exists with the unique name 

और कोड साफ करने के लिए किया जाएगा:

[AfterScenario("deleteTestItem")] 
public void DeleteTestItem() 
{ 
var testItemName = ScenarioContext.Current["testItemName"]; 

// Use testItemName to clean-up your database 
} 

इस कोड को उसके बाद ही जो इस टैग है परिदृश्यों के लिए चलाया जाएगा परिदृश्य हो (टैग पर ध्यान दें) होगा। ध्यान दें कि यदि आपके सभी परीक्षणों में एक टेस्ट आइटम तैयार करना शामिल है, तो आप टैग को छोड़ सकते हैं और बस एक AfterScenario हुक का उपयोग कर सकते हैं।

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

मैं परिदृश्य कोटेक्स्ट दृष्टिकोण पसंद करता हूं क्योंकि मुझे लगता है कि यदि कोई परिदृश्य डेटा बनाता है, तो उस परिदृश्य को स्वयं के बाद सफाई के लिए जिम्मेदार होना चाहिए।

+0

मैं एक स्पष्ट संदर्भ वस्तु पसंद करूंगा जो संदर्भ इंजेक्शन के माध्यम से चरण वर्ग के निर्माता के माध्यम से पारित किया गया है और वहां 'पॉपियोरियोन्टेक्स्ट.क्यूरेंट' का उपयोग करके (जिसे specflow 2.0 में समानांतर परीक्षणों में उपयोग नहीं किया जा सकता) , लेकिन यह मूल रूप से मुझे सही दृष्टिकोण है। –

+0

@SamHolder ScenarioContext.Current एक स्पष्ट संदर्भ वस्तु है यानी यह उस परिदृश्य उदाहरण के लिए विशिष्ट है। समांतर परीक्षणों के साथ इसमें क्या समस्याएं हैं? –

+0

हाँ, मैं समझता हूं कि 'ScenarioContext.Current' क्या है, मुझे लगता है कि यह Specflow में चरणों के बीच राज्य साझा करने का सबसे अच्छा तरीका नहीं है। [मूल रूप से 3 तरीके] (http://stackoverflow.com/a/2963667/97614) हैं, और जेनेरिक 'परिदृश्य कॉन्टेक्स्ट' का उपयोग करने के बजाय विशिष्ट स्थिति के लिए एक स्पष्ट वर्ग का उपयोग करना बहुत बेहतर IMHO है। दिए गए उदाहरण में मैं शायद 'ItemContext' क्लास' संपत्ति 'नाम' के साथ बनाउंगा जिसे मैं ग्रिड पर सेट करूंगा। फिर आप इस श्रेणी का उपयोग टाइपएफ़ तरीके से 'ScenarioContext.Current' –

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