Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions schema/junit.xsd
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="1.0">

<!-- Common attribute group used by testsuites and testsuite -->
<xs:attributeGroup name="aggAttributes">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="tests" type="xs:nonNegativeInteger" use="required" />
<xs:attribute name="failures" type="xs:nonNegativeInteger" use="optional" />
<xs:attribute name="errors" type="xs:nonNegativeInteger" use="optional" />
<xs:attribute name="skipped" type="xs:nonNegativeInteger" use="optional" />
<xs:attribute name="assertions" type="xs:nonNegativeInteger" use="optional" />
<xs:attribute name="time" type="xs:decimal" use="optional" />
<xs:attribute name="timestamp" type="xs:dateTime" use="optional" />
</xs:attributeGroup>

<!-- Root choice: allow either <testsuites> or a single top-level <testsuite> -->
<xs:element name="testsuites" type="testsuitesType" />
<xs:element name="testsuite" type="testsuiteType" />

<!-- testsuites contains 1..unbounded testsuite -->
<xs:complexType name="testsuitesType">
<xs:sequence>
<xs:element name="testsuite" type="testsuiteType" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
<xs:attributeGroup ref="aggAttributes" />
</xs:complexType>

<!-- testsuite: optional properties/out/err, then 0..unbounded testcase -->
<xs:complexType name="testsuiteType">
<xs:sequence>
<xs:element name="properties" type="propertiesType" minOccurs="0" />
<xs:element name="system-out" type="xs:string" minOccurs="0" />
<xs:element name="system-err" type="xs:string" minOccurs="0" />
<xs:element name="testcase" type="testcaseType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attributeGroup ref="aggAttributes" />
<xs:attribute name="file" type="xs:string" use="optional" />
</xs:complexType>

<!-- properties container -->
<xs:complexType name="propertiesType">
<xs:sequence>
<xs:element name="property" type="propertyType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>

<!-- property: name required, value optional, also allows text content (mixed) -->
<xs:complexType name="propertyType" mixed="true">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="value" type="xs:string" use="optional" />
</xs:complexType>

<!-- testcase with optional nested result/outputs/properties (any order, any count) -->
<xs:complexType name="testcaseType">
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="skipped" type="skippedType" />
<xs:element name="failure" type="failureType" />
<xs:element name="error" type="errorType" />
<xs:element name="system-out" type="xs:string" />
<xs:element name="system-err" type="xs:string" />
<xs:element name="properties" type="propertiesType" />
</xs:choice>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="classname" type="xs:string" use="optional" />
<xs:attribute name="assertions" type="xs:nonNegativeInteger" use="optional" />
<xs:attribute name="time" type="xs:decimal" use="optional" />
<xs:attribute name="file" type="xs:string" use="optional" />
<xs:attribute name="line" type="xs:positiveInteger" use="optional" />
</xs:complexType>

<!-- skipped: empty element with optional message -->
<xs:complexType name="skippedType">
<xs:attribute name="message" type="xs:string" use="optional" />
</xs:complexType>

<!-- failure/error: mixed so they can contain stack traces/text -->
<xs:complexType name="failureType" mixed="true">
<xs:attribute name="message" type="xs:string" use="optional" />
<xs:attribute name="type" type="xs:string" use="optional" />
</xs:complexType>

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

</xs:schema>