【问题标题】:How do I include full PartCover results with TeamCity 5?如何在 TeamCity 5 中包含完整的 PartCover 结果?
【发布时间】:2010-09-21 03:30:29
【问题描述】:

我正在尝试让 PartCover 报告在 TeamCity 5.0 中正确生成。当我单击构建详细信息中的代码覆盖率选项卡时,报告为空。

我正在使用 sln2008 构建代理,我的 PartCoverage 设置如下:

包括模式:

[*]*

报告 XSLT:

C:\Program Files\PartCover .NET 2.3\xslt\Report By Assembly.xslt=>ByAssembly.html
C:\Program Files\PartCover .NET 2.3\xslt\Report By Class.xslt=>ByClass.html

如果您可以描述如何在 TeamCity 发送的成功/失败构建的电子邮件中包含这些报告(或仅包含重要部分),则可以获得奖励积分。如果可能,我想继续使用 sln2008 构建代理,而不是其他构建代理。

【问题讨论】:

  • 好问题。这有什么更新吗?

标签: .net teamcity partcover


【解决方案1】:

我在使用 PartCover 报告时遇到了同样的问题。所以我一直在努力让它正常工作,我发现问题出在 PartCover 发行版附带的两个 XSLT 文件上。

我修复了这些文件,现在一切正常:

大会报告

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt">
  <xsl:output method="html" indent="yes"/>
    <xsl:template match="/">

    <xsl:variable name="cov0style" select="'background:#E79090;text-align:right;'"/>
    <xsl:variable name="cov20style" select="'background:#D79797;text-align:right;'"/>
    <xsl:variable name="cov40style" select="'background:#D7A0A0;text-align:right;'"/>
    <xsl:variable name="cov60style" select="'background:#C7A7A7;text-align:right;'"/>
    <xsl:variable name="cov80style" select="'background:#C0B0B0;text-align:right;'"/>
    <xsl:variable name="cov100style" select="'background:#D7D7D7;text-align:right;'"/>

<table style="border-collapse: collapse;">
  <tr style="font-weight:bold; background:whitesmoke;">
    <td colspan="2">Coverage by assembly</td>
  </tr>

  <xsl:variable name="asms" select="/PartCoverReport/Assembly"/>
  <xsl:for-each select="$asms">
    <xsl:variable name="current-asm-node" select="."/>
    <tr>

      <xsl:element name="td">
        <xsl:attribute name="style">background:ghostwhite; padding: 5px  30px 5px  5px;</xsl:attribute>
        <xsl:value-of select="$current-asm-node/@name"/>
      </xsl:element>

      <xsl:variable name="codeSize" select="sum(/PartCoverReport/Type[@asmref=$current-asm-node/@id]/Method/pt/@len)+0"/>
      <xsl:variable name="coveredCodeSize" select="sum(/PartCoverReport/Type[@asmref=$current-asm-node/@id]/Method/pt[@visit>0]/@len)+0"/>

      <xsl:element name="td">
        <xsl:if test="$codeSize=0">
          <xsl:attribute name="style">
            <xsl:value-of select="$cov0style"/>
          </xsl:attribute>
          0%
        </xsl:if>
        <xsl:if test="$codeSize &gt; 0">
          <xsl:variable name="coverage" select="ceiling(100 * $coveredCodeSize div $codeSize)"/>
          <xsl:if test="$coverage &gt;=  0 and $coverage &lt; 20">
            <xsl:attribute name="style">
              <xsl:value-of select="$cov20style"/>
            </xsl:attribute>
          </xsl:if>
          <xsl:if test="$coverage &gt;= 20 and $coverage &lt; 40">
            <xsl:attribute name="style">
              <xsl:value-of select="$cov40style"/>
            </xsl:attribute>
          </xsl:if>
          <xsl:if test="$coverage &gt;= 40 and $coverage &lt; 60">
            <xsl:attribute name="style">
              <xsl:value-of select="$cov60style"/>
            </xsl:attribute>
          </xsl:if>
          <xsl:if test="$coverage &gt;= 60 and $coverage &lt; 80">
            <xsl:attribute name="style">
              <xsl:value-of select="$cov80style"/>
            </xsl:attribute>
          </xsl:if>
          <xsl:if test="$coverage &gt;= 80">
            <xsl:attribute name="style">
              <xsl:value-of select="$cov100style"/>
            </xsl:attribute>
          </xsl:if>
          <xsl:value-of select="$coverage"/>%
        </xsl:if>
      </xsl:element>
    </tr>
  </xsl:for-each>
</table>

按类别报告

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt">
<xsl:output method="html" indent="no"/>

<xsl:template match="/">

<xsl:variable name="cov0style" select="'background:#FF4040;text-align:right;'"/>
<xsl:variable name="cov20style" select="'background:#F06060;text-align:right;'"/>
<xsl:variable name="cov40style" select="'background:#E78080;text-align:right;'"/>
<xsl:variable name="cov60style" select="'background:#E0A0A0;text-align:right;'"/>
<xsl:variable name="cov80style" select="'background:#D7B0B0;text-align:right;'"/>
<xsl:variable name="cov100style" select="'background:#E0E0E0;text-align:right;'"/>

<table style="border-collapse: collapse;">
    <tr style="font-weight:bold; background:whitesmoke;"><td colspan="2">Coverage by class</td></tr>

    <xsl:for-each select="/PartCoverReport/Type">
        <tr>

            <xsl:element name="td">
                <xsl:attribute name="style">background:ghostwhite; padding: 5px  30px 5px  5px;</xsl:attribute>
                <xsl:value-of select="@name"/>
            </xsl:element>

            <xsl:variable name="codeSize" select="sum(./Method/pt/@len)+0"/>
            <xsl:variable name="coveredCodeSize" select="sum(./Method/pt[@visit>0]/@len)+0"/>

            <xsl:element name="td">
                <xsl:if test="$codeSize=0">
                    <xsl:attribute name="style"><xsl:value-of select="$cov0style"/></xsl:attribute>
                    0%
                </xsl:if>

                <xsl:if test="$codeSize &gt; 0">
                    <xsl:variable name="coverage" select="ceiling(100 * $coveredCodeSize div $codeSize)"/>

                    <xsl:if test="$coverage &gt;=  0 and $coverage &lt; 20"><xsl:attribute name="style"><xsl:value-of select="$cov20style"/></xsl:attribute></xsl:if>
                    <xsl:if test="$coverage &gt;= 20 and $coverage &lt; 40"><xsl:attribute name="style"><xsl:value-of select="$cov40style"/></xsl:attribute></xsl:if>
                    <xsl:if test="$coverage &gt;= 40 and $coverage &lt; 60"><xsl:attribute name="style"><xsl:value-of select="$cov60style"/></xsl:attribute></xsl:if>
                    <xsl:if test="$coverage &gt;= 60 and $coverage &lt; 80"><xsl:attribute name="style"><xsl:value-of select="$cov80style"/></xsl:attribute></xsl:if>
                    <xsl:if test="$coverage &gt;= 80"><xsl:attribute name="style"><xsl:value-of select="$cov100style"/></xsl:attribute></xsl:if>
                    <xsl:value-of select="$coverage"/>%
                </xsl:if>

            </xsl:element>
        </tr>
    </xsl:for-each>
</table>    
</xsl:template>
</xsl:stylesheet>

我希望你觉得这很有用。此外,欢迎对此文件提出任何反馈,以便我们为社区提供正确的文件。

【讨论】:

  • 程序集报告缺少一些结束标记
  • 我已经用方法级别的覆盖细节扩展了这份报告,请参阅下面我的答案中的链接。
【解决方案2】:

在使用了 yeyeyerman 的固定报告之后,我终于创建了一个全新的 XSLT 报告,其中还包含方法级别的覆盖细节和一些其他有趣的东西。

您可以从我的博文下载 XSLT:http://gasparnagy.blogspot.com/2010/09/detailed-report-for-partcover-in.html

【讨论】:

  • 这是最好的 XSLT。谢谢你的链接
  • 链接已失效.. 代码是否有可能在其他地方发布?谢谢
【解决方案3】:

我自己刚刚解决了这个问题。我以为我通过使用 yeyeyerman 的答案解决了这个问题。确实,它会构建,但是阅读构建报告我可以看到“组装报告”无法编译。原因是“组装报告”最后缺少 2 行 xml:

</xsl:template>
</xsl:stylesheet>

将其添加到文件末尾解决了样式表编译问题,因为之前没有正确关闭标签:)。

【讨论】:

    【解决方案4】:

    问题可能只是 xsl - 我最初认为使用 partcover 安装的文件无需修改即可工作,但它似乎与输入文件不匹配 - 第一个重要的行是

    <xsl:for-each select="/PartCoverReport/type">
    

    完全不同
    <xsl:for-each select="/PartCoverReport/Type">
    

    代码大小的计算似乎也是错误的 - 它应该是 ./Method/pt 而不是 ./method/code/pt

    【讨论】:

      【解决方案5】:

      请检查测试是否在 x86 下运行。 确保 partcover 已安装到构建代理计算机上的 C:\Program Files\PartCover .NET 2.3\xslt。

      请检查构建代理 windows 服务是否在管理员用户帐户下运行,而不是在本地系统帐户下运行。

      【讨论】:

      • 一切设置正确。我仍然收到“空”的报告。另外,我最初确实将构建代理服务设置为本地系统,并选中了“允许服务与桌面交互”。这也是可以接受的,还是必须在管理员用户帐户下运行?顺便说一句,我目前确实将其设置为本地管理员用户帐户,但没有运气。
      • 建议在真实管理员账户下运行构建代理服务。请附上生成的 PartCover 结果文件,请检查文件结构是否与您使用的 xslt 匹配。生成的结果应作为工件添加。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 2020-05-07
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      相关资源
      最近更新 更多