Usando MBUnit no TeamCity
Pergunta
Estou compilando um projeto NAnt no Linux com o servidor TeamCity Continuous Integration.Consegui gerar um relatório de teste executando o NAnt em mono por meio de um Command Line Runner, mas não tenho a opção de usar o relatório como um NAnt Runner.Também estou usando o MBUnit para a estrutura de testes.
Como posso mesclar o relatório de teste e exibir "Testes falhados:1 (1 novo), aprovado:3049" para a construção?
Atualizar: dê uma olhada em MBUnitTask, é uma tarefa NAnt que envia mensagens que o TeamCity espera do NUnit, permitindo que você use todos os recursos do TeamCity para testes.
Atualizar: Galio tem melhor suporte, então você só precisa fazer referência às dlls Galio MBUnit 3.5 em vez das dlls MBUnit 3.5 e mudar para o executor galio para fazê-lo funcionar.
Solução
Gálio agora tem extensão para gerar mensagens de serviço TeamCity.Basta usar o Gallio.NAntTasks.dll incluído e habilitar a extensão TeamCity.(esse não será necessário na próxima versão)
Outras dicas
TeamCity observa a saída da linha de comando da compilação.Você pode informar como estão seus testes inserindo certos marcadores nessa saída. Veja http://www.jetbrains.net/confluence/display/TCD3/Build+Script+Interaction+with+TeamCity.Por exemplo
##teamcity[testSuiteStarted name='Test1']
informará ao TeamCity que um conjunto de testes foi iniciado.Com MbUnit você não pode gerar esses marcadores enquanto os testes estão em execução, mas pode transformar o arquivo XML gerado.Aqui está o XSL que estou usando:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="assemblies/assembly">
##teamcity[testSuiteStarted name='<xsl:value-of select="@name" />']
<xsl:apply-templates select="//run" />
##teamcity[testSuiteFinished name='<xsl:value-of select="@name" />']
</xsl:template>
<xsl:template match="run">
<xsl:choose>
<xsl:when test="@result='ignore' or @result='skip'">
##teamcity[testIgnored name='<xsl:value-of select="@name" />' message='Test Ignored']
</xsl:when>
<xsl:otherwise>
##teamcity[testStarted name='<xsl:value-of select="@name" />']
</xsl:otherwise>
</xsl:choose>
<xsl:if test="@result='failure'">
##teamcity[testFailed name='<xsl:value-of select="@name" />' message='<xsl:value-of select="child::node()/message"/>' details='<xsl:value-of select="normalize-space(child::node()/stack-trace)"/>']
</xsl:if>
<xsl:if test="@result!='ignore' and @result!='skip'">
##teamcity[testFinished name='<xsl:value-of select="@name" />']
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Aqui está o que eu descobri
Como posso mesclar no relatório de teste?
Primeiro você precisará fazer com que o mbunit gere um relatório XML e HTML.Os argumentos da linha de comando são assim
/rt:Xml /rt:Html /rnf:mbunit /rf:..\reports
isso irá gerar os relatórios em um diretório chamado reports e o arquivo será chamado mbunit.xml e mbunit.html
em seguida, queremos adicionar esses arquivos como artefatos na compilação
build\reports\* => Reports
a última etapa é dizer ao teamcity para adicioná-lo como uma guia para a construção
Encontre o .BuildServer config main-config.xml e adicione esta linha (no Windows, este está em C: Documentos e Configurações , no Linux estava no /ROOT DIR)
<report-tab title="Tests" basePath="Reports" startPage="mbunit.html" />
Como posso exibir "Testes falhados:1 (1 novo), aprovado:3049" para a construção?
TeamCity procura um arquivo chamado teamcity-info.xml onde você pode colar mensagens para serem exibidas.A contagem real do teste é, na verdade, apenas texto simples.Acho que você pode simplesmente adicionar o arquivo como um artefato, mas também o coloquei no diretório raiz da compilação.
no NAnt você vai querer usar este comando para fazer um XSLT no MBUnit XML Report
<style style="includes\teamcity-info.xsl" in="reports\mbunit.xml" out="..\teamcity-info.xml" />
o xsl real se parece com isso.(Observação:que { e } são reservados em xsl, então temos que usar parâmetros)
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="cbl" select="'{'"/>
<xsl:param name="cbr" select="'}'"/>
<xsl:template match="/">
<xsl:for-each select="report-result/counter">
<build number="1.0.{concat($cbl,'build.number',$cbr)}">
<xsl:if test="@failure-count > 0">
<statusInfo status="FAILURE">
<text action="append"> Tests failed: <xsl:value-of select="@failure-count"/>, passed: <xsl:value-of select="@success-count"/></text>
</statusInfo>
</xsl:if>
<xsl:if test="@failure-count = 0">
<statusInfo status="SUCCESS">
<text action="append"> Tests passed: <xsl:value-of select="@success-count"/></text>
</statusInfo>
</xsl:if>
</build>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Isso lhe dará um arquivo parecido com este
<build number="1.0.{build.number}">
<statusInfo status="FAILURE">
<text action="append">Tests failed: 16, passed: 88</text>
</statusInfo>
</build>
Gadget da barra lateral TeamCity para Windows Vista, Windows 7http://teamcity-gadget.com