Hudson支持的JUnit XML格式规范

我将Hudson作为持续集成服务器,我想使用“发布JUnit测试结果报告”选项。 但我不使用xUnit工具进行测试,而是使用运行测试并以简单格式返回结果的shell脚本。 我正在考虑制作一个将这些结果转换为JUnit格式的脚本。 所以我很有兴趣JUnit文件必须看起来如何?


几个月前我做了类似的事情,结果证明这个简单的格式足以让Hudson接受它作为测试协议:

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

这个问题有更多细节的答案:规格。 用于JUnit XML输出


我只是抓住了其他人已经链接到的junit-4.xsd,并使用名为XMLSpear的工具将架构转换为空白的XML文件,并显示如下所示的选项。 这是(稍微清理)的结果:

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

其中一些项目可能会出现多次:

  • 因为这就是XML的工作方式,所以只能有一个testsuites元素,但是testsuite元素中可以有多个testsuite testsuites元素。
  • 每个properties元素可以有多个property子元素。
  • 每个testsuite都可以有多个testcase
  • 每个testcase元素可能有多个errorfailuresystem-out errorsystem-err子项。
  • XMLSpear选项


    Anders Lindahl问题的最佳答案指的是一个xsd文件。

    就我个人而言,我发现这个xsd文件也非常有用(我不记得我是如何找到那个的)。 它看起来不那么吓人,而且就我使用它而言,所有元素和属性似乎都被Jenkins(v1.451)所认可,

    有一件事:当添加多个<failure ...元素时,Jenkins中只保留一个元素。 在创建xml文件时,我现在将所有失败连接在一起。


    2016-11更新此链接已被破坏。 更好的选择是来自cubic.org的这个页面:JUnit XML报告文件格式,这里已经做了很好的努力来提供一个明智的文档示例。 示例和xsd复制到下面,但他们的页面看起来更好。


    样本JUnit XML文件

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

    JUnit XSD文件

    <?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>
    
    链接地址: http://www.djcxy.com/p/64259.html

    上一篇: JUnit XML format specification that Hudson supports

    下一篇: Sqlite : Modifying locking criteria inside begin