test results jenkins groovy junit jenkins-pipeline slack-api

results - Cómo acceder a los conteos de prueba de Junit en el proyecto Jenkins Pipeline



result analyzer (3)

A partir de esta presentación de Cloudbees, descubrí que debería ser posible a través del objeto "build". Tiene codigo como

def testResult = build.testResultAction def total = testResult.totalCount

Pero currentBuild no proporciona acceso a testResultAction.

Así que seguí buscando y encontré esta publicación "reaccionar en pruebas fallidas en el script de canalización" . Allí Robert Sandell ha dado "propina profesional".

Consejo profesional, requiere alguna "lista blanca personalizada":

AbstractTestResultAction testResultAction = currentBuild.rawBuild.getAction(AbstractTestResultAction.class) if (testResultAction != null) { echo "Tests: ${testResultAction.failCount} / ${testResultAction.failureDiffString} failures of ${testResultAction.totalCount}./n/n" }

Esto funcionó a la perfección, solo que tuve que deseleccionar la casilla de verificación "Groovy sandbox". Ahora tengo estos en el registro de compilación

Tests: 11 / ±0 failures of 2624

Ahora usaré esto para preparar la cadena para notificarlo con los resultados de las pruebas.

ACTUALIZAR:

Finalmente, la función que utilicé para obtener una salida como la siguiente (tenga en cuenta que la "falla de fallo" después de las pruebas fallidas es muy útil)

Test Status: Passed: 2628, Failed: 6 / ±0, Skipped: 0

Es el siguiente:

import hudson.tasks.test.AbstractTestResultAction @NonCPS def testStatuses() { def testStatus = "" AbstractTestResultAction testResultAction = currentBuild.rawBuild.getAction(AbstractTestResultAction.class) if (testResultAction != null) { def total = testResultAction.totalCount def failed = testResultAction.failCount def skipped = testResultAction.skipCount def passed = total - failed - skipped testStatus = "Test Status:/n Passed: ${passed}, Failed: ${failed} ${testResultAction.failureDiffString}, Skipped: ${skipped}" if (failed == 0) { currentBuild.result = ''SUCCESS'' } } return testStatus }

ACTUALIZACIÓN 2018-04-19

Tenga en cuenta que lo anterior requiere un manual de "lista blanca" de los métodos utilizados. Aquí es cómo puede hacer una lista blanca de todos los métodos de una sola vez

Actualizar manualmente la lista blanca ...

Salida Jenkins

Cree / actualice% USERPROFILE% .jenkins / scriptApproval.xml con el siguiente contenido

<?xml version=''1.0'' encoding=''UTF-8''?> <scriptApproval plugin="[email protected]"> <approvedScriptHashes> </approvedScriptHashes> <approvedSignatures> <string>method hudson.model.Actionable getAction java.lang.Class</string> <string>method hudson.model.Cause getShortDescription</string> <string>method hudson.model.Run getCauses</string> <string>method hudson.tasks.test.AbstractTestResultAction getFailCount</string> <string>method hudson.tasks.test.AbstractTestResultAction getFailureDiffString</string> <string>method hudson.tasks.test.AbstractTestResultAction getSkipCount</string> <string>method hudson.tasks.test.AbstractTestResultAction getTotalCount</string> <string>method org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper getRawBuild</string> </approvedSignatures> <aclApprovedSignatures/> <approvedClasspathEntries/> <pendingScripts/> <pendingSignatures/> <pendingClasspathEntries/> </scriptApproval>

  • Reiniciar Jenkins
  • y luego verifique que la "aprobación de script" tenga aprobadas las entradas anteriores
  • NOTA: Es lo que es importante. Por lo tanto, si el archivo de aprobación de script ya está allí, entonces generalmente deberá asegurarse de los contenidos de la etiqueta.

Acabo de empezar con Jenkins

Mi proyecto de estilo libre solía informar resultados de pruebas de JUnit en Slack como este

MyJenkinsFreestyle - #79 Unstable after 4 min 59 sec (Open) Test Status: Passed: 2482, Failed: 13, Skipped: 62

Ahora me he mudado de la misma forma al proyecto de canalización, y todo está bien, excepto que las notificaciones de Slack no tienen estado de prueba

done MyPipelineProject #68 UNSTABLE

Entiendo que tengo que construir el mensaje para enviar a Slack, y lo he hecho anteriormente por ahora.

El único problema es cómo leo el estado de la prueba: el conteo pasado, el conteo fallido, etc. Esto se denomina "resumen de la prueba" en la commit complemento de holgura de Jenkins, y aquí está la captura de pantalla

Entonces, ¿cómo accedo a las pruebas / detalles de Junit en el proyecto Jenkins Pipeline? - Para que estos se informen en las notificaciones.

ACTUALIZACIÓN: En el proyecto Freestyle, la propia notificación de Slack tiene el "resumen de la prueba", y no hay opción para optar (o no) por el resumen de la prueba.

En el proyecto Pipeline, mi comando "junit" para "Publicar resultados de prueba de JUnit" es antes de enviar una notificación de Slack.

Así que en el código esas líneas se ven así (estas son las últimas líneas de la última etapa):

bat runtests.bat junit ''junitreport/xml/TEST*.xml'' slackSend channel: ''#testschannel'', color: ''normal'', message: "done ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)";


En primer lugar, gracias por las respuestas anteriores. Me ahorraron mucho tiempo, usé la solución propuesta en mi canalización. Sin embargo, no usé "listas blancas" y funciona bien. Utilizo bibliotecas compartidas para la canalización de Jenkins y aquí hay una parte de esa biblioteca compartida con canalización y el uso de métodos para obtener recuentos:

import hudson.model.* import jenkins.model.* import hudson.tasks.test.AbstractTestResultAction def call(Closure body) { ... def emailTestReport = "" pipeline { ... stages{ stage(''Test''){ ... post { always { junit ''tests.xml'' script { AbstractTestResultAction testResultAction = currentBuild.rawBuild.getAction(AbstractTestResultAction.class) if (testResultAction != null) { def totalNumberOfTests = testResultAction.totalCount def failedNumberOfTests = testResultAction.failCount def failedDiff = testResultAction.failureDiffString def skippedNumberOfTests = testResultAction.skipCount def passedNumberOfTests = totalNumberOfTests - failedNumberOfTests - skippedNumberOfTests emailTestReport = "Tests Report:/n Passed: ${passedNumberOfTests}; Failed: ${failedNumberOfTests} ${failedDiff}; Skipped: ${skippedNumberOfTests} out of ${totalNumberOfTests} " } } mail to: ''[email protected]'', subject: "Tests are finished: ${currentBuild.fullDisplayName}", body: "Tests are finished ${env.BUILD_URL}/n Test Report: ${emailTestReport} " } } } } } }

ps Si creo emailTestRepot como una variable local dentro del script "sección" obtengo la siguiente excepción:

an exception which occurred: in field locals in field parent in field caller in field e in field program in field threads in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@11cd92de Caused: java.io.NotSerializableException: hudson.tasks.junit.TestResultAction ...

Luché mucho tratando de arreglar esa excepción java.io.NotSerializableException. Como entendí, necesitaba usar la "lista blanca" para evitar NotSerializableException. Pero realmente no quería hacerlo y cuando me moví "def emailTestReport" fuera de la tubería, funcionó bien.


Para ampliar la respuesta de @vikramsjn, esto es lo que uso para obtener el resumen de la prueba en mi archivo Jenkins :

import hudson.tasks.test.AbstractTestResultAction import hudson.model.Actionable @NonCPS def getTestSummary = { -> def testResultAction = currentBuild.rawBuild.getAction(AbstractTestResultAction.class) def summary = "" if (testResultAction != null) { def total = testResultAction.getTotalCount() def failed = testResultAction.getFailCount() def skipped = testResultAction.getSkipCount() summary = "Test results:/n/t" summary = summary + ("Passed: " + (total - failed - skipped)) summary = summary + (", Failed: " + failed) summary = summary + (", Skipped: " + skipped) } else { summary = "No tests found" } return summary }

Luego uso este método para crear una instancia de mi variable testSummary :

def testSummary = getTestSummary()

Esto devolverá algo similar a:

"Test results: Passed: 123, Failed: 0, Skipped: 0"