gpt4 book ai didi

vb.net - Sonar Runner 在处理从 Visual Studio 的 MSTest 生成的 .coveragexml 文件期间出错

转载 作者:行者123 更新时间:2023-12-04 17:34:44 25 4
gpt4 key购买 nike

我正在尝试处理从命令行使用 MSTest 后获得的 .coveragexml 文件(在转换 .coverage 文件后),但 Sonar Runner 在尝试解析文件时一直失败。
错误包括解析错误,例如意外的“?”以及无法在文件中找到标签。

我尝试了几种方法来获取 .coveragexml 文件:从命令行使用“vsinstr -coverage ...”和“start vsperfmon -coverage ...”命令(然后运行 ​​MSTest),更改
.testrunco​​nfig 文件并指出我想要覆盖的 dll,并尝试使用“CodeCoverage.exe collect ...”。前两个让我成功地获取了代码覆盖率数据,
但是我在获取“CodeCoverage.exe collect ...”来收集结果时遇到了问题。即使我可以从前两个收集代码覆盖率结果,.coveragexml 文件是
生成的似乎不是 SonarQube 接受的正确格式,即使他们在他们的 VB.NET 插件网页上指出他们支持 MSTest 和 VSTest XML 代码覆盖率文件。
我已经尝试使用 VSTest 并且可以让我的 .coveragexml 文件被 Sonarqube 接受而没有任何错误就好了。问题是我实习的公司使用 MSTest 来运行所有
他们的单元测试,所以我需要使用 MSTest 获取 .coveragexml 数据。

我注意到的另一件事是,当我尝试在 Visual Studio 中将 .coverage 文件导出为 .coveragexml 时(对于 MSTest 或 VSTest),它会生成一个 .coveragexml 格式,Sonarqube
不接受(它只是由于我上面提到的错误而出错)。当我使用“CodeCoverage.exe 分析...”命令从 VSTest 转换 .coverage 文件时,它会产生一个
Sonarqube 接受的 .coveragexml 格式,因为我没有收到任何错误,并且可以在仪表板上看到我的代码覆盖率结果。现在,当我尝试使用“CodeCoverage.exe 分析...”命令进行转换时
来自 MSTest 的 .coverage 文件,没有任何 react 。不会生成 .coveragexml 文件,也不会给出任何错误或任何类型的反馈。我也尝试编写一个 C# 方法来转换 .coverage
使用 Microsoft.VisualStudio.Coverage.Analysis 将文件转换为 .coveragexml 文件。但它生成的 .coveragexml 文件格式与我从 Visual Studio 导出的文件格式相同。

其他可能有助于了解的事项:

  • 我正在对 VB.NET 代码进行分析。
  • 我正在使用 Sonarqube 的 VB.NET 插件的 2.2 版。
  • 我使用的是 Sonarqube 4.3.2 版和 SonarQube Runner 2.4 版。
  • 我正在使用 Visual Studio 2013 Premium。

  • (SonarQube 出错)
    .coveragexml 文件从 Visual Studio 导出后的格式是这样的:
    <CoverageDSPriv>
    <xs:schema ...>
    ...
    </xs:schema>
    <Module>
    <ModuleName>...</ModuleName>
    <ImageSize>...</ImageSize>
    ...
    <NameSpaceTable>
    <BlocksCovered>...</BlocksCovered>
    ...

    (SonarQube 接受)
    使用“CodeCoverage.exe 分析...”后.coveragexml 文件的格式(仅适用于VSTest 的.coverage 文件)
    <?xml version="1.0" encoding="UTF-8" ?>
    <results>
    <modules>
    <module name="..." path="..." id="..." block_coverage="..." line_coverage="..." blocks_covered="..." ... >
    <functions>
    <function id="..." token="..." name="..." type_name="..." block_coverage="..." >
    ...

    看起来这个数据有两种完全不同的模式,SonarQube 只接受其中一种,是这样吗?还有另一种方法可以将 .coverage 数据转换为 SonarQube 接受的数据吗?

    最佳答案

    我创建了这个 XSLT 来以良好的格式转换coveragexml 文件。

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="CoverageDSPriv">
    <results>
    <modules>
    <xsl:for-each select="Module">
    <xsl:element name="module">
    <xsl:attribute name="name">
    <xsl:value-of select="ModuleName"/>
    </xsl:attribute>
    <xsl:attribute name="path">
    <xsl:value-of select="ModuleName"/>
    </xsl:attribute>
    <xsl:attribute name="block_coverage">
    <xsl:value-of select="BlocksCovered div (BlocksCovered + BlocksNotCovered) * 100"/>
    </xsl:attribute>
    <xsl:attribute name="line_coverage">
    <xsl:value-of select="LinesCovered div (LinesCovered + LinesPartiallyCovered + LinesNotCovered) * 100"/>
    </xsl:attribute>
    <xsl:attribute name="blocks_covered">
    <xsl:value-of select="BlocksCovered"/>
    </xsl:attribute>
    <xsl:attribute name="blocks_not_covered">
    <xsl:value-of select="BlocksNotCovered"/>
    </xsl:attribute>
    <xsl:attribute name="lines_covered">
    <xsl:value-of select="LinesCovered"/>
    </xsl:attribute>
    <xsl:attribute name="lines_partially_covered">
    <xsl:value-of select="LinesPartiallyCovered"/>
    </xsl:attribute>
    <xsl:attribute name="lines_not_covered">
    <xsl:value-of select="LinesNotCovered"/>
    </xsl:attribute>
    <xsl:for-each select="NamespaceTable">
    <xsl:for-each select="Class">
    <functions>
    <xsl:for-each select="Method">
    <xsl:element name="function">
    <xsl:attribute name="name">
    <xsl:value-of select="substring-before(MethodName, '()')"/>
    </xsl:attribute>
    <xsl:attribute name="type_name">
    <xsl:value-of select="../ClassName"/>
    </xsl:attribute>
    <xsl:attribute name="block_coverage">
    <xsl:value-of select="BlocksCovered div (BlocksCovered + BlocksNotCovered) * 100"/>
    </xsl:attribute>
    <xsl:attribute name="line_coverage">
    <xsl:value-of select="LinesCovered div (LinesCovered + LinesPartiallyCovered + LinesNotCovered) * 100"/>
    </xsl:attribute>
    <xsl:attribute name="blocks_covered">
    <xsl:value-of select="BlocksCovered"/>
    </xsl:attribute>
    <xsl:attribute name="blocks_not_covered">
    <xsl:value-of select="BlocksNotCovered"/>
    </xsl:attribute>
    <xsl:attribute name="lines_covered">
    <xsl:value-of select="LinesCovered"/>
    </xsl:attribute>
    <xsl:attribute name="lines_partially_covered">
    <xsl:value-of select="LinesPartiallyCovered"/>
    </xsl:attribute>
    <xsl:attribute name="lines_not_covered">
    <xsl:value-of select="LinesNotCovered"/>
    </xsl:attribute>
    <ranges>
    <xsl:for-each select="Lines">
    <xsl:element name="range">
    <xsl:attribute name="source_id">
    <xsl:value-of select="SourceFileID"/>
    </xsl:attribute>
    <xsl:attribute name="covered">
    <xsl:choose>
    <xsl:when test="Coverage=0">yes</xsl:when>
    <xsl:when test="Coverage=1">partial</xsl:when>
    <xsl:when test="Coverage=2">no</xsl:when>
    </xsl:choose>
    </xsl:attribute>
    <xsl:attribute name="start_line">
    <xsl:value-of select="LnStart"/>
    </xsl:attribute>
    <xsl:attribute name="start_column">
    <xsl:value-of select="ColStart"/>
    </xsl:attribute>
    <xsl:attribute name="end_line">
    <xsl:value-of select="LnEnd"/>
    </xsl:attribute>
    <xsl:attribute name="end_column">
    <xsl:value-of select="ColEnd"/>
    </xsl:attribute>
    </xsl:element>
    </xsl:for-each>
    </ranges>
    </xsl:element>
    </xsl:for-each>
    </functions>
    <source_files>
    <xsl:for-each select="../../../SourceFileNames">
    <xsl:element name="source_file">
    <xsl:attribute name="id">
    <xsl:value-of select="SourceFileID"/>
    </xsl:attribute>
    <xsl:attribute name="path">
    <xsl:value-of select="SourceFileName"/>
    </xsl:attribute>
    </xsl:element>
    </xsl:for-each>
    </source_files>
    </xsl:for-each>
    </xsl:for-each>
    </xsl:element>
    </xsl:for-each>
    </modules>
    </results>
    </xsl:template>

    关于vb.net - Sonar Runner 在处理从 Visual Studio 的 MSTest 生成的 .coveragexml 文件期间出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25059696/

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