2008-10-17 3 views
64

एनयूनीट दस्तावेज मुझे बताता है कि TestFixtureSetup के साथ किसी विधि का उपयोग कब करें और कन्स्ट्रक्टर में सेटअप कब करें।मैं डिफॉल्ट कन्स्ट्रक्टर के बजाय TestFixtureSetUp विशेषता का उपयोग कब करूं?

public class MyTest 
{ 
    private MyClass myClass; 

    public MyTest() 
    { 
     myClass = new MyClass(); 
    } 

    [TestFixtureSetUp] 
    public void Init() 
    { 
     myClass = new MyClass(); 
    } 
} 

वहाँ TestFixtureSetup बनाम डिफ़ॉल्ट निर्माता के बारे में कोई अच्छा/बुरा प्रथाओं हैं या वहाँ कोई अंतर नहीं है?

+0

चूंकि यह हमेशा एक लगातार सवाल पूछता है, [इस] (https://stackoverflow.com/a/4970076/908336) पर विचार करें और [यह] (https://stackoverflow.com/a/8689398/908336) ('एमएसटीएस्ट' के लिए एक ही चर्चा)। लेकिन टेस्ट पठनीयता पर स्थिरता सेटअप के साइड इफेक्ट्स से सावधान रहें (देखें [यहां] (http://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html) और [यहां] (https: //lostechies.com/jimmybogard/2013/09/26/test-styles-and-avoiding-setupteardown/))। –

उत्तर

13

मुझे लगता है कि यह उन मुद्दों में से एक रहा है जिन्हें एनयूनीट टीम द्वारा संबोधित नहीं किया गया है। हालांकि, उत्कृष्ट xUnit project है जिसने इस सटीक मुद्दे को देखा और निर्णय लिया कि रचनाकार test fixture initialization पर उपयोग करने के लिए एक अच्छी बात थीं।

nunit के लिए, इस मामले में मेरी सबसे अच्छा अभ्यास दस्तावेज़ में वर्णित TestFixtureSetUp, TestFixtureTearDown, SetUp, और TearDown तरीकों का उपयोग करने के लिए किया गया है।

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

+0

कृपया ध्यान दें [xUnit आलेख] (https://xunit.github.io/docs/comparisons.html) यह सुझाव दे रहा है कि 'सेटअप (साथ ही कन्स्ट्रक्टर) आमतौर पर एक बुरा विचार है जो परीक्षण कोड बनाता है [मुश्किल फ़ॉलो करें] (http://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html), नहीं कि रचनाकार 'सेटअप' से बेहतर हैं। पैरामीटर रहित कन्स्ट्रक्टर हालांकि उन लोगों के लिए अंतिम उपाय हैं जिन्हें वास्तव में इसकी आवश्यकता है। यह भी देखें: [टेस्ट शैलियों और सेटअप/टियरडाउन से परहेज] (https://lostechies.com/jimmybogard/2013/09/26/test-styles-and-avoiding-setupteardown/) –

62

आपको अपने परीक्षण कक्षाओं में एक कन्स्ट्रक्टर का उपयोग करने की आवश्यकता क्यों होगी?

मैं के लिए कोड से पहले और प्रत्येक परीक्षा के बाद निष्पादित किया जाना है, और इसी कोड के लिए [TestFixtureSetUp] और [TestFixtureTearDown] चिह्नित तरीकों पहले और बाद में स्थिरता के सभी परीक्षण चालन किया गया है केवल एक बार निष्पादित करने के लिए [SetUp] और [TearDown] चिह्नित तरीकों का उपयोग।

मुझे लगता है कि आप शायद एक निर्माता के लिए [TestFixtureSetUp] को प्रतिस्थापित कर सकते हैं (हालांकि मैंने कोशिश नहीं की है), लेकिन यह केवल स्पष्ट तरीके से स्पष्ट सम्मेलन से तोड़ने लगता है।

+4

मुझे नहीं पता था कि मुझे एक कन्स्ट्रक्टर की आवश्यकता क्यों है, लेकिन मुझे यह भी नहीं पता कि मुझे टेस्टफिक्शनसेटअप की आवश्यकता क्यों है। मुझे सेटअप, टियरडाउन, और testfixtureteardown विशेषताओं के बारे में पता है। मैं कन्स्ट्रक्टर और testfixturesetup विशेषता के बीच अंतर नहीं जानता। – Paco

+3

बस अपने प्रश्न का उत्तर देने के लिए। यदि आपके पास पैरामीट्रिज्ड टेस्ट फिक्स्चर हैं तो आपको अपने टेस्ट क्लास में कन्स्ट्रक्टर का उपयोग करने की आवश्यकता है। –

9

मैंने अक्सर सोचा है कि [TestFixtureSetUp] की आवश्यकता क्या थी, यह देखते हुए कि एक सरल, अच्छी तरह से समझी जाने वाली प्रथम श्रेणी भाषा निर्माण है जो बिल्कुल वही काम करता है।

मेरी वरीयता रचनाकारों का उपयोग करना है, जो पाठक रूप से कीवर्ड का लाभ उठाने के लिए सदस्य चर को पुन: प्रारंभ नहीं किया जा सकता है।

+4

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

2

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

[TestFixtureSetup] के साथ एनोटेटेड केवल एक विधि को (केवल कंक्रीट क्लास पर) कहा जाएगा, लेकिन अन्य स्थिरता प्रारंभकर्ता नहीं होंगे। इस मामले में मैं कन्स्ट्रक्टर में प्रारंभिकता डालना चाहता हूं, जिसमें विरासत के लिए एक अच्छी तरह से परिभाषित अर्थशास्त्र है :)

+2

यह तब से बदल गया है NUnit 2.5 अब [testFixtureSetup] के साथ एनोटेटेड सभी विधियों को बुलाया जाएगा। –

12

एक चीज जो आप [TestFixtureSetup] के साथ नहीं कर सकते हैं जो आप कन्स्ट्रक्टर में कर सकते हैं, से पैरामीटर प्राप्त करते हैं [TestFixture]

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

[TestFixture("System.Data.SqlClient", 
    "Server=(local)\\SQLEXPRESS;Initial Catalog=MyTestDatabase;Integrated Security=True;Pooling=False"))] 
[TestFixture("System.Data.SQLite", "Data Source=MyTestDatabase.s3db")])] 
internal class MyDataAccessLayerIntegrationTests 
{ 
    MyDataAccessLayerIntegrationTests(
     string dataProvider, 
     string connectionString) 
    { 
     ... 
    } 
} 
8

निर्माता और विधि [TestFixtureSetUp] विशेषता के साथ चिह्नित के बीच अंतर नहीं है।एनयूनीट दस्तावेज के अनुसार:

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

तो यदि आपके पास कोई महंगा प्रारंभिकरण है तो TestFixtureSetUp का उपयोग करना बेहतर है।

+1

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

-2

कन्स्ट्रक्टर और SetUp विधियों का अलग-अलग उपयोग किया जाता है:
निर्माता केवल एक बार चलाया जाता है।
हालांकि, प्रत्येक टेस्ट केस निष्पादित होने से पहले SetUp विधियां कई बार चलती हैं।

+1

आप '[सेटअप]' का जिक्र कर रहे हैं, जबकि ओपी '[testFixtureSetUp]' का जिक्र कर रहा है। – onedaywhen

2

[TestFixtureSetUp] और [TestFixtureTearDown] संपूर्ण टेस्ट क्लास के लिए हैं। केवल एक बार चलाता है।

[SetUp] और [TearDown] प्रत्येक परीक्षण विधि (परीक्षण) के लिए हैं। हर परीक्षण के लिए चलाता है।

1

कन्स्ट्रक्टर और टेस्टफिक्शनसेटअप के बीच एक महत्वपूर्ण अंतर यह है कि, कम से कम NUnit 2 में, कन्स्ट्रक्टर कोड वास्तव में परीक्षण गणना पर निष्पादित होता है, न केवल परीक्षण चल रहा है, इसलिए मूल रूप से आप केवल पढ़ने के लिए ctor कोड को सीमित करना चाहते हैं, यानी पैरामीटर, मान। कुछ भी जो साइड इफेक्ट्स का कारण बनता है या कोई वास्तविक काम करता है या तो आलसी में लपेटा जाता है या टेस्टफिक्शनसेट/वनटाइम सेट में किया जाता है। तो, आप परीक्षण को कॉन्फ़िगर करने के लिए पूरी तरह से एक स्थान के रूप में निर्माता के बारे में सोच सकते हैं। जबकि TestFixtureSetUp वह है जहां परीक्षण स्थिरता, परीक्षण से पहले सिस्टम की आवश्यक प्रारंभिक स्थिति चलती है, प्रारंभ किया जाता है।

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