2012-03-14 22 views
11

मुझे आश्चर्य है कि एमएसटीएस्ट के तहत एक टेस्ट क्लास में इंस्टेंस चर शुरू करने के लिए सबसे अच्छा अभ्यास क्या है। मान लीजिए कि मेरे पास एक टेस्ट क्लास है जहां सहायक वस्तुओं को मजाक करने और स्थापित करने के लिए बहुत अधिक ओवरहेड है। मैं प्रत्येक परीक्षण में एक ही कोड को दोहराने के बजाय, इसे एक बार करना चाहता हूं। मेरा विचार था कि कुछ परीक्षण उदाहरणों को शुरू करने के लिए MyClassInitialize विधि का उपयोग करना था, जिसमें सभी परीक्षणों तक पहुंच थी। इस तरह, मैं एक बार ग्लोबल इंस्टेंस वैरिएबल को प्रारंभ करता हूं और इन्हें चलाने के बाद प्रत्येक टेस्ट द्वारा उपयोग किया जाता है।एमएसटीएस्ट, MyClassInitialize, और आवृत्ति चर

दुर्भाग्यवश, MyClassInitialize विधि स्थिर है, इसलिए वैश्विक आवृत्ति चर प्रारंभ नहीं कर सकते हैं। मैंने वैश्विक आवृत्ति चर स्थिर बनाने के बारे में सोचा, लेकिन यह सही समाधान प्रतीत नहीं होता है। मैंने अगली बार टेस्ट क्लास के कन्स्ट्रक्टर में प्रारंभिक कोड डालने के बारे में सोचा, लेकिन मेरे अंदर कुछ कहता रहता है कि MyClassInitialize वह है जो मुझे उपयोग करना है। एक और विचार MyTestInitialize का उपयोग करना होगा क्योंकि यह विधि स्थैतिक नहीं है, लेकिन यह प्रत्येक परीक्षण के साथ ऑब्जेक्ट को और अधिक बना देगा। क्या यह उचित है?

क्या परीक्षणों में वेरिएबल्स का उपयोग करने के लिए सर्वोत्तम प्रथाएं हैं जहां परीक्षणों को चलाने से पहले उन चरों को केवल आरंभ करने की आवश्यकता है? नीचे मैं किस बारे में बात कर रहा हूं उसका एक संक्षिप्त उदाहरण है।

[TestClass()] 
public class ProgramTest 
{ 
    // this object requires extensive setup so would like to just do it once 
    private SomeObjectThatIsUsedByAllTestsAndNeedsInitialization myObject; 
    private TestContext testContextInstance; 

    [ClassInitialize()] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     // initializing SomeObjectThatIsUsedByAllTestsAndNeedsInitialization clearly will 
     // not work here because this method is static. 
    } 

    [TestMethod()] 
    public void Test1() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test2() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test3() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 
} 

उत्तर

8

उपयोग [TestInitialize] और [TestCleanup] जब भी संभव हो। एक इकाई परीक्षण तेजी से और अलग होना चाहिए, इसलिए प्रत्येक परीक्षण के लिए प्रारंभ और सफाई करने का सबसे साफ तरीका है। यह सुनिश्चित करता है कि एक परीक्षण के परिणाम किसी अन्य परीक्षण से प्रभावित नहीं होते हैं। जब परीक्षण का प्रारंभिक समय लगता है, तो संभवतः आपने यूनिट टेस्ट नहीं बल्कि एकीकरण परीक्षण किया है।

अपवाद एकीकरण परीक्षण है जो डेटाबेस या किसी अन्य संसाधन पर जाता है, यह संभव है कि आप एक बार एक ऑपरेशन निष्पादित करना चाहते हैं, और फिर कई दावों (testMethods) के साथ परिणाम सत्यापित करें। मेरे पास एक संदर्भ प्रकार के साथ एक विशिष्ट जेनेरिक वर्ग होता था जिसे प्रति वर्ग एक बार शुरू किया जाता है। लेकिन अब मुझे लगता है कि यह अधिक है, और केवल निर्भरता और परिणाम निजी स्थैतिक चर में डाल दिया।

1

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

3

स्थिर के साथ आपकी समस्या क्या है?

यदि आपका ऑब्जेक्टटाटआईएसयूस्डबैलटेस्ट वास्तव में 100% आपके सभी परीक्षणों के बीच साझा किया जा सकता है तो इसे स्थैतिक बनाएं और क्लासइन्स्टिलाइज का उपयोग करें - यही वह है।

यदि ऐसा नहीं है तो आपको प्रति परीक्षण शुरू करना होगा, जो टेस्टइन्स्टिलाइजेशन है।

+1

वास्तव में स्थिर के साथ मेरी समस्या को प्रमाणित नहीं कर सकता। यह सिर्फ सही महसूस नहीं करता है, लेकिन मैं क्यों समझा नहीं सकता। – meyousikmann

+0

स्टेटिक का मतलब कक्षा के स्वामित्व में है। जो चीजें स्थिर नहीं हैं वे वर्ग के उदाहरणों के स्वामित्व में हैं। यह निर्धारित करने की कोशिश करते समय कि कोई चीज़ स्थैतिक होनी चाहिए, खुद से पूछें 'क्या यह कक्षा के स्वामित्व में है या सिर्फ एक उदाहरण है?' – Tristan

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