Как мне включить полные результаты PartCover в TeamCity 5?

Я пытаюсь заставить отчеты 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, если это возможно, а не другой агент сборки.


person Jim Geurts    schedule 13.12.2009    source источник
comment
Хороший вопрос. Есть новости по этому поводу?   -  person Romain Verdier    schedule 05.01.2010


Ответы (5)


У меня была такая же проблема с отчетами PartCover. Итак, я пытался заставить его работать правильно и только что обнаружил, что проблема заключалась в двух файлах XSLT, которые поставляются с дистрибутивом PartCover.

Я исправил эти файлы, и теперь у меня все работает нормально:

отчет по сборкам

<?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>

Я надеюсь, вы найдете это полезным. Также приветствуются любые отзывы об этих файлах, поэтому мы можем предоставить сообществу правильные файлы.

person yeyeyerman    schedule 19.01.2010
comment
В отчете по сборке отсутствуют некоторые закрывающие теги - person Sam Mackrill; 29.04.2010
comment
Я расширил этот отчет подробностями о покрытии на уровне методов, см. Ссылку в моем ответе ниже. - person Gaspar Nagy; 20.09.2010

Немного поиграв с фиксированными отчетами от yeyeyerman, я наконец создал совершенно новый отчет XSLT, который также содержит детали покрытия на уровне методов и некоторые другие интересные вещи.

Вы можете загрузить XSLT из моего сообщения в блоге здесь: http://gasparnagy.blogspot.com/2010/09/detailed-report-for-partcover-in.html

person Gaspar Nagy    schedule 20.09.2010
comment
Это лучший XSLT. Спасибо за ссылку - person msi; 30.09.2011
comment
Ссылка мертвая .. есть ли шанс, что код размещен где-то еще? Спасибо - person trailmax; 03.05.2013

Я только что столкнулся с этой проблемой. Я думал, что решил проблему, используя ответ yeyeyerman. Действительно, он будет построен, но, прочитав отчет о сборке, я увидел, что «отчет по сборке» не может быть скомпилирован. Причина в том, что в "отчете по сборке" в самом конце отсутствовали 2 строки xml:

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

Добавление этого в конец файла решило проблему компиляции таблицы стилей, поскольку раньше теги не закрывались должным образом :).

person Stenner    schedule 03.03.2010

Проблема может заключаться только в xsl - я изначально предполагал, что файлы, установленные с partcover, будут работать без изменений, но, похоже, он не соответствует входному файлу - первая значимая строка

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

что сильно отличается от

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

Расчеты размера кода также кажутся неверными - это должно быть ./Method/pt, а не ./method/code/pt

person Tom Clarkson    schedule 03.01.2010

Убедитесь, что тесты выполняются под x86. Убедитесь, что partcover установлен в C: \ Program Files \ PartCover .NET 2.3 \ xslt на машине с агентом сборки.

Убедитесь, что служба Windows агента сборки работает под учетной записью администратора, но не под учетной записью ЛОКАЛЬНОЙ СИСТЕМЫ.

person Eugene Petrenko    schedule 20.12.2009
comment
Все настроено правильно. Я все еще получаю пустые отчеты. Кроме того, у меня изначально была установлена ​​служба агента сборки для локальной системы с установленным флажком «Разрешить взаимодействие с рабочим столом». Это тоже приемлемо, или он должен работать под учетной записью администратора? Кстати, в настоящее время я настроил его как учетную запись локального администратора, но безуспешно. - person Jim Geurts; 21.12.2009
comment
Рекомендуется запускать службу агента сборки под какой-либо реальной учетной записью администратора. Прикрепите полученный файл результатов PartCover, убедитесь, что структура файла соответствует xslt, который вы использовали. Полученный результат должен быть добавлен как артефакт. - person Eugene Petrenko; 29.12.2009