2010-03-18 14 views
9

मैंने इसे थोड़ा गुमराह किया है और वास्तव में मुझे आवश्यक उत्तर नहीं मिला।यूनिट परीक्षण सम्मिलित/अद्यतन/हटाएं

मैं ग्राहक के लिए SQL सर्वर और LINQ के साथ सी # में एक वेबपृष्ठ पर काम कर रहा हूं। मैं चाहता हूं कि उपयोगकर्ता एक-दूसरे को संदेश भेज सकें। तो मैं क्या करता हूं कि मैं इकाई को डेटा के साथ परीक्षण करता हूं जो वास्तव में डेटाबेस में जाता है।

समस्या यह है कि अब मैं कम से कम 2 उपयोगकर्ताओं को रखने पर निर्भर करता हूं जिन्हें मैं पहचानता हूं। इसके अलावा मुझे अपने स्वयं के बाद साफ करना है। इससे बड़े परीक्षण परीक्षण होते हैं जो एक परीक्षण में बहुत परीक्षण करते हैं।

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

मैं इसे किसी अन्य तरीके से करना चाहते हैं, तो डीबी करने के लिए डेटा को सहेजे बिना, मैं नहीं करने के लिए यकीन है कि पता चला है कि डेटा

अद्यतन करने आदि क्या उचित तरीका है के बाद डेटाबेस में मौजूद था सक्षम होगा ऐसा परीक्षण करने के बिना ऐसा करने के लिए जो एक परीक्षण में बहुत सारी कार्यक्षमता का परीक्षण करता है?

+3

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

+0

यह इंगित करने के लिए धन्यवाद, मेरे सिर में कुछ गड़बड़ हुई। मैंने अब –

उत्तर

17

एक System.Transactions.TransactionScope ब्लॉक के अंदर सभी परीक्षण करते हैं, और बस कॉल नहीं करते Scope.Complete() ... जब आप बाहर निकलते हैं तो सभी परिवर्तन वापस लुढ़क जाएंगे, और अन्य उपयोगकर्ता डेटाबेस में आपके द्वारा बनाए गए अस्थायी डेटा को देखने में सक्षम नहीं होंगे, इसलिए परीक्षण प्रक्रिया केवल परीक्षण मशीन को प्रभावित करेगी ..

आप एक नया उपयोगकर्ता दर्ज कर सकते हैं, यह सत्यापित करने के लिए डेटाबेस को पढ़ें कि यह सही ढंग से दर्ज किया गया था, और लेनदेनस्कोप के ब्लॉक के भीतर आपको जो कुछ भी जांचना है, ...

एक यूनिट टेस्ट विधि दो अलग-अलग उपयोगकर्ताओं का प्रतिरूपण करता है, सभी एक लेनदेन के भीतर ...

उदा। कोड

using (var scop = new System.Transactions.TransactionScope()) 
    { 
     // all your test code and Asserts that access the database, 
     // writes and reads, from any class, ... 
     // to commit at the very end of this block, 
     // you would call 
     // scop.Complete(); // ..... but don't and all will be rolled back 
    } 
+0

मुझे जो चाहिए वह ध्वनि। क्या यह डेटा डीबी में डेटा की तरह काम करेगा, लेकिन मैं प्रतिबद्ध नहीं होगा? मैं कुछ कक्षाओं में डेटा तक पहुंच रहा हूं और उन्हें "सोचना" होगा कि डेटा डीबी –

+0

में है अन्य उपयोगकर्ता * यदि वे लेनदेन अलगाव स्तर के साथ खेलते हैं तो वे इसे देख पाएंगे। यह आम तौर पर एक जानबूझकर कार्रवाई है, हालांकि, वास्तव में चिंता करने के लिए कुछ नहीं है। – DaveE

+0

यह कैसे काम करता है, डेटाबेस में संग्रहीत डेटा है या यह स्मृति में संग्रहीत है? –

4

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

उदा। एक जुड़नार जो संदेश एक दूसरे को ऐसा लग सकता है की जरूरत है दो उपयोगकर्ताओं के लिए फ़ाइल (यह मेरा है):

Member: 

    Member_WibWobble: 
    username:  Wibble_Wobble 
    email_address: [email protected][removed].com 
    password:  pw 
    is_super_admin: true 
    last_login:  "2010-01-06 12:12:57" 
    Country:  country_AU 
    UploadImage: 
     type:   <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?> 
     upload:  "http://localhost/[removed]/images/wibwobble.jpg" 

    Member_BunnyHugs: 
    username:  BunnyHugs 
    email_address: [email protected][removed].com 
    password:  pw 
    is_super_admin: true 
    last_login:  "2009-12-01 14:11:11" 
    Country:  country_UK 
    UploadImage: 
     type:   <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?> 
     upload:  "http://localhost/[removed]/images/bunnyhugs.jpg" 

PrivateMessage: 

    PrivateMessage_1: 
    subject:   "Yo" 
    body:   | 
     hi 

     <b>escape this html please</b> 

     bye 
    is_read:   false 
    Sender:   Member_WibWobble 
    Recipient:  Member_BunnyHugs 
+0

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

+0

लेकिन इसका मतलब यह नहीं होगा कि मुझे यह डेटा डीबी में परीक्षण करने के लिए जोड़ना होगा ..? –

+0

@ कुर्समेक: हाँ। – NotMe

4

इकाई परीक्षण डेटाबेस उनकी प्रकृति (लगातार भंडारण) के कारण एक पिटा हो सकता है।

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

एक बार ऐसा करने के बाद, अपने परीक्षण चलाना शुरू करें। टेस्ट में आपके ऐप सामान्य रूप से किए जाने वाले सभी क्रूड ऑपरेशंस को शामिल करना चाहिए।

यदि कोई विफलता होती है, तो यह इतना बड़ा सौदा नहीं है क्योंकि, फिर भी, आपको हर बार ताजा शुरू करना चाहिए।

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

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

आखिरकार, डेटाबेस परीक्षण एक परियोजना है और स्वयं ही है।

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