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来检查所生成的IL代码。我可以在VS中调试代码。但是当我运行覆盖时,如果我使用TEMP目录,或者如果我输出DLL(如上所述),那么生成的程序集就会错过,而且覆盖范围内没有FILE(甚至不包括主程序集)。

当我运行分析时,我只能看到调用(反射),但没有关于生成的代码。当我进行分析时(我在注入的代码中有一些错误,例如没有使用过的本地代码,以及对所有东西都进行了分析),注入的代码没有报告任何问题。注入的代码:

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

我想对生成的代码(主要是覆盖率)使用coverage,分析和分析。

回答

1

在VS 2012中的好的代码覆盖率并没有完全支持动态生成的代码。

您可以run our analyze command看到你的模块已跳过这个同样的原因,还是因为缺少符号/ P

+0

也跳过了(这是我跳过代码覆盖后的第一次尝试)。此外jetbrains封面和其他工具错过。现在我正在更深入地讨论这个话题,希望下周会有结果,所以我会寄到这里。请评价我的问题,不管你认为它是否有用。 – 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> 

保存这一点。该文件的特殊之处在于CodeCoverage \ ModulePaths \ Include部分将其ModulePath子注释掉了。这将包括它在代码覆盖范围内找到的任何dll。

现在点击测试 - >测试设置 - >选择测试设置文件并指定dynamic.runsettings文件。您的代码覆盖范围现在将使用此自定义设置文件。

点击分析代码覆盖率并运行任何你喜欢的测试。您应该看到您DynamicCode.dll在你的覆盖率结果显示(我模糊了我的工作站名称如下):

enter image description here

请注意,我添加了一个新的方法将.cs.txt文件名为BONK并且它(正确)显示为100%被发现。