VS2013 CodeCoverage.exe runsettings文件从未解析(VS2013 C

2019-10-22 14:09发布

环境:Visual Studio的2013高级版,Win7Ultimate,CodeCoverage.exe

目标:代码覆盖率报告排除测试项目代码,后来被转换为.coveragexml为以SonarQube 5.1报告。

烦恼我甚至不知道这个解析错误的不添加/verbose切换到命令。 我只发生故障的指示是在我加入不再正在生成.coverage文件/config开关。

文件的工作在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模板文件无需修改

MSDN的样本文件

已完成的空白文件,没有任何内容:错误

只用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架构的点。

更新

作品给我想要的输出,只是不能用于下一步中指定的文件位置

%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

仍在寻找答案。

Answer 1:

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

这样你的命令就变成了:

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



Answer 2:

我有同样的问题,发现你的问题对我的错误一些信息搜索时。 我的假设已经还了配置文件格式是一样的加入后使用vstest.console.exe但是从解析错误的.runsettings /详细然后,我怀疑这是一个不同的格式,这样一看,看看是否有对于CodeCoverage.exe一个默认的配置,看看是什么样子的,我也找到一个在:

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

和格式似乎只是成为.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


Answer 3:

好吧,这里谈到的HACK !!!!

基本步骤:

  • 查找并删除所有* .coverage文件
  • WITHOUT [codecoverage.exe收集]运行vstest命令封套
  • 寻找新的* .coverage文件,发送给[codecoverage.exe分析]命令

细节

我更新我一直在使用执行这一切做的基本步骤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和寻找完美的或任何逻辑,你能想到的是正确的单个文件,所以我不会要删除所有我的其他* .coverage文件最近或。 我可以,但我并没有因为这是应该不应该有这种历史在我看来,反正周围铺设构建服务器上运行。



文章来源: VS2013 CodeCoverage.exe runsettings file never parses