2008-11-19 14 views
5

मैं सोच रहा था कि परीक्षण करने के लिए ऑब्जेक्ट एक फ़ील्ड होना चाहिए और इस प्रकार SetUp विधि (यानी जुनीट, एनयूनीट, एमएस टेस्ट, ...) के दौरान स्थापित किया जाना चाहिए।सेटअप में या परीक्षण विधि के दौरान परीक्षण करने के लिए ऑब्जेक्ट प्रारंभ करें?

पर विचार करें निम्न उदाहरण (यह MSTest साथ C♯ है, लेकिन यह विचार किसी भी अन्य भाषा और परीक्षण ढांचे के लिए समान होना चाहिए):, पहला उदाहरण

public class SomeStuff 
{ 
    public string Value { get; private set; } 

    public SomeStuff(string value) 
    { 
     this.Value = value; 
    } 
} 


[TestClass] 
public class SomeStuffTestWithSetUp 
{ 
    private string value; 
    private SomeStuff someStuff; 

    [TestInitialize] 
    public void MyTestInitialize() 
    { 
     this.value = Guid.NewGuid().ToString(); 
     this.someStuff = new SomeStuff(this.value); 
    } 

    [TestCleanup] 
    public void MyTestCleanup() 
    { 
     this.someStuff = null; 
     this.value = string.Empty; 
    } 

    [TestMethod] 
    public void TestGetValue() 
    { 
     Assert.AreEqual(this.value, this.someStuff.Value); 
    } 
} 

[TestClass] 
public class SomeStuffTestWithoutSetup 
{ 
    [TestMethod] 
    public void TestGetValue() 
    { 
     string value = Guid.NewGuid().ToString(); 
     SomeStuff someStuff = new SomeStuff(value); 
     Assert.AreEqual(value, someStuff.Value); 
    } 
} 
बेशक

, सिर्फ एक परीक्षण विधि के साथ बहुत लंबा है, लेकिन अधिक परीक्षण विधियों के साथ, यह कुछ अनावश्यक कोड सुरक्षित हो सकता है।

प्रत्येक दृष्टिकोण के पेशेवर और विपक्ष क्या हैं? क्या कोई "सर्वोत्तम व्यवहार" है?

उत्तर

8

फ़ील्ड & शुरू करने के बाद यह एक फिसलन ढलान है आम तौर पर परीक्षण विधि के भीतर टेस्ट विधि के संदर्भ को सेट करना। इससे बड़े परीक्षण विधियों और वास्तव में वास्तव में अप्रबंधनीय जुड़नार होते हैं जो स्वयं को बहुत अच्छी तरह से समझाते नहीं हैं।

इसके बजाय, आपको & परीक्षण संगठन नामकरण बीडीडी शैली को देखना चाहिए। सिस्टम-अंडर-टेस्ट प्रति एक स्थिरता के बजाय प्रति संदर्भ एक स्थिरता बनाएं। फिर आपका [सेटअप] वास्तव में संदर्भ स्थापित करता है, और आपके परीक्षण सरल एक-लाइनर आवेषण हो सकते हैं।

यह पढ़ने के लिए जब आप एक परीक्षण उत्पादन है कि यह करता है को देखने के लिए बहुत आसान है:

OrderFulfillmentServiceTests।सीएस

  • with_an_order_from_a_new_customer

    • यह क्रेडिट सेवा
    • से अपने क्रेडिट की जाँच करनी चाहिए कि वह मान्य क्रेडिट जाँच के साथ कोई छूट
  • देना चाहिए

    • यह सूची
    • घटती चाहिए यह माल में एक ग्राहक के साथ
  • जहाज चाहिए टेक्सास या कैलिफ़ोर्निया

    • यह से एक आदेश के साथ उचित बिक्री कर
  • जोड़ना चाहिए एक सोना ग्राहक

    • यह क्रेडिट जाँच नहीं करना चाहिए
    • यह शीघ्र किया जाना चाहिए शिपिंग के लिए मुफ्त

जोड़ा हमारे परीक्षण हमारी प्रणाली के लिए अब वास्तव में अच्छा प्रलेखन कर रहे हैं। प्रत्येक "with_an ..." एक परीक्षण स्थिरता है, और इसके नीचे की चीज़ें परीक्षण हैं। उन लोगों के भीतर, आप संदर्भ (क्लास नाम के रूप में दुनिया की स्थिति का वर्णन करते हैं) सेट करते हैं और फिर परीक्षण सरल जोर देता है जो सत्यापित करता है कि विधि का नाम क्या करता है।

+0

हाँ, परीक्षण की उस शैली में स्विच करने से वास्तव में मदद मिलती है कि सामान कहां जाता है। असल में, यूनिट टेस्ट कोड के समान नियम का पालन करते हैं: यानी एकल उत्तरदायित्व। एक scenerio के लिए एक परीक्षण। –

1

दूसरा दृष्टिकोण अधिक पढ़ने योग्य है, और दृष्टि से पता लगाने के लिए बहुत आसान है।

हालांकि, पहला दृष्टिकोण कम पुनरावृत्ति का मतलब है।

जो मैंने पाया है वह है कि मैं ऑब्जेक्ट्स बनाने के लिए सेटअप का उपयोग करता हूं (विशेष रूप से कई निर्भरताओं वाले चीज़ों के लिए), और उसके बाद परीक्षण में उपयोग किए गए मान सेट करें। अनुभव से, यह कोड-पुन: उपयोग बनाम पठनीयता/ट्रेसिबिलिटी के सही मात्रा के बारे में प्रदान करता है।

0

व्यक्तिगत रूप से, मैं दो अलग-अलग कारणों से सेटअप और टियरडाउन विधियों का उपयोग करता हूं, हालांकि मुझे लगता है कि दूसरों के अलग-अलग कारण होंगे।

  1. सेटअप और टियरडाउन विधियों का उपयोग करें जब सभी परीक्षणों द्वारा उपयोग की जाने वाली सामान्य दीक्षा तर्क और सेटअप में बनाए गए ऑब्जेक्ट (ओं) का एक उदाहरण दोबारा उपयोग किया गया है।
  2. सेटअप और टियरडाउन विधियों का उपयोग करें जब किसी भी ऑब्जेक्ट को बनाने और नष्ट करने में लगने वाले समय में प्रत्येक टेस्ट विधि में दोहराए जाने पर यूनिट परीक्षण प्रक्रिया को धीमा करने में पर्याप्त समय लगता है।

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

मैं टेस्ट विधि के भीतर बनाई गई वस्तु को नष्ट करने और नष्ट करने की पठनीयता को भी पसंद करता हूं, हालांकि यह मेरे लिए ब्रेकिंग या विक्रय बिंदु नहीं है।

+0

सेट अप और टियरडाउन को किसी भी टेस्ट विधि से पहले बुलाया नहीं जाता है? –

+0

मेरा बुरा। यह नहीं पता कि मैं उस पर गलत जानकारी कहां बन गया। सफाई देने के लिए धन्यवाद! –

1

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

0

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

[Test] 
public void TestSomething() 
{ 
    _myVar = "value"; 
    InstantiateClass(); 
    RunTheClass(); 
    Assert.IsTrue(this, that); 
} 
0

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

स्टेटिक हेल्पर विधियां सहयोगियों को अधिक स्पष्ट रूप से प्रकट करती हैं, और आप ऐसे क्षेत्रों से बचते हैं जो चर के दायरे को अनावश्यक रूप से विस्तृत करते हैं।

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