2011-06-13 7 views

Respuesta

14

En Jenkins, después de la parte CMake (probablemente hecha a través del plugin de CMake), agregue la siguiente secuencia de comandos por lotes, o adaptar para construye 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 construcción en el CMake plugin de
  • Tests es el subdirectorio donde todas mis pruebas viven
  • -T Test hace CTest de salida en XML (?!)
  • verify >nul restablece el nivel de error a 0, porque CTest devuelve> 0 si falla alguna prueba, lo que Jenkins interpreta como "no se pudo completar la compilación", que no queremos
  • La última línea convierte el XML de CTest en JUnit xml. La secuencia de comandos de Python y xslt viven en el directorio de origen, es posible que desee cambiar eso.

El script en Python se parece a esto (hackeado en 10 min, 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) 
  • Se necesita lxml, direct link
  • Tiene dos argumentos, el directorio en el que las pruebas en vivo (en el directorio de compilación), y un archivo xsl
  • Simplemente lee los últimos resultados de las pruebas xml, lo transforma con xsl y lo envía a stdout
  • Las últimas pruebas "xml" están presentes en la primera línea del archivo Testing/TAG, de ahí el adicional fopen

el XSL se parece a esto. Es bastante mínima, pero hace el trabajo: [editar] Véase MOnsDaR 's versión mejorada: 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> 

Por último, verificación 'Publicar las pruebas JUnit resultados'(o similar, mi versión es en francés) y establecer el xml ruta a build_32/JUnitTestResults.xml

Bueno, eso fue feo. Pero aún así, espero que esto ayude a alguien. Y las mejoras son bienvenidas (¿ejecutando ctest de python quizás? Usando la ruta del complemento de Python en lugar de C: ...?)

+0

Muchas gracias por esta solución. Actualmente estoy jugando con eso y básicamente funciona perfecto para mí. – MOnsDaR

+5

Mejore su código XSL para admitir más funciones de CTest XML-Output: http://pastebin.com/GAj7Fzqd Ahora agrega el tiempo de ejecución de las pruebas y, en caso de error, agrega errortype y errorcode como mensaje. Comente si hay alguna otra cosa que pueda agregarse al JUnit-File generado. – MOnsDaR

+1

La nueva versión admite el -Etiquetas de JUnit y almacena adicionalmente las propiedades como salida de sistema (para que puedan verse en Jenkins): http://pastebin.com/3mQ2ZQfa – MOnsDaR

Cuestiones relacionadas