环境: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
仍在寻找答案。
我相信你需要在后面指定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
我有同样的问题,发现你的问题对我的错误一些信息搜索时。 我的假设已经还了配置文件格式是一样的加入后使用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
好吧,这里谈到的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=""$(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和寻找完美的或任何逻辑,你能想到的是正确的单个文件,所以我不会要删除所有我的其他* .coverage文件最近或。 我可以,但我并没有因为这是应该不应该有这种历史在我看来,反正周围铺设构建服务器上运行。