2015-09-01 7 views
5

मैंने अभी परियोजनाओं का एक समूह VS2015/C# 6 में अपग्रेड किया है।विजुअल स्टूडियो 2015 में कोड कवरेज से ऑटो गुणों को बाहर निकालें

अब एमएसटीएस्ट कोड कोडेज विश्लेषण रिपोर्ट कर रहा है कि कुछ ऑटो गुण यूनिट परीक्षणों द्वारा कवर नहीं किए जाते हैं। यह विजुअल स्टूडियो 2013 में मामला नहीं था, और मुझे संदेह है कि यह सी # 6 में नई ऑटोप्रोपर्टी सुविधाओं के साथ कुछ करने के लिए हो सकता है।

उत्पन्न होने वाले सभी झूठी सकारात्मकताओं से निपटने से कोड कवरेज टूल के उद्देश्य को हराया जाता है क्योंकि यह परीक्षण कवरेज की कमी वाले वास्तविक कोड की पहचान करना व्यावहारिक रूप से असंभव बनाता है। हम अपने सभी डीटीओ के लिए यूनिट परीक्षण नहीं लिखना चाहते हैं, और मुझे वास्तव में ExcludeFromCodeCoverage के साथ हर एक ऑटो-प्रॉपर्टी को एनोटेट करने वाली परियोजना के माध्यम से जाना नहीं होगा।

मैं विजुअल स्टूडियो 2013 प्रीमियम या अंतिम में https://github.com/iaingalloway/VisualStudioCodeCoverageIssue


  • ओपन VisualStudio2013.sln पर एक काम MCVE बना लिया है।
  • टेस्ट क्लिक करें -> कोड कवरेज का विश्लेषण करें -> सभी टेस्ट।
  • ध्यान दें कि "कोड कवरेज परिणाम" विंडो रिपोर्ट 0 ब्लॉक "कवर नहीं है"।

  • ओपन VisualStudio2015.sln विजुअल स्टूडियो 2015 उद्यम में।
  • टेस्ट क्लिक करें -> कोड कवरेज का विश्लेषण करें -> सभी टेस्ट।
  • गौर करें कि "कोड कवरेज परिणाम" खिड़की रिपोर्ट 1 ब्लॉक "कवर नहीं" (ExampleDto.Value के लिए गेटर)

कॉन्फ़िगर करने के लिए क्या यह संभव है में निर्मित कोड कवरेज उपकरण विजुअल स्टूडियो 2015 विजुअल स्टूडियो 2013 जैसे ऑटो-प्रॉपर्टीज को अनदेखा करने के लिए करता है?

+0

यह व्यवहार विजुअल स्टूडियो 2015 में एक बग होने के लिए वर्तमान में कोई का उपयोग कर के अलावा अन्य समाधान कर रहे हैं प्रकट होता है '[ ExcludeFromCodeCoverage] '। आप टिकट की प्रगति की निगरानी कर सकते हैं: - https://connect.microsoft.com/VisualStudio/Feedback/Details/1742106 –

उत्तर

4

समाधान के लिए, यदि आप अपने .runsettings फ़ाइल में निम्न जोड़ सकते हैं: -

<RunSettings> 
    <DataCollectionRunSettings> 
    <DataCollector ...> 
     <Configuration> 
     <CodeCoverage> 
      <Functions> 
      <Exclude> 
       <Function>.*get_.*</Function> 
       <Function>.*set_.*</Function> 
      </Exclude> 
      ... 

यह एक महान वैकल्पिक हल नहीं है, लेकिन जब तक आप "get_" या "के साथ किसी भी फ़ंक्शन का उपयोग नहीं कर रहे हैं के रूप में set_ "नामों में आपको यह आवश्यक व्यवहार प्राप्त करना चाहिए।

0

मुझे लगता है कि [ExcludeFromCodeCoverage] आपका एकमात्र विकल्प है। यह सिर्फ एक बार की बात है जो आपको करना है। मैं, व्यक्तिगत रूप से, संपत्ति गेटटर/सेटर्स पर विशेष रूप से डब्ल्यूपीएफ में यूनिट परीक्षण लिखता हूं, जहां मैं यह सुनिश्चित करना चाहता हूं कि संपत्ति परिवर्तन अधिसूचनाएं हों।

+2

अगर आपको गेटटर/सेटर के अंदर तर्क (जैसे संपत्ति परिवर्तन अधिसूचनाएं) मिल गई हैं, तो यह एक बात है ।यह एक और बात है अगर यह सिर्फ एक ऑटो-संपत्ति है। 'int Foo {get; सेट; } '। इस कोडबेस में हजारों हैं। कोड विश्लेषण में "ब्लॉक" का लगभग 18%, और हर बार अधिक जोड़ा जा रहा है। इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए! –

+0

@Iain एमएसटीएस्ट के साथ कोई रास्ता नहीं दिखता है। VS2015 में आप जो भी बहिष्कृत कर सकते हैं उसके बारे में विस्तृत जानकारी के लिए https://msdn.microsoft.com/en-us/library/jj159530.aspx देखें। –

0

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

public class ModelsGetSetTest 
{ 

    [ClassData(typeof(ModelTestDataGenerator))] 
    [Theory] 
    public void GettersGetWithoutError<T>(T model) 
     where T: BaseEntity 
    { 
     PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
     for (var i = 0; i < properties.Length; i++) 
     { 
      var prop = properties[i]; 
      prop.GetValue(model); 
     } 
    } 

    [ClassData(typeof(ModelTestDataGenerator))] 
    [Theory] 
    public void SettersSetWithoutError<T>(T model) 
     where T : BaseEntity 
    { 
     PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
     for (var i = 0; i < properties.Length; i++) 
     { 
      var prop = properties[i]; 
      prop.SetValue(model, null); 
     } 
    } 

    public class ModelTestDataGenerator : IEnumerable<object[]> 
    { 
     private readonly List<object[]> _data = new List<object[]> 
     { 
      new object[] { new UserRole() }, 
      new object[] { new User() }, 
      new object[] { new Role() } 
     }; 

     public IEnumerator<object[]> GetEnumerator() => _data.GetEnumerator(); 
     IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); 
    } 
} 
संबंधित मुद्दे