环境: Visual Studio 2013 Premium,Win7Ultimate,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
已完成空白文件,无内容:错误
仅包含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
仍在寻找答案。
答案 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=""$(VsTestExecutable)" /EnableCodeCoverage /Settings:MyProject.runsettings /inIsolation /logger:trx @(TestAssemblies->'"%(FullPath)"',' ') " />
<CreateItem Include="**\*.coverage">
<Output TaskParameter="Include" ItemName="NewCoverageFiles" />
</CreateItem>
<Exec Command=""$(VsCodeCoverageExecutable)" analyze /output:"$(SqCodeCoverageResultsFile)" @(NewCoverageFiles->'"%(FullPath)"',' ') " />
</Target>`
现在运行CodeCoverage.exe分析命令,找到那些* .coverage文件现在将输出到我之前尝试实现的相同文件名,并获得我想要的结果。
MSBuild.SonarQube.Runner.exe获得它想要的东西,我有我想要的结果,世界可以再次开始旋转=)
改进:我可以使用CustomTask并搜索完整的或最新的或任何您能想到的正确单个文件的逻辑,因此我不必删除所有其他*。覆盖文件。我可以,但我没有,因为这应该是在一个构建服务器上运行,在我看来,不应该有这种历史。