web-dev-qa-db-fra.com

Custom Junit Signaler?

J'utilise les tâches des ant 'Junit' et 'JunTriPort' pour exécuter mes tests Junit et générer un rapport à la fin (=> "résultats de test unitaire").

Existe-t-il un moyen facile d'étendre cette sortie d'une manière ou d'une autre pour obtenir plus d'informations affichées dans le rapport? Par exemple, d'ajouter une colonne supplémentaire contenant un lien vers une capture d'écran prise par le test.

J'ai vu que l'on pouvait écrire une propre première analyse de test de junit comme le eclipsetstrunner mais c'est tout à fait un effort. N'y a-t-il aucune API d'accéder aux éléments d'un rapport unitaire?

30
blackicecube

Le junitreport tâche utilise XSLT Pour produire le rapport des fichiers XML générés par le junittâche.

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

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

Pour personnaliser la sortie, une option serait de créer une copie de la touche par défaut XSLT et de modifier cela. Ou vous pouvez rechercher une alternative XSLT qui est plus facile à personnaliser à vos fins.

Pour de petits changements, il pourrait être plus facile de simplement importer la valeur XSLT par défaut et de remplacer les modèles que vous devez personnaliser. Par exemple, pour ajouter une colonne pour chaque test, vous devez remplacer le modèle qui produit l'en-tête de la table et le modèle qui produit une rangée de table. Ci-dessous, je viens de copier ces modèles et de les modifier un peu pour ajouter une colonne (recherchez deux ajouts marqués de <!-- 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>

Voici comment on dirait le résultat:

screenshot

36
Jukka Matilainen

Awesome Ans de Jukka. C'est une extension de la réponse de Jukka sur la manière dont vous pouvez relier exactement la capture d'écran

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

Au lieu d'un 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 à faire après que le rapport Junit est généré, c'est - copier toutes les captures d'écran de "selenium/captures d'écran /" répertoire à droite sous le répertoire Junit_Report.

Le code ci-dessus ajoutera uniquement le lien que pour les tests échoués. Si vous le souhaitez pour tous, modifiez le code en conséquence.

0
dganesh2002

De plus, si vous ne souhaitez pas remplacer le fichier XSL principal, vous pouvez copier un fichier XSL dans le dossier racine de projet, mettre à jour-la avec vos modifications et modifier enfin votre fichier build.xml ajoutant styledir attribut:

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