2009-11-13 2 views
30

J'utilise les tâches ant 'junit' et 'junitreport' pour exécuter mes JUnit Tests et générer un rapport à la fin (=> "Unit Test Results").Rapport JUnit personnalisé?

Existe-t-il un moyen simple d'étendre cette sortie pour obtenir plus d'informations dans le rapport? Par exemple pour ajouter une colonne supplémentaire qui contient un lien vers une capture d'écran prise par le test.

J'ai vu que l'on pouvait écrire un coureur de test antiternite comme le EclipseTestRunner mais c'est un effort. N'y a-t-il pas d'API pour accéder aux éléments d'un rapport d'unité?

+0

quel type de capture d'écran recherchez vous? vous ne voulez pas seulement la trace de pile de l'erreur, vous cherchez la sortie de console, ou est-ce une représentation graphique? –

+1

Salut, je ne veux pas savoir comment obtenir une capture d'écran. J'ai déjà réalisé cela. Ce que je dois savoir, c'est comment puis-je étendre le rapport JUnit, afin que je puisse inclure un lien vers ma capture d'écran. Merci. – blackicecube

+1

Rien de neuf avec les dernières versions de jUnit? –

Répondre

35

La tâche junitreport utilise XSLT pour générer le rapport à partir des fichiers XML générés par la tâche junit.

Vous pouvez personnaliser la sortie en spécifiant votre propre XSLT en utilisant l'attribut styledir de l'élément report imbriqué:

<!-- use reportstyle/junit-frames.xsl to produce the report --> 
<report styledir="reportstyle" format="frames" todir="testreport"/> 

Pour la personnalisation de la sortie, une option serait de faire une copie du default XSLT et modifier cette. Ou vous pouvez rechercher un autre XSLT qui est plus facile à personnaliser pour vos besoins.

Pour les petites modifications, il peut être plus simple d'importer le fichier XSLT par défaut et de remplacer les modèles que vous souhaitez personnaliser. Par exemple, pour ajouter une colonne à chaque test, vous devez remplacer le modèle qui génère l'en-tête de la table et le modèle qui génère une ligne de table. Ci-dessous, je viens de copier ces modèles et de les modifier un peu pour ajouter une colonne (cherchez deux ajouts marqués <!-- ADDED -->).

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- import the default stylesheet --> 
    <xsl:import href="jar:file:lib/ant-junit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl"/> 

    <!-- override the template producing the test table header --> 
    <xsl:template name="testcase.test.header"> 
    <xsl:param name="show.class" select="''"/> 
    <tr valign="top"> 
     <xsl:if test="boolean($show.class)"> 
     <th>Class</th> 
     </xsl:if> 
     <th>Name</th> 
     <th>Status</th> 
     <th width="80%">Type</th> 
     <th nowrap="nowrap">Time(s)</th> 

     <!-- ADDED --> 
     <th>Screenshot</th> 

    </tr> 
    </xsl:template> 

    <!-- override the template producing a test table row --> 
    <xsl:template match="testcase" mode="print.test"> 
    <xsl:param name="show.class" select="''"/> 
    <tr valign="top"> 
     <xsl:attribute name="class"> 
     <xsl:choose> 
      <xsl:when test="error">Error</xsl:when> 
      <xsl:when test="failure">Failure</xsl:when> 
      <xsl:otherwise>TableRowColor</xsl:otherwise> 
     </xsl:choose> 
     </xsl:attribute> 
     <xsl:variable name="class.href"> 
     <xsl:value-of select="concat(translate(../@package,'.','/'), '/', ../@id, '_', ../@name, '.html')"/> 
     </xsl:variable> 
     <xsl:if test="boolean($show.class)"> 
     <td><a href="{$class.href}"><xsl:value-of select="../@name"/></a></td> 
     </xsl:if> 
     <td> 
     <a name="{@name}"/> 
     <xsl:choose> 
      <xsl:when test="boolean($show.class)"> 
      <a href="{concat($class.href, '#', @name)}"><xsl:value-of select="@name"/></a> 
      </xsl:when> 
      <xsl:otherwise> 
      <xsl:value-of select="@name"/> 
      </xsl:otherwise> 
     </xsl:choose> 
     </td> 
     <xsl:choose> 
     <xsl:when test="failure"> 
      <td>Failure</td> 
      <td><xsl:apply-templates select="failure"/></td> 
     </xsl:when> 
     <xsl:when test="error"> 
      <td>Error</td> 
      <td><xsl:apply-templates select="error"/></td> 
     </xsl:when> 
     <xsl:otherwise> 
      <td>Success</td> 
      <td></td> 
     </xsl:otherwise> 
     </xsl:choose> 
     <td> 
     <xsl:call-template name="display-time"> 
      <xsl:with-param name="value" select="@time"/> 
     </xsl:call-template> 
     </td> 

     <!-- ADDED --> 
     <td> 
     <a href="link/to/screenshot/for/test/{@name}">screenshot</a> 
     </td> 

    </tr> 
    </xsl:template> 

</xsl:stylesheet> 

Voilà comment le résultat ressemble à:

screenshot

+2

Salut, je ne veux pas appliquer un style différent à mon rapport. J'ai besoin d'étendre le rapport par des informations supplémentaires (personnalisées). Je dois donc pouvoir modifier les données du rapport, pas son style. Merci. – blackicecube

+0

Les données source du rapport généré par la tâche 'junitreport' proviennent des fichiers XML générés par la tâche' junit'. Cependant, en fonction de ces données, vous pouvez ajouter quelques informations supplémentaires au rapport. - Par exemple, si vos tests unitaires produisent des captures d'écran dans un emplacement connu avec des noms pouvant être dérivés des noms de tests unitaires, il est possible de créer des liens en personnalisant le style de rapport, comme dans l'exemple ci-dessus. (J'ai édité la réponse pour ajouter une capture d'écran du résultat final.) –

+0

Merci pour votre proposition! C'est une bonne approche pour commencer. C'est juste que je n'ai pas seulement une seule capture d'écran par méthode de test mais plusieurs captures d'écran, en fonction de ce qui est testé. Ainsi, les captures d'écran sont numérotées et nommées, par ex. TestClass-testMethod-01.png. Existe-t-il un moyen avec XSLT de "compter" le nombre de captures d'écran sur le système de fichiers qui "appartiennent" à la méthode de test? – blackicecube

0

Aussi, si vous ne voulez pas remplacer le fichier principal xsl, vous pouvez copier le fichier xsl dans le dossier racine du projet, mettre à jour avec vos modifications et enfin modifier votre fichier build.xml ajoutant styledir attribut:

<report styledir="." format="noframes" todir="${junit.output.dir}"/> 
0

impressionnant b ANS y Jukka. Ceci est une extension à la réponse de Jukka quant à la façon exactement vous pouvez lier la capture d'écran

<!-- ADDED --> 
    <td> 
    <a href="link/to/screenshot/for/test/{@name}">screenshot</a> 
    </td> 

Au lieu d'extrait ci-dessus dans les ans de Jukka, voici comment vous pouvez relier les captures d'écran:

<!-- Added screenshot link for failed tests --> 
    <td> 
     <xsl:variable name="class.name"> 
      <xsl:value-of select="translate(@classname,'.','/')"/> 
     </xsl:variable> 
     <xsl:variable name="junit.base"> 
      <xsl:call-template name="path"><xsl:with-param name="path" select="../@package"/></xsl:call-template> 
     </xsl:variable> 
    <xsl:choose> 
     <xsl:when test="failure"> 
      <a href="{concat($junit.base,$class.name,'/',@name,'.png')}"><xsl:value-of select="@name"/></a> 
     </xsl:when> 
     <xsl:when test="error"> 
      <a href="{concat($junit.base,$class.name,'/',@name,'.png')}"><xsl:value-of select="@name"/></a> 
     </xsl:when> 
    </xsl:choose> 
    </td> 

Tout ce que vous avez besoin faire après que le rapport de junit est généré est - copier toutes les captures d'écran du répertoire "sélenium/screenshots /" juste sous le répertoire junit_report.

Le code ci-dessus ajoutera un lien uniquement pour les tests ayant échoué. Si vous le voulez pour tous, modifiez le code en conséquence.