Pergunta

Eu estou usando CTest (parte do CMake) para os meus testes automatizados.

Como posso obter resultados ctest no painel Jenkins? Ou, formulada de modo diferente, como faço para obter CTest para a saída em JUnit-como XML?

Foi útil?

Solução

Em Jenkins, após a parte CMake (provavelmente feita através do plugin CMake), adicione o seguinte script em lotes, ou adaptar para se baseia em Linux:

del build_32\JUnitTestResults.xml
pushd build_32\Tests
"C:\Program Files\CMake 2.8\bin\ctest.exe" -T Test -C RelWithDebInfo --output-on-failure
popd
verify >nul
C:\Python27\python.exe external/tool/CTest2JUnit.py build_32/Tests external/tool/CTest2JUnit.xsl > build_32/JUnitTestResults.xml
  • build_32 é o diretório de construção no CMake plug-in
  • Tests é o subdiretório onde todos os meus testes viver
  • -T Test torna saída CTest em XML (?!)
  • verify >nul redefine errorlevel a 0, porque ctest retornos> 0 se qualquer teste falhar, que interpreta Jenkins como "toda a compilação falhou", o que não queremos
  • A última linha converte XML do CTest em um mínima JUnit xml. O Python script eo XSLT ao vivo no diretório de origem, você pode querer mudar isso.

Os olhares script Python como este (cortado juntos em 10 min, cuidado):

from lxml import etree
import StringIO
import sys

TAGfile = open(sys.argv[1]+"/Testing/TAG", 'r')
dirname = TAGfile.readline().strip()

xmlfile = open(sys.argv[1]+"/Testing/"+dirname+"/Test.xml", 'r')
xslfile = open(sys.argv[2], 'r')

xmlcontent = xmlfile.read()
xslcontent = xslfile.read()

xmldoc = etree.parse(StringIO.StringIO(xmlcontent))
xslt_root = etree.XML(xslcontent)
transform = etree.XSLT(xslt_root)

result_tree = transform(xmldoc)
print(result_tree)
  • É preciso lxml, link direto
  • É preciso dois argumentos, o diretório no qual os testes viver (na pasta de compilação), e um arquivo XSL
  • Ele simplesmente lê a última xml testa resultados, transforma-o com o XSL, e saídas em stdout
  • Os "últimos testes XML" estão presentes na primeira linha do arquivo Testing/TAG, daí o fopen adicional

O xsl se parece com isso. É muito mínima, mas começa o trabalho feito: [editar] versão melhorada do MOnsDaR: http://pastebin.com/3mQ2ZQfa

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>

    <xsl:template match="/Site/Testing">    
        <testsuite>
            <xsl:apply-templates select="Test"/>
        </testsuite>
    </xsl:template>

    <xsl:template match="Test">
        <xsl:variable name="testcasename"><xsl:value-of select= "Name"/></xsl:variable>
        <xsl:variable name="testcaseclassname"><xsl:value-of select= "FullName"/></xsl:variable>
        <testcase name="{$testcasename}" classname="{$testcaseclassname}">
            <xsl:if test="@Status = 'passed'">
            </xsl:if>
            <xsl:if test="@Status = 'failed'">
                <error type="error"><xsl:value-of select="Results/Measurement/Value/text()" /></error>
            </xsl:if>
            <xsl:if test="@Status = 'notrun'">
                <skipped><xsl:value-of select="Results/Measurement/Value/text()" /></skipped>
            </xsl:if>
        </testcase>
    </xsl:template>

</xsl:stylesheet>

Finalmente, verifique "Publicar JUnit testa resultados" (ou similar, a minha versão é em francês) e definir o caminho xml para build_32/JUnitTestResults.xml

Bem, isso era feio. Mas ainda assim, espero que isso ajude alguém. E melhorias são bem-vindos (executando ctest de python talvez Usando o caminho do Python do plugin em vez de C:? ...)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top