Como chegar ctest resultado em Hudson / Jenkins
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?
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:? ...)