18

Ho un progetto demo, che crea un assembly e lo utilizza. Posso anche eseguire il debug del codice iniettato. Ma se eseguo la copertura, l'analisi o la profilazione, viene contato, ma voglio misurarlo.Copertura del codice, analisi e profilazione per il codice generato dinamicamente

Codice:

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"); 

creo la DLL per controllare il codice IL generato. Posso eseguire il debug del codice in VS. Ma quando eseguo la copertura, l'assembly generato viene semplicemente perso, se utilizzo la directory TEMP o se emetto la DLL (come sopra) NESSUN FILE è incluso nella copertura (quindi nemmeno l'assembly principale).

Quando eseguo il profilo, posso solo vedere il richiamo (riflessione), ma nulla sul codice generato. Quando eseguo l'analisi (ho alcuni errori nel codice iniettato, ad esempio, i locali non utilizzati e l'analisi ofc per tutto), non vengono segnalati problemi dal codice inserito. Il codice iniettato:

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; 
     } 
    } 
} 

desidero utilizzare copertura, profili e analisi sul codice generato (soprattutto coperture).

risposta

1

La copertura del codice Ok in VS 2012 non ha il supporto completo per il codice generato dinamicamente.

Puoi run our analyze command di vedere che il modulo è stato ignorato per questo stesso motivo o è a causa di un mancante simbolo/p

+0

Anche saltato (era il mio primo tentativo dopo la copertura del codice saltato). Anche la copertura dei jetbrain e altri strumenti mancano. Ora approfondirò l'argomento, si spera con risultati nella prossima settimana, quindi invierò qui. Si prega di valutare la mia domanda, se pensi che sia utile o meno. – cseppento

0

Nel progetto, aggiungere un nuovo file XML e denominarlo dynamic.runsettings.

Esso deve contenere i seguenti:

<?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> 

Salva questo. La particolarità di questo file è che la sezione CodeCoverage \ ModulePaths \ Include ha commentato il suo bambino ModulePath. Questo ora includerà QUALSIASI DLL che trova nella copertura del codice.

Ora fare clic su Test -> Impostazioni di prova -> Seleziona file di impostazioni di test e specificare il file dynamic.runsettings. La copertura del codice ora utilizzerà questo file di impostazioni personalizzate.

Fai clic su Analizza copertura del codice ed esegui tutti i test che desideri. Si dovrebbe vedere il DynamicCode.dll compare nei risultati di copertura (ho oscurato il mio nome workstation sottostante):

enter image description here

Nota che ho aggiunto un nuovo metodo per il file .cs.txt chiamato BONK e (correttamente) si presenta come scoperto al 100%.