211 votes

Quelle est la spécification du format XML de JUnit prise en charge par Hudson ?

J'ai Hudson comme serveur d'intégration continue et je veux utiliser l'option 'Publish JUnit test result report'. Mais je n'utilise pas les outils xUnit pour les tests, j'ai plutôt des scripts qui exécutent les tests et renvoient les résultats dans un format simple. Je pense faire un scripts qui transforme ces résultats au format JUnit. J'aimerais donc savoir à quoi doit ressembler le fichier JUnit ?

0 votes

Pourquoi ne pas utiliser JUnit ? Ces tests peuvent être automatisés de différentes manières via une variété d'outils cmd, UI, etc...

6 votes

@AaronMcIver : Les scripts Shell sont assez bons pour exécuter des tests sur (un langage qui n'est pas Java). Comment utiliseriez-vous JUnit pour cela ?

1 votes

@BenVoigt J'avais initialement supposé que l'OP avait Java impliqué et cherchait à contourner JUnit comme harnais de test. Ce n'est probablement pas le cas après avoir examiné la question. Il semble que code.google.com/p/shell2junit peut être utile à l'OP après un second examen.

140voto

Anders Lindahl Points 17380

J'ai fait quelque chose de similaire il y a quelques mois, et il s'est avéré que ce format simple était suffisant pour que Hudson l'accepte comme protocole de test :

<testsuite tests="3">
    <testcase classname="foo1" name="ASuccessfulTest"/>
    <testcase classname="foo2" name="AnotherSuccessfulTest"/>
    <testcase classname="foo3" name="AFailingTest">
        <failure type="NotEnoughFoo"> details about failure </failure>
    </testcase>
</testsuite>

Les réponses à cette question sont plus détaillées : Spécification pour la sortie XML de JUnit

0 votes

Veuillez apporter une correction à cette réponse, car le plugin xunit rejette l'attribut "classname" et accepte simplement "class".

12 votes

J'ai eu le problème inverse. class a été rejetée et seule la classname a travaillé.

0 votes

Je dois créer ce fichier manuellement, mais je ne sais pas où le créer sur le système de fichiers relatif au répertoire d'accueil de Jenkins.

101voto

Todd Mazierski Points 681

J'ai juste pris le junit-4.xsd que d'autres ont mis en lien et ont utilisé un outil appelé XMLSpear pour convertir le schéma en un fichier XML vierge avec les options indiquées ci-dessous. Voici le résultat (légèrement nettoyé) :

<?xml version="1.0" encoding="UTF-8"?>
<testsuites disabled="" errors="" failures="" name="" tests="" time="">
    <testsuite disabled="" errors="" failures="" hostname="" id=""
               name="" package="" skipped="" tests="" time="" timestamp="">
        <properties>
            <property name="" value=""/>
        </properties>
        <testcase assertions="" classname="" name="" status="" time="">
            <skipped/>
            <error message="" type=""/>
            <failure message="" type=""/>
            <system-out/>
            <system-err/>
        </testcase>
        <system-out/>
        <system-err/>
    </testsuite>
</testsuites>

Certains de ces éléments peuvent se produire plusieurs fois :

  • Il ne peut y avoir qu'un seul testsuites puisque c'est ainsi que fonctionne le XML, mais il peut y avoir plusieurs éléments testsuite à l'intérieur de l'élément testsuites élément.
  • Chaque properties peut avoir plusieurs éléments property les enfants.
  • Chaque testsuite peut avoir plusieurs éléments testcase les enfants.
  • Chaque testcase peut avoir plusieurs éléments error , failure , system-out ou system-err les enfants.

XMLSpear options

1 votes

Existe-t-il un document décrivant les valeurs valides de certains attributs, comme le statut d'un testcase ou le type d'une erreur ?

1 votes

@EricCope Je peux vous recommander de regarder le code source. svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ . Il s'agit en fait d'une chaîne de caractères.

4 votes

Pourquoi les étiquettes sont-elles dupliquées ?

67voto

parvus Points 1269

En première réponse de la question Anders Lindahl se réfère à un fichier xsd .

Personnellement, j'ai trouvé ce fichier xsd également très utile (je ne sais plus comment je l'ai trouvé). Il a l'air un peu moins intimidant, et d'après ce que j'en ai vu, tous les éléments et attributs semblent être reconnus par Jenkins (v1.451).

Une chose cependant : lors de l'ajout de plusieurs <failure ... un seul a été retenu dans Jenkins. Lors de la création du fichier xml, je concatène maintenant tous les échecs en un seul.


Mise à jour 2016-11 Le lien n'est plus disponible. Une meilleure alternative est cette page de cubic.org : Format de fichier de rapport XML de JUnit où un effort appréciable a été fait pour fournir un service d'aide à la décision raisonnable. documenté exemple. L'exemple et le xsd sont copiés ci-dessous, mais leur page est bien plus belle.


exemple de fichier XML JUnit

<?xml version="1.0" encoding="UTF-8"?>
<!-- a description of the JUnit XML format and how Jenkins parses it. See also junit.xsd -->

<!-- if only a single testsuite element is present, the testsuites
     element can be omitted. All attributes are optional. -->
<testsuites disabled="" <!-- total number of disabled tests from all testsuites. -->
            errors=""   <!-- total number of tests with error result from all testsuites. -->
            failures="" <!-- total number of failed tests from all testsuites. -->
            name=""
            tests=""    <!-- total number of successful tests from all testsuites. -->
            time=""     <!-- time in seconds to execute all test suites. -->
        >

  <!-- testsuite can appear multiple times, if contained in a testsuites element.
       It can also be the root element. -->
  <testsuite name=""      <!-- Full (class) name of the test for non-aggregated testsuite documents.
                               Class name without the package for aggregated testsuites documents. Required -->
         tests=""     <!-- The total number of tests in the suite, required. -->
         disabled=""  <!-- the total number of disabled tests in the suite. optional -->
             errors=""    <!-- The total number of tests in the suite that errored. An errored test is one that had an unanticipated problem,
                               for example an unchecked throwable; or a problem with the implementation of the test. optional -->
             failures=""  <!-- The total number of tests in the suite that failed. A failure is a test which the code has explicitly failed
                               by using the mechanisms for that purpose. e.g., via an assertEquals. optional -->
             hostname=""  <!-- Host on which the tests were executed. 'localhost' should be used if the hostname cannot be determined. optional -->
         id=""        <!-- Starts at 0 for the first testsuite and is incremented by 1 for each following testsuite -->
         package=""   <!-- Derived from testsuite/@name in the non-aggregated documents. optional -->
         skipped=""   <!-- The total number of skipped tests. optional -->
         time=""      <!-- Time taken (in seconds) to execute the tests in the suite. optional -->
         timestamp="" <!-- when the test was executed in ISO 8601 format (2014-01-21T16:17:18). Timezone may not be specified. optional -->
         >

    <!-- Properties (e.g., environment settings) set during test
     execution. The properties element can appear 0 or once. -->
    <properties>
      <!-- property can appear multiple times. The name and value attributres are required. -->
      <property name="" value=""/>
    </properties>

    <!-- testcase can appear multiple times, see /testsuites/testsuite@tests -->
    <testcase name=""       <!-- Name of the test method, required. -->
          assertions="" <!-- number of assertions in the test case. optional -->
          classname=""  <!-- Full class name for the class the test method is in. required -->
          status=""
          time=""       <!-- Time taken (in seconds) to execute the test. optional -->
          >

      <!-- If the test was not executed or failed, you can specify one
           the skipped, error or failure elements. -->

      <!-- skipped can appear 0 or once. optional -->
      <skipped/>

      <!-- Indicates that the test errored. An errored test is one
           that had an unanticipated problem. For example an unchecked
           throwable or a problem with the implementation of the
           test. Contains as a text node relevant data for the error,
           for example a stack trace. optional -->
      <error message="" <!-- The error message. e.g., if a java exception is thrown, the return value of getMessage() -->
         type=""    <!-- The type of error that occured. e.g., if a java execption is thrown the full class name of the exception. -->
         ></error>

      <!-- Indicates that the test failed. A failure is a test which
       the code has explicitly failed by using the mechanisms for
       that purpose. For example via an assertEquals. Contains as
       a text node relevant data for the failure, e.g., a stack
       trace. optional -->
      <failure message="" <!-- The message specified in the assert. -->
           type=""    <!-- The type of the assert. -->
           ></failure>

      <!-- Data that was written to standard out while the test was executed. optional -->
      <system-out></system-out>

      <!-- Data that was written to standard error while the test was executed. optional -->
      <system-err></system-err>
    </testcase>

    <!-- Data that was written to standard out while the test suite was executed. optional -->
    <system-out></system-out>
    <!-- Data that was written to standard error while the test suite was executed. optional -->
    <system-err></system-err>
  </testsuite>
</testsuites>

Fichier XSD de JUnit

<?xml version="1.0" encoding="UTF-8" ?>
<!-- from https://svn.jenkins-ci.org/trunk/hudson/dtkit/dtkit-format/dtkit-junit-model/src/main/resources/com/thalesgroup/dtkit/junit/model/xsd/junit-4.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="failure">
        <xs:complexType mixed="true">
            <xs:attribute name="type" type="xs:string" use="optional"/>
            <xs:attribute name="message" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="error">
        <xs:complexType mixed="true">
            <xs:attribute name="type" type="xs:string" use="optional"/>
            <xs:attribute name="message" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="properties">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="property" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="property">
        <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="value" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="skipped" type="xs:string"/>
    <xs:element name="system-err" type="xs:string"/>
    <xs:element name="system-out" type="xs:string"/>

    <xs:element name="testcase">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="skipped" minOccurs="0" maxOccurs="1"/>
                <xs:element ref="error" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="failure" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="system-out" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="system-err" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="assertions" type="xs:string" use="optional"/>
            <xs:attribute name="time" type="xs:string" use="optional"/>
            <xs:attribute name="classname" type="xs:string" use="optional"/>
            <xs:attribute name="status" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="testsuite">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="properties" minOccurs="0" maxOccurs="1"/>
                <xs:element ref="testcase" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="system-out" minOccurs="0" maxOccurs="1"/>
                <xs:element ref="system-err" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="tests" type="xs:string" use="required"/>
            <xs:attribute name="failures" type="xs:string" use="optional"/>
            <xs:attribute name="errors" type="xs:string" use="optional"/>
            <xs:attribute name="time" type="xs:string" use="optional"/>
            <xs:attribute name="disabled" type="xs:string" use="optional"/>
            <xs:attribute name="skipped" type="xs:string" use="optional"/>
            <xs:attribute name="timestamp" type="xs:string" use="optional"/>
            <xs:attribute name="hostname" type="xs:string" use="optional"/>
            <xs:attribute name="id" type="xs:string" use="optional"/>
            <xs:attribute name="package" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="testsuites">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="testsuite" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="optional"/>
            <xs:attribute name="time" type="xs:string" use="optional"/>
            <xs:attribute name="tests" type="xs:string" use="optional"/>
            <xs:attribute name="failures" type="xs:string" use="optional"/>
            <xs:attribute name="disabled" type="xs:string" use="optional"/>
            <xs:attribute name="errors" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

</xs:schema>

0 votes

Comment faire pour que les échecs soient bien visibles ? J'aimerais ajouter manuellement de nouveaux caractères de ligne, mais ils n'apparaissent pas dans Jenkins.

0 votes

C'est un inconvénient de mon approche. Je me souviens avoir eu du mal à le faire. Essayez d'ajouter quelque chose comme <br/> - J'ai oublié comment cela a été résolu (et nous ne l'utilisons plus), mais cela semble quelque chose qui vaut la peine d'être essayé.

1 votes

J'ai trouvé un moyen de contourner le problème. Comme nous utilisons C++, je me contente d'indiquer le nombre d'échecs dans le message d'échec et d'utiliser la "trace de pile" pour indiquer les échecs réels. Comme la trace de la pile est rapportée à partir du texte dans le corps de l'élément d'échec, les nouvelles lignes sont correctement prises en charge.

29voto

Ian Points 216

Je n'ai pas trouvé de bonnes informations à ce sujet, j'ai donc procédé par essais et erreurs. Les attributs et champs suivants (et seulement ) sont reconnus par Jenkins (v1.585).

<?xml version="1.0" encoding="UTF-8"?>
<testsuite>

  <!-- if your classname does not include a dot, the package defaults to "(root)" -->
  <testcase name="my testcase" classname="my package.my classname" time="29">

    <!-- If the test didn't pass, specify ONE of the following 3 cases -->

    <!-- option 1 --> <skipped />
    <!-- option 2 --> <failure message="my failure message">my stack trace</failure>
    <!-- option 3 --> <error message="my error message">my crash report</error>

    <system-out>my STDOUT dump</system-out>

    <system-err>my STDERR dump</system-err>

  </testcase>

</testsuite>

(J'ai commencé par cet exemple de document XML et a travaillé à partir de là).

9voto

Grzesiek D. Points 656

J'ai décidé de publier une nouvelle réponse, car certaines réponses existantes sont obsolètes ou incomplètes.

Tout d'abord, il n'y a rien de tel que JUnit XML Format Specification Tout simplement parce que JUnit ne produit aucun type de rapport XML ou HTML.

La génération de rapports XML elle-même provient de la tâche Ant JUnit / Maven Surefire Plugin / Gradle (quel que soit celui que vous utilisez pour exécuter vos tests). Le format de rapport XML a d'abord été introduit par Ant, puis adapté par Maven (et Gradle).

Si quelqu'un a simplement besoin d'un format XML officiel, alors.. :

  1. Il existe un schéma pour un rapport XML généré par maven surefire et il peut être trouvé ici : surefire-test-report.xsd .
  2. Pour un XML généré par la fourmi, il existe un schéma tiers disponible. aquí (mais il se peut qu'il soit légèrement dépassé).

J'espère que cela aidera quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X