it-swarm.com.de

Welche JUnit XML-Formatspezifikation unterstützt Hudson?

Ich habe Hudson als Continuous Integration Server und möchte die Option "JUnit-Testergebnisbericht veröffentlichen" verwenden. Aber ich benutze keine xUnit-Tools zum Testen, stattdessen habe ich Shell-Skripte, die Tests ausführen und Ergebnisse in einem einfachen Format zurückgeben. Ich denke, um ein Skript zu machen, das diese Ergebnisse in das JUnit-Format umwandelt. Ich bin also interessant, wie die JUnit-Datei aussehen muss.

172
krvladislav

Ich habe vor ein paar Monaten etwas Ähnliches gemacht, und es stellte sich heraus, dass dieses einfache Format für Hudson ausreichte, um es als Testprotokoll zu akzeptieren:

<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>

Diese Frage enthält Antworten mit weiteren Details: Spez. Für JUnit XML-Ausgabe

123
Anders Lindahl

Ich habe mir gerade das junit-4.xsd geholt, das andere mit einem Tool namens XMLSpear verknüpft und verwendet haben, um das Schema mit den unten gezeigten Optionen in eine leere XML-Datei zu konvertieren. Dies ist das (leicht aufgeräumte) Ergebnis:

<?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>

Einige dieser Elemente können mehrfach auftreten:

  • Es kann nur ein testsuites Element geben, da XML auf diese Weise funktioniert. Das testsuite Element kann jedoch mehrere testsuites Elemente enthalten.
  • Jedes properties Element kann mehrere property Kinder haben.
  • Jedes testsuite Element kann mehrere testcase Kinder haben.
  • Jedes testcase -Element kann mehrere error, failure, system-out, oder system-err Kinder.

XMLSpear options

85
Todd Mazierski

Das oberste Antwort der Frage Anders Lindahl bezieht sich auf ein xsd-Datei .

Persönlich fand ich diese xsd-Datei auch sehr nützlich (ich erinnere mich nicht, wie ich diese gefunden habe). Es sieht ein bisschen weniger einschüchternd aus, und soweit ich es verwendet habe, scheinen alle Elemente und Attribute von Jenkins erkannt zu werden (v1.451)

Eines jedoch: Beim Hinzufügen mehrerer <failure ... Elemente, wurde nur eine in Jenkins beibehalten. Beim Erstellen der XML-Datei verkette ich jetzt alle Fehler in einem.


Update 2016-11 Der Link ist jetzt unterbrochen. Eine bessere Alternative ist diese Seite von cubic.org: JUnit XML-Berichtsdateiformat , wo eine nette Anstrengung unternommen wurde, ein sinnvolles dokumentiertes Beispiel bereitzustellen. Beispiel und xsd werden unten kopiert, aber ihre Seite sieht ein bisschen besser aus.


jUnit-XML-Beispieldatei

<?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/[email protected] -->
    <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>

JUnit XSD-Datei

<?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>
37
parvus

Ich konnte keine guten Informationen dazu finden, also habe ich ein paar Versuche unternommen. Die folgenden Attribute und Felder (und nur diese) werden von Jenkins (v1.585) erkannt.

<?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>

(Ich habe mit dieses XML-Beispieldokument begonnen und von dort aus rückwärts gearbeitet.)

25
Ian

Grundstruktur Hier ist ein Beispiel für eine JUnit-Ausgabedatei, die ein Überspringungs- und ein fehlgeschlagenes Ergebnis sowie ein einzelnes übergebenes Ergebnis zeigt.

<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
   <testsuite name="JUnitXmlReporter" errors="0" tests="0" failures="0" time="0" timestamp="2013-05-24T10:23:58" />
   <testsuite name="JUnitXmlReporter.constructor" errors="0" skipped="1" tests="3" failures="1" time="0.006" timestamp="2013-05-24T10:23:58">
      <properties>
         <property name="Java.vendor" value="Sun Microsystems Inc." />
         <property name="compiler.debug" value="on" />
         <property name="project.jdk.classpath" value="jdk.classpath.1.6" />
      </properties>
      <testcase classname="JUnitXmlReporter.constructor" name="should default path to an empty string" time="0.006">
         <failure message="test failure">Assertion failed</failure>
      </testcase>
      <testcase classname="JUnitXmlReporter.constructor" name="should default consolidate to true" time="0">
         <skipped />
      </testcase>
      <testcase classname="JUnitXmlReporter.constructor" name="should default useDotNotation to true" time="0" />
   </testsuite>
</testsuites>

Unten finden Sie die dokumentierte Struktur eines typischen JUnit-XML-Berichts. Beachten Sie, dass ein Bericht mindestens eine Testsuite enthalten kann. Jede Testsuite verfügt über eine Reihe von Eigenschaften (Informationen zur Aufzeichnungsumgebung). Jede Testsuite enthält auch einen oder mehrere Testfälle, und jeder Testfall enthält entweder einen übersprungenen Knoten, einen Fehler oder einen Fehlerknoten, wenn der Test nicht bestanden wurde. Wenn der Testfall bestanden wurde, enthält er keine Knoten. Weitere Informationen darüber, welche Attribute für jeden Knoten gültig sind, finden Sie im folgenden Abschnitt "Schema".

<testsuites>        => the aggregated result of all junit testfiles
  <testsuite>       => the output from a single TestSuite
    <properties>    => the defined properties at test execution
      <property>    => name/value pair for a single property
      ...
    </properties>
    <error></error> => optional information, in place of a test case - normally if the tests in the suite could not be found etc.
    <testcase>      => the results from executing a test method
      <system-out>  => data written to System.out during the test run
      <system-err>  => data written to System.err during the test run
      <skipped/>    => test was skipped
      <failure>     => test failed
      <error>       => test encountered an error
    </testcase>
    ...
  </testsuite>
  ...
</testsuites>
6

Es gibt mehrere Schemata für die Ergebnisse "JUnit" und "xUnit".

Bitte beachten Sie, dass das Jenkins xunit-plugin mehrere Versionen des Schemas verwendet (die aktuellste Version ist junit-10.xsd, das Unterstützung für das Erlang/OTP-Junit-Format hinzufügt).

Einige Test-Frameworks sowie Berichts-Plugins im "xUnit" -Stil verwenden auch ihre eigene geheime Soße, um Berichte im "xUnit" -Stil zu generieren. Diese verwenden möglicherweise kein bestimmtes Schema (lesen Sie bitte: Sie versuchen es, aber die Tools validieren möglicherweise nicht mit irgendwelchen ein Schema). Python testet in Jenkins nicht? gibt einen schnellen Vergleich mehrerer dieser Bibliotheken und geringfügige Unterschiede zwischen den generierten XML-Berichten.

4
dnozay

Ich habe beschlossen, eine neue Antwort zu veröffentlichen, da einige der vorhandenen Antworten veraltet oder unvollständig sind.

Erstens: Es gibt nichts Vergleichbares wie JUnit XML Format Specification, weil JUnit keinen XML- oder HTML-Bericht erstellt.

Die XML-Berichtsgenerierung selbst stammt aus der Ant JUnit-Task/Maven Surefire Plugin/Gradle (je nachdem, was Sie für die Ausführung Ihrer Tests verwenden). Das XML-Berichtsformat wurde zuerst von Ant eingeführt und später von Maven (und Gradle) angepasst.

Wenn jemand nur ein offizielles XML-Format benötigt, dann:

  1. Es gibt ein Schema für einen von maven todsicheren XML-Bericht, das hier zu finden ist: surefire-test-report.xsd .
  2. Für eine ant-generierte XML-Datei ist ein Schema eines Drittanbieters verfügbar hier (möglicherweise ist es jedoch etwas veraltet).

Hoffe, es wird jemandem helfen.

2
G. Demecki

Gute Antworten hier zur Verwendung von Python: (Es gibt viele Möglichkeiten, dies zu tun) Python wird in Jenkins nicht getestet?

IMHO der beste Weg ist schreiben python unittest tests und installieren pytest (so etwas wie 'yum install pytest'), um py.test zu installieren. Führen Sie dann die folgenden Tests aus: 'py.test --junitxml results.xml test. py '. Sie können jedes unittest python script ausführen und jUnit xml-Ergebnisse erhalten.

https://docs.python.org/2.7/library/unittest.html

In der Jenkins-Build-Konfiguration Aktionen nach dem Build Fügen Sie eine Aktion "JUnit-Testergebnisbericht veröffentlichen" mit result.xml und weiteren von Ihnen erstellten Testergebnisdateien hinzu.

1
gaoithe