junit hudson cmake jenkins ctest

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: ...?)