2010-06-07 15 views
5

चलाए जा रहे हैं मैं कुछ MSTest इकाई परीक्षण है कि पारित जब मैं उन्हें व्यक्तिगत रूप से चलाने, लेकिन असफल जब मैं पूरे इकाई परीक्षण वर्ग को चलाने में परेशानी आ रही विफल रहता है। परीक्षण SLaks helped me with earlier पर कुछ कोड का परीक्षण करते हैं, और उन्होंने मुझे चेतावनी दी कि मैं क्या कर रहा था थ्रेड-सुरक्षित नहीं था। हालांकि, अब मेरा कोड अधिक जटिल है और मुझे नहीं पता कि इसे थ्रेड-सुरक्षित बनाने के बारे में कैसे जाना है। यहाँ मैं क्या है:MSTest इकाई परीक्षण से ही गुजरता है, जब अन्य परीक्षण

public static class DLLConfig 
{ 
    private static string _domain; 

    public static string Domain 
    { 
     get 
     { 
      return _domain = AlwaysReadFromFile 
       ? readCredentialFromFile(DOMAIN_TAG) 
       : _domain ?? readCredentialFromFile(DOMAIN_TAG); 
     } 
    } 
} 

और अपने परीक्षण सरल है:

string expected = "the value I know exists in the file"; 
string actual = DLLConfig.Domain; 
Assert.AreEqual(expected, actual); 

जब मैं अपने आप में इस परीक्षण चलाने के लिए, यह गुजरता है। जब मैंने इसे परीक्षण वर्ग में अन्य सभी परीक्षण (जो विभिन्न गुणों पर समान जांच) के साथ-साथ चलाने के लिए, actualnull है और परीक्षण विफल रहता है। मुझे लगता है कि यह किसी संपत्ति के साथ कोई समस्या नहीं है जिसका प्रकार एक कस्टम Enum प्रकार है; हो सकता है कि मुझे Domain संपत्ति के साथ यह समस्या हो रही है क्योंकि यह string है? या शायद यह एक बहु थ्रेडेड मुद्दा है कि एमएसटीएस्ट कैसे काम करता है?

+0

कैसे (यदि सभी) आप परीक्षण के बीच नीचे फाड़ ऊपर/सेट कर रहे हैं? – Paddyslacker

+0

@Paddyslacker: बिलकुल भी नहीं। मेरे पास कोई '[testCleanup] 'या' [TestInitialize] 'विधियां नहीं हैं। –

+1

गुड यूनिट परीक्षण स्वतंत्र हैं, इसलिए मैं हर बार एक ज्ञात राज्य में अपना कोड प्राप्त करने के लिए कुछ सेटअप और टियरडाउन जोड़ कर इन वास्तविक यूनिट परीक्षणों को देखता हूं। यदि विधि को एक साथ कॉल करने या इसे दो बार कॉल करने के लिए वास्तविक परीक्षण केस है, तो उसके लिए एक विशिष्ट असफल परीक्षण केस लिखें और फिर इसे पास करें। – Paddyslacker

उत्तर

6

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

5

आपका परीक्षण एक बाहरी फ़ाइल के आधार पर किया जाता है। एक फ़ंक्शन को कॉल करने के बजाय जो फ़ाइल को सीधे एक्सेस करता है, आपके पास DLLConfig होना चाहिए। डोमेन किसी अन्य वर्ग में एक विधि कॉल करें।

public static string Domain 
{ 
    get 
    { 
     return _domain = AlwaysReadFromFile 
      ? CredentialReader.Read(DOMAIN_TAG) 
      : _domain ?? CredentialReader.Read(DOMAIN_TAG); 
    } 
} 

तो फिर तुम एक नकली/नकली/ठूंठ CredentialReader जहां अपनी वापसी मूल्य नियंत्रित कर सकते हैं के साथ DllConfig प्रारंभ कर सकते हैं। याद रखें कि आप परीक्षण कर रहे हैं कि DLLConfig.Domain AlwaysReadFromFile स्थिति के आधार पर सही मान लौटा रहा है। आपको परीक्षण नहीं करना चाहिए कि वह मूल्य कहां से आ रहा है (या यदि यह भी मौजूद है) एक ही समय में।

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

1

यदि आप के लिए काम किया ऊपर जवाब में से कोई भी, मैं नाकाम रहने के परीक्षण में दावे से पहले Thread.Sleep(1) जोड़कर इस समस्या हल हो जाती ...

परीक्षण तुल्यकालन कहीं चूक जाता है की तरह लग रहा ... कृपया ध्यान दें मेरी परीक्षण है कि ऑर्डर निर्भर नहीं थे, कि मेरे पास कोई स्थिर सदस्य नहीं है और न ही बाहरी निर्भरता है।

+0

मैंने एक समाधान खोजने का प्रयास कर एक पूरा कार्य दिवस बिताया। बहुत बहुत धन्यवाद, यह पूरी तरह से काम करता है! – wrager

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