2010-02-26 2 views
7

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

मुझे लगता है कि यह एक अच्छी बात है कि उनकी लाइब्रेरी अमान्य इनपुट पर जोर देती है, लेकिन साथ ही मैं यूनिट परीक्षणों को खराब इनपुट को कवर करना चाहता हूं। लेकिन जब मैं ऐसा करता हूं, तो संदेश बॉक्स दिखाता है और शेष इकाई परीक्षणों के साथ जारी रखने के लिए मुझे मैन्युअल रूप से ठीक क्लिक करना होगा।

यदि यह स्पष्ट नहीं है, तो मेरी समस्या यह है कि इकाई परीक्षण प्रक्रिया Debug.Assert पर रुक जाती है। लोगों को किसी भी चेकइन से पहले अपने यूनिट परीक्षण चलाने के लिए माना जाता है और यह स्वचालित होना चाहिए और जब तक कोई परीक्षण विफल नहीं हो जाता तब तक संदेशों को फेंकना नहीं चाहिए ..

इस मामले में "सर्वश्रेष्ठ" दृष्टिकोण क्या है?

उत्तर

3

Debug.Assert method के लिए एमएसडीएन दस्तावेज पर एक नज़र डालें। विशेष रूप से "टिप्पणियां" के तहत, यह बताते हैं कि कैसे आप यूआई निष्क्रिय कर सकते हैं:

<configuration> 
    <system.diagnostics> 
    <assert assertuienabled="false" logfilename="c:\\myFile.log" /> 
    </system.diagnostics> 
</configuration> 

इसलिए मेरा सुझाव जाने वाले एप्लिकेशन का कॉन्फ़िग फ़ाइल डिफ़ॉल्ट रूप से इस है और अपने सहयोगी यूआई के लिए जोर पर स्विच है कि जब भी वह इसे करने के लिए उपयोगी लगता है ऐसा करो।

2

जैसा कि हेनक ने पहले ही नोट किया है, यूआई को दबाकर बेकार है, क्योंकि आप चाहते हैं कि आपका कोड असफल हो। आप अपने कोड को बदलने के लिए नहीं करना चाहते हैं, तो आप इस प्रकार, एक कस्टम ट्रेस श्रोता कि एक अपवाद फेंकता लिख ​​सकते हैं:

public class ProductionTraceListener : DefaultTraceListener 
{ 
    public override void Fail(string message, string detailMessage) 
    { 
     string failMessage = message; 

     if (detailMessage != null) 
     { 
      failMessage += " " + detailMessage; 
     } 

     throw new AssertionFailedException(failMessage); 
    } 
} 

[Serializable] 
public class AssertionFailedException : Exception 
{ 
    public AssertionFailedException() { } 
    public AssertionFailedException(string message) : base(message) { } 
    public AssertionFailedException(string message, Exception inner) 
     : base(message, inner) { } 
    protected AssertionFailedException(SerializationInfo info, 
     StreamingContext context) : base(info, context) { } 
} 

और आप इसे रजिस्टर कर सकते हैं इस प्रकार है:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.diagnostics> 
    <trace> 
     <listeners> 
     <clear /> 
     <add name="Default" 
      type="[Namespace].ProductionTraceListener, [Assembly]" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 
</configuration> 

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

मेरी सलाह कोड बदलने के लिए और पूर्व शर्त के लिए सामान्य if (x) throw ArgumentException() चेकों का उपयोग (या CuttingEdge.Conditions का उपयोग) और उन केवल कोड रास्तों कि कभी नहीं चलाना चाहिए के लिए दावा करते हैं। Debug.Assert के बजाय Trace.Assert का उपयोग करने का प्रयास करें, क्योंकि आप यह भी चाहते हैं कि उन आवेषणों को आपके उत्पादन वातावरण में जांचें। जब आपने ऐसा किया है तो आप अपने उत्पादन वातावरण में ProductionTraceListener और अपने यूनिट परीक्षणों में यह UnitTestTraceListener का उपयोग कर सकते हैं।

public class UnitTestTraceListener : DefaultTraceListener 
{ 
    public override void Fail(string message, string detailMessage) 
    { 
     string failMessage = message; 

     if (detailMessage != null) 
     { 
      failMessage += " " + detailMessage; 
     } 

     // Call to Assert method of used unit testing framework. 
     Microsoft.VisualStudio.TestTools.UnitTesting.Assert.Fail(
      failMessage); 
    } 
} 

शुभकामनाएँ।

+0

यह Trace.Assert() के लिए अच्छा लगेगा, लेकिन ओपी Debug.Assert() का उल्लेख करता है। –

+0

प्लस, आप एक स्वचालित बिल्ड प्रोसेस के हिस्से के रूप में चलते समय यूनिट परीक्षण * में कोड विफल होने के लिए चाहते हैं। कोड चलाने के दौरान डेवलपर्स लाभ के लिए आवेषण हैं। – Rob

+0

@ हेंक एंड @ @ रोब: मुझे यकीन नहीं है कि मैं आपका अनुसरण करता हूं। इकाई परीक्षण पर्यावरण में 'ProductionTraceListener' को कॉन्फ़िगर करने से यूनिट परीक्षण विफल होने की अनुमति होगी जब विधियों ने अपेक्षित' AssertionFailedException' को फेंक नहीं दिया था। जब यूनिट परीक्षण डीबग मोड में चलाए जाते हैं तो यह वैसे ही करेगा जैसा वह चाहता है, है ना? कृपया मुझे ज्ञान दो। – Steven

2

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

आप अपने परीक्षण सेटअप करने के लिए इस जोड़ सकते हैं ...

[SetUp] 
public void SetUp() 
{ 
    // Replace pop-up assert trace listener with one that simply logs a message. 
    Debug.Listeners.Clear(); 
    Debug.Listeners.Add(new ConsoleTraceListener()); 
} 

बस पाठ उत्पादन की जाँच करने के लिए जब एक परीक्षण में विफल रहता है भूल नहीं है!