gpt4 book ai didi

c++ - TeamCity 中的 Visual Studio 企业代码覆盖率报告

转载 作者:太空狗 更新时间:2023-10-29 21:32:34 27 4
gpt4 key购买 nike

有没有人有将 Visual Studio Enterprise 2017 代码覆盖率结果(*.coverage 或 *.coveragexml)导入 TeamCity 的经验?我们正在测试 C++ 项目,因此我们不能使用内置覆盖率报告工具的 TeamCitys。

帮助页面 ( https://confluence.jetbrains.com/display/TCD10/Code+Coverage ) 暗示可能支持 MSTest/VSTest,但我没有找到任何(无论是在此处还是在 Google 上)提供的说明,甚至没有说明可以完成。

最佳答案

这比它应该的要复杂得多,但我是这样做的。

第一步是使用此 dll Microsoft.VisualStudio.Coverage.Analysis 访问类型 CoverageInfo 和 CoverageDS。然后,您可以执行以下操作:

 var infoFiles = new List<CoverageInfo>();

try
{
var paths = Directory.GetFiles(args[0], "*.coverage", SearchOption.AllDirectories);
infoFiles.AddRange(paths.Select(path => CoverageInfo.CreateFromFile(path, new string[] {path}, new string[] { })));
}
catch (Exception e)
{
Console.WriteLine("Error opening coverage data: {0}", e.Message);
return 1;
}

var coverageData = new List<CoverageDS>(infoFiles.Select(coverageInfo => coverageInfo.BuildDataSet()));
var data = coverageData.Aggregate(new CoverageDS(), CoverageDS.Join);

它为您提供了一个 CoverageDS 类型,代表它找到的任何覆盖率文件。然后您可以手动解析它以获取覆盖信息并使用 Teamcity 服务消息来写出覆盖信息。即向控制台写入类似这样的内容:

teamcity[buildStatisticValue key='CodeCoverageB' value='x']

其中 x 是覆盖 block 的百分比

可在此处找到服务器消息的完整列表:custom chart

我最终使用 fSharp xml 类型提供程序来解析 coverageinfo 以提供 block 覆盖率值。

namespace CoverageXMLParser

open FSharp.Data

type coverageXML = XmlProvider<"sample.xml">
type coverageStats = {coveredLines : int; totalLines : int}

module Parser =

let TeamcityStatAbsLinesCoveredString = "CodeCoverageAbsLCovered"
let TeamcityStatAbsTotalString = "CodeCoverageAbsLTotal"
let TeamcityStatCoveredBlocksString = "CodeCoverageB"
let (TeamcityServiceMessageString : Printf.TextWriterFormat<_>)= "##teamcity[buildStatisticValue key='%s' value='%f']"

let filterXML (xml: string) filter =
let coverage = coverageXML.Parse(xml)
let filtered = coverage.Modules |> Array.filter(fun x -> x.ModuleName.Contains(filter))
coverageXML.CoverageDsPriv(filtered, coverage.SourceFileNames).XElement.ToString()

let getModules (xml : string) =
coverageXML.Parse(xml).Modules

let filterModules (xml: string) filter =
getModules xml |> Array.filter(fun x -> x.ModuleName.Contains(filter))

let getCoveredBlocks modules =
modules |> Array.fold( fun acc (elem : coverageXML.Module) -> acc + elem.BlocksCovered ) 0

let getUnCoveredBlocks modules =
modules |> Array.fold( fun acc (elem : coverageXML.Module) -> acc + elem.BlocksNotCovered ) 0

let getCoveredLines modules =
modules |> Array.fold( fun acc (elem : coverageXML.Module) -> acc + elem.LinesCovered ) 0

let getUncoveredLines modules=
modules |> Array.fold( fun acc (elem : coverageXML.Module) -> acc + elem.LinesNotCovered) 0

let getPartialCoveredLines modules =
modules |> Array.fold( fun acc (elem : coverageXML.Module) -> acc + elem.LinesPartiallyCovered ) 0

let getCoverageLineStats modules =
let totalLines = getCoveredLines modules + getUncoveredLines modules + getPartialCoveredLines modules
{coveredLines = getCoveredLines modules; totalLines = totalLines}

let getCoveredBlocksPercent modules =
let covered = getCoveredBlocks modules
let uncovered = getUnCoveredBlocks modules
let percent = float covered / float (uncovered + covered)
percent * 100.0

let writeTeamcityCoverageMessageFromXml xml =
let filteredModules = filterModules xml "test"
printfn TeamcityServiceMessageString TeamcityStatCoveredBlocksString (getCoveredBlocksPercent filteredModules)

你需要做的就是创建一个新的 fsharp 项目,安装 brilliant fSharp.Data nuget 包并在项目目录中提供一个 sample.xml。可以通过调用 CoverageInfo 上的 getXml() 方法并写入文件来获取 sample.xml。最棒的是我可以使用 filterModules 函数过滤掉任何外部代码。

我通过在 teamcity 上运行此代码构建的工具来使用它,将其作为工件依赖项链接到我关心的构建。然后我在创建的覆盖率文件上运行单元测试调用该工具。呼,这很容易不是吗......

关于c++ - TeamCity 中的 Visual Studio 企业代码覆盖率报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54654296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com