
Dans mon article de blog « Rapport de test simple à partir de Tosca via l'exécution de tests Jenkins », j'ai décrit, dans une première version, comment créer un rapport de test basique à partir des résultats de tests exécutés avec Jenkins, en utilisant des méthodes simples. L'expérience acquise depuis montre que l'approche décrite est probablement insuffisante dans la plupart des cas. Utiliser des cas de test Tosca pour générer des rapports est relativement chronophage et cette approche n'est pas évolutive. L'effort requis pour la mise en œuvre, la maintenance et l'exécution augmente au moins linéairement avec le nombre de cas de test à inclure dans le rapport. Initialement, j'avais envisagé une autre méthode pour extraire les données pertinentes des fichiers XML et utiliser les modules XML de Tosca. Cependant, il est désormais évident que le passage par Tosca est inutile. Ci-dessous, j'expliquerai comment générer le même rapport de test beaucoup plus efficacement à l'aide d'un script PowerShell.
Pour des raisons d'efficacité et de pertinence, la génération de rapports est plus rapide si les cas de test Tosca ne sont pas nécessaires. Dans ce cas, le processus de création d'un rapport de test est celui illustré à la figure 1.

La transformation XSL des fichiers de résultats Jenkins, du format XML au format CSV, est effectuée séquentiellement à l'aide d'un script PowerShell exécuté à la fin de chaque test. Un rapport de test au format HTML est ensuite généré à partir de ces données brutes.
Voici un exemple de fichier XML résultant de l'exécution du test Jenkins (voir la liste 1) :
Liste 1 : Exemple de fichier de résultats Jenkins au format XML
Les données pertinentes sont extraites du début de chaque élément.<testcase> extrait, plus précisément de cette partie :
nom du cas de test="Tests de fumée de financement – 01_Enregistrement de la propriété" heure="168.5116337" horodatage="2020-02-10T16:13:05.6008759+01:00" journal="+ Réussi…"
La transformation XML au format CSV est basée sur la feuille de style XSL suivante (voir la liste 2) :
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="text"/><xsl:template match="/"><xsl:for-each select="testsuites/testsuite/testcase"><xsl:value-of select="@name"/><xsl:text> ;</xsl:text><xsl:choose><xsl:when test="@timestamp = ''"><xsl:text> Non exécuté ; </xsl:text></xsl:when><xsl:otherwise><xsl:value-of select="substring(@timestamp,0,11)"/><xsl:text></xsl:text><xsl:value-of select="substring(@timestamp,12,8)"/><xsl:text> ;</xsl:text></xsl:otherwise></xsl:choose><xsl:choose><xsl:when test="not(@log)"><xsl:text> -- </xsl:text></xsl:when><xsl:otherwise><xsl:value-of select="substring(@log,3,6)"/><xsl:text></xsl:text></xsl:otherwise></xsl:choose></xsl:for-each></xsl:template></xsl:stylesheet>
Liste 2 : Feuille de style XSL pour la transformation XML
Le script PowerShell suivant extrait les données pertinentes pour le rapport de test à partir de ce fichier de résultats Jenkins au format XML et les enregistre au format CSV (voir la liste 3). Il s'inspire d'un script similaire décrit dans la section « Transformation XSL de documents XML via PowerShell » . Seules les fonctions pertinentes sont listées (par exemple, sans vérification des chemins ni gestion des erreurs).
# Transformation XML aux formats CSV et HTML à l'aide d'un fichier XSLT # Appel du script : *.ps1 [fichier(s) source(s) XML] [fichier XSLT] [Domaine] # Initialisation des paramètres param ( $xml = @("D:\Tosca\Resultat\Jenkins\Finanzieren\Eigenheim_Resultat.xml","D:\Tosca\Resultat\Jenkins\Finanzieren\ Smoketests_Resultat.xml"), $xslt = "D:\Tosca\Resultat\XSL\XSL-Stylesheet.xsl", $area = "Finanzieren") # Fonction de transformation XML function XML-Transformation($xml, $xsltFile, $area){ # Création d'un horodatage $timestamp = ([datetime]::now).tostring("yyyy-MM-dd HH-mm") # Définition du fichier de sortie CSV temporaire $csv = "D:\Tosca\Resultat\XSL\Testreport.csv" # Initialisation des fichiers de résultats avec le chemin $resultCSV = "D:\Tosca\Resultat\XSL\Report_" + $area + "_$timestamp.csv" $resultHTML = "D:\Tosca\Resultat\XSL\Report_" + $area + "_$timestamp.html" # Écriture de l'en-tête dans le fichier CSV Add-Content -Path $resultCSV -Value 'Test case;Timestamp;Test result' # Traitement du tableau de fichiers d'entrée XML ForEach ($xmlFile in $xml) { $xmlFile = resolve-path $xmlFile # Création de l'objet XSL $script:xslt = new-object system.xml.xsl.xslcompiledtransform $script:xslt = new-object system.xml.xsl.xsltransform $xslt.Load($xsltFile) # Charger le fichier XSLT $xslt.Transform($xmlFile, $csv) # Effectuer la transformation XSLT # Ajouter le résultat au fichier de résultats Add-Content -Path $resultCSV -Value (Get-Content $csv) -Encoding UTF8 } # Supprimer le fichier de sortie temporaire Remove-Item $csv}# Appel de fonction pour la transformation XML Transformation XML $xml $xslt $area
Liste 3 : Script PowerShell pour transformer un fichier XSL au format CSV
Les paramètres suivants peuvent être transmis lors de l'appel du script :
-xmlFichiers de résultats Jenkins au format XML sous forme de liste séparée par des virgules-xslChemin vers le fichier de style XSLT (facultatif, si spécifié dans le script)-areaDépartement (par exemple, Finance, Paiements)
Un autre paramètre pourrait être utilisé pour déterminer l'emplacement de stockage des fichiers de rapport générés.
Le résultat au format CSV ressemble à ceci, par exemple :
Tests de validation financière – Enregistrement de la propriété ; 10/02/2020 16:13:05 ; Réussi
Tests de validation financière – Enregistrement de l’assurance ; 10/02/2020 16:16:58 ; Réussi
Tests de validation financière – Constitution du financement ; 10/02/2020 16:19:37 ; Échec
Examen du portefeuille de prêts ; Non exécuté ;–
L'importation au format binaire de Microsoft Excel étant complexe et le rapport de test ayant pour principal objectif de fournir des informations sur les résultats, le format HTML est utilisé. Comme indiqué dans l'article précédent, l'importation Excel pourrait être effectuée avec Tosca. Cependant, cette méthode ne sera pas employée ici.
La transformation des données CSV brutes en un rapport de test HTML est réalisée grâce à la seconde partie du script PowerShell, à la fin de la fonction de transformation XML (voir la liste 4 ; extrait réduit).
$head = @"<title> Rapport de test</title><meta charset="utf-8"><style type="text/css"> BODY{background-color:#FFFFFF;color:black;font-family:Arial,sans-serif;font-size:14px;margin:25pt;} TABLE{border-width:2px;border-style:solid;border-color:black;border-collapse:collapse;} TH{border-width:1px;padding:8px;border-style:solid;border-color:black;background-color:#D5D8DC; font-size:18px;text-align:left;} TD{border-width:1px;padding:8px;border-style:solid;border-color:black;background-color:#F9F9F9;}</style><script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"></script><script type="text/javascript"> jQuery(document).ready(function(){ jQuery('td:contains("Passed")').css('background-color','#2ECC71'); jQuery('td:contains("Failed")').css('background-color','#EC7063'); jQuery('td:contains("--")').css('background-color','#D0D3D4'); });</script> "@ $body = "<h1> Rapport de test $area</h1> Import-Csv -Delimiter ";" -Path $resultCSV -Encoding UTF8 | ConvertTo-Html -Head $head -Body $body | Out-File $resultHTML
Liste 4 : Script PowerShell permettant de créer le rapport de test HTML à partir du fichier CSV
Le rapport de test au format HTML peut être conçu, par exemple, comme illustré sur la figure 2 :

Fig. 2 : Rapport de test au format HTML
La configuration pour exécuter le test Jenkins est présentée dans la liste 5 :
pipeline { agent any options { timeout(time: 120, unit: 'MINUTES') } parameters { choice(name: 'ENV', choices: ['CT', 'INT'], description: 'Sélectionner l'environnement') } environment { TRICENTIS_CI_HOME = 'C:\\Program Files (x86)\\TRICENTIS\\Tosca Testsuite\\ToscaCommander\\ToscaCI\\Client' TRICENTIS_CI_CONFIG = 'D:\\Tosca\\Configurations\\' TRICENTIS_CI_ENVIRONMENT = "${params.ENV}" JUNIT_RESULT_FILE = 'D:\\Tosca\\Result\\Jenkins\\Financing' } stages { stage('Créer une demande de prêt') { steps { parallel("Acquisition du logement"): { echo "Démarrage des tests Tosca pour le financement : Acquisition du logement" bat label: 'Acquisition', script: '"%TRICENTIS_CI_HOME%\\ToscaCIClient.exe" -t junit -r "%JUNIT_RESULT_FILE%\\Homeownership_Result.xml" -m distributed -c "%TRICENTIS_CI_CONFIG%\\%TRICENTIS_CI_ENVIRONMENT%_Financing_Homeownership.xml"' } ) } } stage('Tests neutres du processus') { steps { parallel("Tests de fumée": { echo "Démarrage des tests Tosca pour le financement : Tests de fumée" bat label: 'Tests de fumée', script: '"%TRICENTIS_CI_HOME%\\ToscaCIClient.exe" -t junit -r "%JUNIT_RESULT_FILE%\\Smoketests_Result.xml" -m distributed -c "%TRICENTIS_CI_CONFIG%\\%TRICENTIS_CI_ENVIRONMENT%_Financing_Smoketests.xml"' } ) } } stage('Testreport') { steps { parallel("Testreport": { echo "Démarrage du rapport de test" bat label: 'Testreport', script: '"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -ExecutionPolicy Bypass -Command "D:\\Tosca\\Resultat\\XSL\\XML-Transformation.ps1" -xml "%JUNIT_RESULT_FILE%\\Eigenheim_Resultat.xml,%JUNIT_RESULT_FILE%\\Smoketests_Resultat.xml" -area "Financing"' } ) } } }}
Liste 5 : Exemple de configuration Jenkins
Grâce à PowerShell, ce fichier de rapport peut être automatiquement envoyé en pièce jointe HTML aux destinataires souhaités (voir Envoi d'e-mails avec PowerShell). Le rapport de test peut également être intégré directement à l'e-mail si le format HTML est activé. Avec la méthode de génération HTML présentée dans l'exemple 4, la mise en surbrillance colorée du résultat du test est perdue, car l'exécution de JavaScript est généralement désactivée pour les e-mails HTML pour des raisons de sécurité. Cependant, des classes CSS peuvent être utilisées dans la colonne « Résultat du test » lors de la conversion du rapport CSV en code HTML pour une différenciation visuelle. Les définitions de script utilisant des fonctions jQuery sont alors inutiles. Le script adapté correspondant se trouve dans l'exemple 6.
$head = @"<title> Rapport de test</title><meta charset="utf-8"><style type="text/css"> BODY{background-color:#FFFFFF;color:black;font-family:Arial,sans-serif;font-size:14px;margin:25pt;} TABLE{border-width:2px;border-style:solid;border-color:black;border-collapse:collapse;} TH{border-width:1px;padding:8px;border-style:solid;border-color:black;background-color:#D5D8DC; font-size:18px;text-align:left;} TD{border-width:1px;padding:8px;border-style:solid;border-color:black;background-color:#F9F9F9;} TD.passed {background-color:#58D68D} TD.failed {background-color:#EC7063} TD.unexecuted {background-color:#D0D3D4}</style> "@ $body = "<h1> Rapport de test $area</h1> Import-Csv -Delimiter ";" -Path $resultCSV -Encoding UTF8 | ConvertTo-Html -Head $head -Body $body | ForEach { if ($_ -like "*<td> Réussi*") {$_ -remplacer "<td> Passé", "<td class=`"passed`"> Réussi"} elseif ($_ -like "*<td> Échec*") {$_ -remplacer "<td> Échoué","<td class=`"failed`"> Échec"} sinon {$_ -remplacer "<td> --", "<td class=`"unexecuted`"> --"}} | Sortie du fichier $resultHTML
Liste 6 : Script PowerShell adapté pour créer le rapport de test HTML à partir du fichier CSV
Une autre possibilité serait d'envoyer un courriel via un plugin Jenkins après l'exécution du test (ou de la compilation). Cependant, cette option n'a pas été étudiée plus en détail, car la méthode choisie permet un contrôle plus direct du processus.
Le mot de passe d'accès au serveur de messagerie doit être stocké de manière chiffrée. Ceci peut être réalisé en PowerShell à l'aide du code présenté dans l'exemple 7 :
$KeyFile = "C:\Temp\AES256.key"$PasswordFile = "C:\Temp\Password.txt"$Password = "Password"# Créer un fichier de clé avec AES-256$CryptoKey = New-Object Byte[] 32[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($CryptoKey)$CryptoKey | out-file $KeyFile# Chiffrer le mot de passe$CryptoKey = Get-Content $KeyFile$SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force$SecurePassword | ConvertFrom-SecureString -key $CryptoKey | Out-File $PasswordFile
Exemple 7 : Générer un mot de passe chiffré dans PowerShell
Le rapport de test peut être inclus dans le corps principal de l'e-mail (voir la liste 8 – réduit au contenu essentiel, sans gestion des erreurs).
# Données d'accès$KeyFile = "C:\Temp\AES256.key"$PasswordFile = "C:\Temp\Password.txt"$MailUser = "Nom d'utilisateur"# Paramètres SMTP$PSEmailServer = "mail.example.com"$smtpFrom = "sender@example.com"$smtpTo = "recipient@example.com"$messageSubject = "Rapport de test " + $area$messageBody = (Get-Content ".\Report_Finanzieren_2020-02-10 16-32.html" | Out-String)# Générer les données d'accès$CryptoKey = Get-Content $KeyFile$creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $MailUser, (Get-Content $PasswordFile | ConvertTo-SecureString -Key $CryptoKey)# Envoyer un e-mail Send-MailMessage -Credential $creds -From $smtpFrom -To $smtpTo -Subject $messageSubject -Body $messageBody -BodyAsHtml -Encoding ([System.Text.Encoding]::UTF8) -port 587 -UseSsl
Liste 8 : Envoi automatique d’e-mails à l’aide de PowerShell
En fonction de la configuration de l'environnement spécifique, pour Send-MailMessage, seul le paramètre -port 25 peut être nécessaire au lieu des deux derniers paramètres, par exemple sur le serveur Jenkins.
L'utilisation de plugins Jenkins pour la génération et la distribution de rapports à partir de fichiers de résultats XML, tels que HTML Publisher ou Test Results Aggregator. Cependant, selon le cas d'utilisation, l'approche décrite ici offre une plus grande flexibilité, car sa configuration est plus facile à adapter, voire totalement adaptable (par exemple, lors de l'envoi de pièces jointes par e-mail).
Cette explication a démontré comment générer un rapport d'exécution de tests avec Jenkins en quelques secondes seulement. Comparée à l'utilisation de cas de test Tosca, la génération de ce rapport est beaucoup plus rapide. L'effort de configuration est considérablement réduit, car il n'est plus nécessaire de définir les structures pour chaque cas de test, mais seulement une fois par domaine, en fonction de la structure des fichiers de résultats Jenkins. Cette méthode de génération de rapports offre une plus grande flexibilité d'utilisation. Pour intégrer de nouveaux cas de test, il suffit d'ajuster les fichiers de configuration Jenkins. De plus, la diffusion du rapport par e-mail est un moyen efficace d'informer directement les parties prenantes concernées.
Souhaiteriez-vous bénéficier de notre expertise et mettre en œuvre des innovations technologiques ?


Vous avez une question ou souhaitez obtenir plus d'informations ? Laissez-nous vos coordonnées et nous vous rappellerons.