18

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

कोड:

CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
ICodeCompiler icc = codeProvider.CreateCompiler(); 
CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = false; 
parameters.GenerateInMemory = false; // debug enabled     
parameters.OutputAssembly = "DynamicCode.dll"; // if specified creates the DLL 
parameters.IncludeDebugInformation = true; 
CompilerResults results = icc.CompileAssemblyFromFile(parameters, "InjectedCode.cs.txt"); 

मैं उत्पन्न आईएल कोड की जाँच करने के DLL पैदा करते हैं। मैं वीएस में कोड डीबग कर सकता हूं। लेकिन जब मैं कवरेज चलाता हूं, तो जेनरेट असेंबली बस मिस होती है, अगर मैं टीईएमपी निर्देशिका का उपयोग करता हूं, या यदि मैं डीएलएल आउटपुट करता हूं (ऊपर की तरह) कोई फ़ाइल कवरेज में शामिल नहीं है (इसलिए मुख्य असेंबली भी नहीं)।

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

namespace CodeInjection 
{ 
    public static class DynConcatenateString 
    { 
     public static string Concatenate(string s1, string s2){ 
      // System.Diagnostics.Debugger.Break(); // break here for debugger and also test comment output 
      int a = 1+2+3+4+5; // complicated math 
      int b = a+2; 
      int c = 0; 

      return s1 + " !"+b+"! " + s2; 
     } 
    } 
} 

मैं जेनरेट कोड (मुख्य रूप से कवरेज) पर कवरेज, प्रोफाइलिंग और विश्लेषण का उपयोग करना चाहता हूं।

उत्तर

1

वी.एस. 2012 में ठीक कोड कवरेज गतिशील रूप से उत्पन्न कोड के लिए पूरा समर्थन नहीं है।

आप run our analyze command को देखने के लिए कर सकते हैं कि आपके मॉड्यूल एक लापता प्रतीक/p

+0

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

0

अपनी परियोजना में की वजह से यह बहुत ही कारण के लिए छोड़ दिया गया है या है यह, एक नया xml फ़ाइल और नाम यह dynamic.runsettings जोड़ें।

यह निम्न होना चाहिए:

<?xml version="1.0" encoding="utf-8" ?> 
<RunSettings> 
    <DataCollectionRunSettings> 
    <DataCollectors> 
     <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> 
     <Configuration> 
      <CodeCoverage> 
      <ModulePaths> 
<!-- 
About include/exclude lists: 
Empty "Include" clauses imply all; empty "Exclude" clauses imply none. 
Each element in the list is a regular expression (ECMAScript syntax). 
An item must first match at least one entry in the include list to be included. 
Included items must then not match any entries in the exclude list to remain included. 
It is considered an error to exclude all items from instrumentation as no data would be collected. 
--> 
       <Include> 
       <!-- <ModulePath>.*\\UnitTestProject1\.dll</ModulePath> --> 
       </Include> 
       <Exclude> 
       <ModulePath>.*CPPUnitTestFramework.*</ModulePath> 
       </Exclude> 
      </ModulePaths> 
      <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation> 
      <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses> 
      <CollectFromChildProcesses>True</CollectFromChildProcesses> 
      <CollectAspDotNet>False</CollectAspDotNet> 
<!-- 
Additional paths to search for symbol files. Symbols must be found for modules to be instrumented. 
If symbols are alongside the binaries, they are automatically picked up. Otherwise specify the here. 
Note that searching for symbols increases code coverage runtime. So keep this small and local. 
<SymbolSearchPaths> 
    <Path>C:\Users\User\Documents\Visual Studio 11\Projects\ProjectX\bin\Debug</Path> 
    <Path>\\mybuildshare\builds\ProjectX</Path> 
</SymbolSearchPaths> 
--> 
      <Functions> 
       <Exclude> 
       <Function>^std::.*</Function> 
       <Function>^ATL::.*</Function> 
       <Function>.*::__GetTestMethodInfo.*</Function> 
       <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function> 
       <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function> 
       <Function>.*::YOU_CAN_ONLY_DESIGNATE_ONE_.*</Function> 
       </Exclude> 
      </Functions> 
      <Attributes> 
       <Exclude> 
       <Attribute>^System.Diagnostics.DebuggerHiddenAttribute$</Attribute> 
       <Attribute>^System.Diagnostics.DebuggerNonUserCodeAttribute$</Attribute> 
       <Attribute>^System.Runtime.CompilerServices.CompilerGeneratedAttribute$</Attribute> 
       <Attribute>^System.CodeDom.Compiler.GeneratedCodeAttribute$</Attribute> 
       <Attribute>^System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute$</Attribute> 
       </Exclude> 
      </Attributes> 
      <Sources> 
       <Exclude> 
       <Source>.*\\atlmfc\\.*</Source> 
       <Source>.*\\vctools\\.*</Source> 
       <Source>.*\\public\\sdk\\.*</Source> 
       <Source>.*\\microsoft sdks\\.*</Source> 
       <Source>.*\\vc\\include\\.*</Source> 
       </Exclude> 
      </Sources> 
      <CompanyNames> 
       <Exclude> 
       <CompanyName>.*microsoft.*</CompanyName> 
       </Exclude> 
      </CompanyNames> 
      <PublicKeyTokens> 
       <Exclude> 
       <PublicKeyToken>^B77A5C561934E089$</PublicKeyToken> 
       <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken> 
       <PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken> 
       <PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken> 
       <PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken> 
       <PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken> 
       <PublicKeyToken>^E361AF139669C375$</PublicKeyToken> 
       </Exclude> 
      </PublicKeyTokens> 
      </CodeCoverage> 
     </Configuration> 
     </DataCollector> 
    </DataCollectors> 
    </DataCollectionRunSettings> 
</RunSettings> 

कि सहेजें। इस फ़ाइल के बारे में विशेष क्या है कोडकॉवरेज \ मॉड्यूलपाथ \ अनुभाग शामिल है इसके मॉड्यूलपाथ बच्चे ने टिप्पणी की है। इसमें अब कोड कवरेज में पाए गए किसी भी डीएलएल शामिल होंगे।

अब टेस्ट पर क्लिक करें -> टेस्ट सेटिंग्स -> टेस्ट सेटिंग फ़ाइल और dynamic.runsettings फ़ाइल निर्दिष्ट का चयन करें। आपका कोड कवरेज अब इस कस्टम सेटिंग्स फ़ाइल का उपयोग करेगा।

पर क्लिक करें कोड कवरेज और चलाने के जो भी परीक्षण आप चाहें का विश्लेषण करें। आप अपने DynamicCode.dll अपने कवरेज परिणामों में दिखाई देखना चाहिए (मैं अपने कार्य केंद्र नाम के नीचे छिप गए हैं):

enter image description here

ध्यान दें कि मैं .cs.txt फाइल करने के लिए एक नई पद्धति को जोड़ दिया है BONK बुलाया और यह (सही ढंग से) 100% खुला के रूप में दिखाई देता है।

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