Как включить полные результаты 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, если это возможно, а не другого агента сборки.
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 > 0">
<xsl:variable name="coverage" select="ceiling(100 * $coveredCodeSize div $codeSize)"/>
<xsl:if test="$coverage >= 0 and $coverage < 20">
<xsl:attribute name="style">
<xsl:value-of select="$cov20style"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$coverage >= 20 and $coverage < 40">
<xsl:attribute name="style">
<xsl:value-of select="$cov40style"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$coverage >= 40 and $coverage < 60">
<xsl:attribute name="style">
<xsl:value-of select="$cov60style"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$coverage >= 60 and $coverage < 80">
<xsl:attribute name="style">
<xsl:value-of select="$cov80style"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$coverage >= 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 > 0">
<xsl:variable name="coverage" select="ceiling(100 * $coveredCodeSize div $codeSize)"/>
<xsl:if test="$coverage >= 0 and $coverage < 20"><xsl:attribute name="style"><xsl:value-of select="$cov20style"/></xsl:attribute></xsl:if>
<xsl:if test="$coverage >= 20 and $coverage < 40"><xsl:attribute name="style"><xsl:value-of select="$cov40style"/></xsl:attribute></xsl:if>
<xsl:if test="$coverage >= 40 and $coverage < 60"><xsl:attribute name="style"><xsl:value-of select="$cov60style"/></xsl:attribute></xsl:if>
<xsl:if test="$coverage >= 60 and $coverage < 80"><xsl:attribute name="style"><xsl:value-of select="$cov80style"/></xsl:attribute></xsl:if>
<xsl:if test="$coverage >= 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>
Я надеюсь, что вы найдете это полезным. Также приветствуются любые отзывы об этих файлах, поэтому мы можем предоставить пользователям правильные файлы.
Немного поиграв с фиксированными отчетами от yeyeyerman, я наконец-то создал совершенно новый отчет XSLT, который также содержит детали покрытия на уровне методов и некоторые другие интересные вещи.
Вы можете скачать XSLT из моего блога здесь: http://gasparnagy.blogspot.com/2010/09/detailed-report-for-partcover-in.html
Просто сам справился с этой проблемой. Я думал, что решил проблему, используя ответ Ейермана. Действительно, он будет собираться, но, читая отчет о сборке, я мог видеть, что "отчет по сборке" не может быть скомпилирован. Причина была в том, что в "отчете по сборке" отсутствовали две строки xml в самом конце:
</xsl:template>
</xsl:stylesheet>
Добавление этого в конец файла решило проблему компиляции таблицы стилей, так как теги не были должным образом закрыты раньше:).
Проблема может быть просто в xsl - я изначально предполагал, что файлы, установленные с partcover, будут работать без изменений, но, похоже, он не соответствует входному файлу - первая значимая строка
<xsl:for-each select="/PartCoverReport/type">
который сильно отличается от
<xsl:for-each select="/PartCoverReport/Type">
Расчеты размера кода также кажутся неверными - это должно быть./Method/pt, а не./method/code/pt
Пожалуйста, проверьте тесты под x86. Убедитесь, что partcover установлен в C:\Program Files\PartCover .NET 2.3\xslt на компьютере агента сборки.
Пожалуйста, проверьте, что служба Windows агента сборки работает под учетной записью администратора, но не под учетной записью LOCAL SYSTEM.