VS2013 CodeCoverage.exe runsettings文件永远不会解析

时间:2015-04-09 07:35:23

标签: c# visual-studio visual-studio-2013 sonarqube code-coverage

环境: Visual Studio 2013 Premium,W​​in7Ultimate,CodeCoverage.exe

目标:代码覆盖率报告,不包括测试项目代码,以便稍后转换为.coveragexml以便向SonarQube 5.1报告。

烦恼如果不在命令中添加/verbose开关,我甚至都不知道这个解析错误。我唯一的失败迹象是当我添加/config开关时,不再生成.coverage文件。

文件在VS2013 IDE中工作: MyProject.runsettings文件使用IDE中的“分析代码覆盖率”提供预期输出。

Menu: Test | Test Settings | Select Test Settings File... MyProject.runsettings

Menu: Test | Analyze Code Coverage | All Tests

尝试运行CodeCoverage.exe文件为我的测试生成代码覆盖率我似乎无法使用任何*.runsettings文件而不会出现错误:

"Error: Failed to parse configuration file <configfile>.runsettings"

路径定义:

codeCoveragePath = C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Dynamic Code Coverage Tools

vstestpath = C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow

myProjectOutputPath = assume correct since I get results when not using /config switch

运行命令接收错误(假设路径正确): 注意:我没有使用/verbose切换显示,因为我不应该在工作条件下使用它

%codeCoveragePath%\CodeCoverage.exe collect /config:MyProject.runsettings /output:CoverageOutput.coverage %vstestpath%\vstest.console.exe %myProjectOutputPath%\MyClass.Tests.Unit.dll

如果我不使用/config选项,则可以使用如果我从运行命令中删除/config:MyProject.runsettings,我会得到包含测试项目的完整报告,但是,让我知道命令的其余部分是正确的,它只是不喜欢runsettings文件。

我尝试过使用以下示例:

Visual Studio 2013 runsettings Template file WITHOUT modification

MSDN's sample file

已完成空白文件,无内容:错误

仅包含xml声明的文件:错误

仅声明了RunSettings节点的文件:错误

我甚至也使用过MSDN的疑难解答提示:没有帮助。

MyProject.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>
              <Exclude>
                <ModulePath>.*\.Tests\.Unit\.dll$</ModulePath>
              </Exclude>
            </ModulePaths>
          </CodeCoverage>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

该文件似乎是正确的,因为IDE将使用它并在“代码覆盖率结果”窗口中生成正确的输出,只报告MyClass代码而不是任何MyClass.Tests.Unit代码。

我认为CodeCoverage.exe命令行不喜欢/ config选项,或者它使用的是不同的xml架构。

更新

Works 给出我想要的输出,只是无法为下一步指定文件位置

%vstestpath%\vstest.console.exe /Settings:MySettings.runsettings %myProjectOutputPath%\MyClass.Tests.Unit.dll

不起作用提供我想要的完全相反的输出(报告中只有test.dll覆盖)。

%codeCoveragePath%\CodeCoverage.exe collect /output:CoverageOutput.coverage %vstestpath%\vstest.console.exe /Settings:MySettings.runsettings %myProjectOutputPath%\MyClass.Tests.Unit.dll

仍在寻找答案。

3 个答案:

答案 0 :(得分:2)

我认为您需要使用vstest.console.exe标志(而不是CodeCoverage.exe的配置标志)在/Settings:后面指定runsettings文件。

这样你的命令就变成了:

  

%codeCoveragePath%\ CodeCoverage.exe收集   /output:CoverageOutput.coverage%vstestpath%\ vstest.console.exe   %myProjectOutputPath%\ MyClass.Tests.Unit.dll   /Settings:MyProject.runsettings。

答案 1 :(得分:0)

我遇到了同样的问题,在搜索有关错误的一些信息时发现了您的问题。我的假设也是配置文件格式与vstest.console.exe使用的.runsettings相同,但是在添加/ verbose之后从解析错误我怀疑它是一个不同的格式,所以看看是否有CodeCoverage.exe的默认配置,看看它是什么样的,我确实找到了一个:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.config

格式似乎只是内部&lt; CodeCoverage&gt; .runsettings格式的一部分

我现在已经过滤了工作但需要复制默认配置中的所有过滤器项目,因为它们现在没有加载,所以我最终使用如下配置:

<CodeCoverage>

  <ModulePaths>
    <Exclude>
    <ModulePath>.*\\unittests.dll</ModulePath>
    </Exclude>
  </ModulePaths>

  <Sources>
    <Exclude>
      <!--extracted from default CodeCoverage.config -->
      <Source>.*\\atlmfc\\.*</Source>
      <Source>.*\\vctools\\.*</Source>
      <Source>.*\\public\\sdk\\.*</Source>
      <Source>.*\\externalapis\\.*</Source>
      <Source>.*\\microsoft sdks\\.*</Source>
      <Source>.*\\vc\\include\\.*</Source>
    </Exclude>
  </Sources>

  <Functions>
    <Exclude>
      <!--extracted from default CodeCoverage.config -->
      <Function>^std::.*</Function>
      <Function>^ATL::.*</Function>
      <Function>.*::__GetTestMethodInfo.*</Function>
      <Function>.*__CxxPureMSILEntry.*</Function>
      <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
      <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
      <Function>.*::YOU_CAN_ONLY_DESIGNATE_ONE_.*</Function>
    </Exclude>
  </Functions>

</CodeCoverage>

和命令行:

CodeCoverage collect /output:coverage.dat /config:coverage.settings vstest.console unitTests.dll /Logger:trx /Settings:test.runsettings

答案 2 :(得分:0)

好的,HACK !!!!

基本步骤:

  
      
  • 查找并删除所有* .coverage文件
  •   
  • 运行vstest命令没有 [codecoverage.exe collect]包装器
  •   
  • 找到新的* .coverage文件并发送到[codecoverage.exe analyze]命令
  •   

<强>详情

我更新了我一直用来执行所有这些基本步骤的build.proj文件:

<PropertyGroup>
  <SqCodeCoverageResultsFile>VisualStudio.coveragexml</SqCodeCoverageResultsFile>
</PropertyGroup>
<Target Name="BuildTestAssemblyList"
      BeforeTargets="RunAllTestsWithCodeCoverageAndConvertToXmlOutput">
  <CreateItem Include="**\*.Tests.Unit.dll">
    <Output TaskParameter="Include" ItemName="TestAssemblies" />
  </CreateItem>
</Target>
<Target Name="BuildCoverageFileList"
      BeforeTargets="RunAllTestsWithCodeCoverageAndConvertToXmlOutput">
  <CreateItem Include="**\*.coverage">
    <Output TaskParameter="Include" ItemName="CoverageFiles" />
  </CreateItem>    
</Target>
<Target Name="RunAllTestsWithCodeCoverageAndConvertToXmlOutput">
  <Delete Condition="Exists($(SqCodeCoverageResultsFile))" Files="$(SqCodeCoverageResultsFile)" />
  <Delete Files="@(CoverageFiles)" />
  <Exec Command="&quot;$(VsTestExecutable)&quot; /EnableCodeCoverage /Settings:MyProject.runsettings /inIsolation /logger:trx  @(TestAssemblies->'&quot;%(FullPath)&quot;',' ') " /> 
  <CreateItem Include="**\*.coverage">
    <Output TaskParameter="Include" ItemName="NewCoverageFiles" />
  </CreateItem>    
  <Exec Command="&quot;$(VsCodeCoverageExecutable)&quot; analyze /output:&quot;$(SqCodeCoverageResultsFile)&quot; @(NewCoverageFiles->'&quot;%(FullPath)&quot;',' ') " />
</Target>`

现在运行CodeCoverage.exe分析命令,找到那些* .coverage文件现在将输出到我之前尝试实现的相同文件名,并获得我想要的结果。

MSBuild.SonarQube.Runner.exe获得它想要的东西,我有我想要的结果,世界可以再次开始旋转=)

改进:我可以使用CustomTask并搜索完整的或最新的或任何您能想到的正确单个文件的逻辑,因此我不必删除所有其他*。覆盖文件。我可以,但我没有,因为这应该是在一个构建服务器上运行,在我看来,不应该有这种历史。