junit - Cómo obtener los mejores resultados en Hudson/Jenkins
cmake ctest (1)
Estoy usando CTest (parte de CMake) para mis pruebas automatizadas.
¿Cómo obtengo los resultados de CTest en el panel de Jenkins? O, expresado de manera diferente, ¿cómo puedo hacer que CTest produzca en un XML similar a JUnit?
En Jenkins, después de la parte CMake (probablemente hecha a través del complemento CMake), agregue el siguiente script por lotes o adáptelo para compilaciones en 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
es el directorio de compilación en el complemento CMake -
Tests
es el subdirectorio donde viven todos mis tests. -
-T Test
realiza la salida CTest en XML (?!) -
verify >nul
restablece errorlevel a 0, porque CTest devuelve> 0 si falla alguna prueba, lo que Jenkins interpreta como "la compilación completa falló", lo cual no queremos - La última línea convierte el XML de CTest en un XML mínimo de JUnit. La secuencia de comandos de Python y xslt viven en el directorio de origen, es posible que desee cambiar eso.
La secuencia de comandos de Python se ve así (hackeado juntos en 10 minutos, ten 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)
- Necesita lxml, enlace directo.
- Toma dos argumentos, el directorio en el que se encuentran las pruebas (en el directorio de compilación) y un archivo xsl
- Simplemente lee los últimos resultados de las pruebas xml, los transforma con xsl y los envía a la salida estándar.
- Las "últimas pruebas xml" están presentes en la primera línea del archivo de
Testing/TAG
, por lo tanto, el fopen adicional
El xsl se ve así. Es bastante mínimo pero hace el trabajo: [EDITAR] ver la versión mejorada de 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, marque "Publicar los resultados de las pruebas de JUnit" (o similar, mi versión está en francés) y configure la ruta xml en build_32/JUnitTestResults.xml
Bueno, eso fue feo. Pero aún así, espero que esto ayude a alguien. ¿Y las mejoras son bienvenidas (ejecutar ctest desde python? ¿Usando la ruta del complemento de Python en lugar de C: ...?)