c# - Cobertura, análisis y perfilado de código para código generado dinámicamente.
.net visual-studio-2012 (2)
En su proyecto, agregue un nuevo archivo xml y dynamic.runsettings
nombre dynamic.runsettings
.
Debe contener lo siguiente:
<?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 eso. Lo especial de este archivo es que CodeCoverage / ModulePaths / Include tiene su hijo ModulePath comentado. Esto ahora incluirá CUALQUIER dlls que encuentre en la cobertura del código.
Ahora haga clic en Prueba -> Configuración de prueba -> Seleccionar archivo de configuración de prueba y especifique el archivo dynamic.runsettings. Su cobertura de código ahora utilizará este archivo de configuración personalizada.
Haga clic en Analizar la cobertura del código y ejecute las pruebas que desee. Debería ver aparecer su DynamicCode.dll en los resultados de su cobertura (he ocultado el nombre de mi estación de trabajo a continuación):
Tenga en cuenta que he agregado un nuevo método al archivo BONK
llamado BONK
y (correctamente) aparece como 100% descubierto.
Tengo un proyecto de demostración, que crea un ensamblaje y lo utiliza. También puedo depurar el código inyectado. Pero si ejecuto la cobertura, el análisis o el perfilado, se cuenta, pero quiero medirlo.
Código:
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 para comprobar el código IL generado. Puedo depurar el código en VS. Pero cuando ejecuto la cobertura, simplemente se pierde el ensamblaje generado, si uso el directorio TEMP, o si imprimo el archivo DLL (como el de arriba) NO SE INCLUYE ARCHIVO en la cobertura (ni siquiera el ensamblaje principal).
Cuando ejecuto la creación de perfiles, solo puedo ver la invocación (reflexión), pero nada sobre el código generado. Cuando realizo el análisis (tengo algunos errores en el código inyectado, por ejemplo, no se utilizan los locales y el análisis ofc para todo), no se informan problemas del código inyectado. El código inyectado:
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;
}
}
}
Me gustaría utilizar la cobertura, la creación de perfiles y el análisis en el código generado (principalmente cobertura).
La cobertura del código Ok en VS 2012 no tiene soporte completo para el código generado dinámicamente.
Puede ejecutar nuestro comando de análisis para ver que su módulo se ha omitido por esta misma razón o es porque falta un símbolo / p