{"id":25776813,"url":"https://github.com/ota4j-team/open-test-reporting","last_synced_at":"2026-01-14T02:16:41.814Z","repository":{"id":50379261,"uuid":"355649356","full_name":"ota4j-team/open-test-reporting","owner":"ota4j-team","description":"Language-agnostic XML and HTML test reporting formats and tooling. Maintained by the JUnit team.","archived":false,"fork":false,"pushed_at":"2026-01-11T18:07:45.000Z","size":3870,"stargazers_count":101,"open_issues_count":15,"forks_count":7,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-01-11T21:31:36.440Z","etag":null,"topics":["automated-testing","reporting"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ota4j-team.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":"https://junit.org/sponsoring"}},"created_at":"2021-04-07T18:45:06.000Z","updated_at":"2026-01-11T18:07:49.000Z","dependencies_parsed_at":"2022-08-04T17:30:28.700Z","dependency_job_id":"7e2142dd-1434-4883-9bd1-d3e0b8ecafea","html_url":"https://github.com/ota4j-team/open-test-reporting","commit_stats":{"total_commits":157,"total_committers":5,"mean_commits":31.4,"dds":0.3439490445859873,"last_synced_commit":"49de7d9114b80ca2e812de88f483cec53595909c"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/ota4j-team/open-test-reporting","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ota4j-team%2Fopen-test-reporting","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ota4j-team%2Fopen-test-reporting/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ota4j-team%2Fopen-test-reporting/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ota4j-team%2Fopen-test-reporting/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ota4j-team","download_url":"https://codeload.github.com/ota4j-team/open-test-reporting/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ota4j-team%2Fopen-test-reporting/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automated-testing","reporting"],"created_at":"2025-02-27T06:01:31.567Z","updated_at":"2026-01-14T02:16:41.793Z","avatar_url":"https://github.com/ota4j-team.png","language":"Java","funding_links":["https://junit.org/sponsoring"],"categories":["测试"],"sub_categories":[],"readme":"= Open Test Reporting\n:schemaVersion: 0.2.0\n:openTestReportingVersion: 0.2.5\n\n\u003c\u003cxml-formats, XML\u003e\u003e and \u003c\u003ccli-html-report, HTML\u003e\u003e test reporting formats that are agnostic of testing framework and programming language.\n\n== Introduction\n\nThis repository contains the definition of and tooling for two new XML-based test reporting formats that are agnostic of any testing framework and programming language yet concrete enough to be consumable by a wide range of downstream tools such as IDEs, build tools, and report generators.\nMoreover, it provides a report generator that produces a \u003c\u003ccli-html-report, standalone HTML file\u003e\u003e based on the XML formats.\n\nThe \u003c\u003cevent-based-format, event-based XML format\u003e\u003e is suitable for writing test events to a file or streaming them over a local socket or network connection.\nInstead of having to collect all data for a test only to write it to the report after the test has completed, testing frameworks can emit events as they occur, for example when a test is started or finished.\n\nThe \u003c\u003chierarchical-format, hierarchical XML format\u003e\u003e is meant to be closer to existing representations of test results that users are familiar with.\nFor example, when executing tests in IDEs, one is usually presented with a tree of tests and their results.\nThis same structure can be found in files that use this format.\nThus, instead of requiring humans or processing tools to piece together all relevant events for a test from the event-based format, this hierarchical format collects all relevant information in a single place for each test.\nBesides being human-readable, this format is easier to transform into an HTML report by a downstream reporting tool or CI server.\nBoth XML formats are designed to complement each other such that the event-based format can be mechanically converted into the hierarchical one.\n\nThis repository contains a \u003c\u003creference-implementation, reference implementation\u003e\u003e of an API for \u003c\u003cevents-api, writing\u003e\u003e event-based XML files (from JVM languages such as Java), as well as a \u003c\u003ccli, CLI tool\u003e\u003e for \u003c\u003ccli-validate, validating\u003e\u003e them, \u003c\u003ccli-convert, converting\u003e\u003e them to the hierarchical format, and generating \u003c\u003ccli-html-report, HTML reports\u003e\u003e from them.\nThis way, testing frameworks can focus on writing the event-based format; build tools may use the converter to write the hierarchical format or generate HTML reports; and reporting tools can consume whichever format they prefer.\n\nNOTE: Please refer to the appendix for more information about the \u003c\u003cprior-art, motivation behind this project\u003e\u003e and its \u003c\u003c#design-goals, design goals\u003e\u003e.\n\n[#xml-formats]\n== XML format specification\n\nBoth formats share a set of core elements that is defined in link:schema/src/main/resources/org/opentest4j/reporting/schema/core-{schemaVersion}.xsd[core-{schemaVersion}.xsd].\n\n[#event-based-format]\n=== Event-based format\n\nThe event-based format is defined in link:schema/src/main/resources/org/opentest4j/reporting/schema/events-{schemaVersion}.xsd[events-{schemaVersion}.xsd].\n\nThe following example shows the result of a test run with a single top-level \"container\" and a \"test\" child.\n\n[source,xml,subs=\"attributes+\"]\n----\n\u003c?xml version=\"1.0\" ?\u003e\n\u003ce:events\n        xmlns=\"https://schemas.opentest4j.org/reporting/core/{schemaVersion}\"\n        xmlns:e=\"https://schemas.opentest4j.org/reporting/events/{schemaVersion}\"\u003e\n    \u003cinfrastructure\u003e \u003c!--1--\u003e\n        \u003chostName\u003ewonderland\u003c/hostName\u003e\n        \u003cuserName\u003ealice\u003c/userName\u003e\n    \u003c/infrastructure\u003e\n    \u003ce:started id=\"1\" name=\"container\" time=\"2022-02-05T16:30:39.129888Z\"/\u003e \u003c!--2--\u003e\n    \u003ce:started id=\"2\" name=\"test\" parentId=\"1\" time=\"2022-02-05T16:30:39.137022Z\"/\u003e \u003c!--3--\u003e\n    \u003ce:finished id=\"2\" time=\"2022-02-05T16:30:39.143013Z\"\u003e \u003c!--4--\u003e\n        \u003cresult status=\"SUCCESSFUL\"/\u003e\n    \u003c/e:finished\u003e\n    \u003ce:finished id=\"1\" time=\"2022-02-05T16:30:39.143292Z\"\u003e \u003c!--5--\u003e\n        \u003cresult status=\"SUCCESSFUL\"/\u003e\n    \u003c/e:finished\u003e\n\u003c/e:events\u003e\n----\n\u003c1\u003e attributes of the infrastructure the tests were run on\n\u003c2\u003e start event of \"container\" with timestamp\n\u003c3\u003e start event of \"test\" with timestamp and reference to its parent \"container\"\n\u003c4\u003e finished event of \"test\" with timestamp and result status\n\u003c5\u003e finished event of \"container\" with timestamp and result status\n\nThis file contains 4 events: 2 started and 2 finished ones.\nThe test framework reporting these events was able to write them as they occurred.\nIn particular, it did not have to wait for all children of \"container\" to be finished.\n\n[#hierarchical-format]\n=== Hierarchical format\n\nThe event-based format is defined in link:schema/src/main/resources/org/opentest4j/reporting/schema/hierarchy-{schemaVersion}.xsd[hierarchy-{schemaVersion}.xsd].\n\nThe following example shows the result of converting the above event-based report into the hierarchical format.\n\n[source,xml,subs=\"attributes+\"]\n----\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e\n\u003ch:execution xmlns:h=\"https://schemas.opentest4j.org/reporting/hierarchy/{schemaVersion}\"\n             xmlns=\"https://schemas.opentest4j.org/reporting/core/{schemaVersion}\"\u003e\n    \u003cinfrastructure\u003e \u003c!--1--\u003e\n        \u003chostName\u003ewonderland\u003c/hostName\u003e\n        \u003cuserName\u003ealice\u003c/userName\u003e\n    \u003c/infrastructure\u003e\n    \u003ch:root duration=\"PT0.013404S\" name=\"container\" start=\"2022-02-05T16:30:39.129888Z\"\u003e \u003c!--2--\u003e\n        \u003cresult status=\"SUCCESSFUL\"/\u003e\n        \u003ch:child duration=\"PT0.005991S\" name=\"test\" start=\"2022-02-05T16:30:39.137022Z\"\u003e \u003c!--3--\u003e\n            \u003cresult status=\"SUCCESSFUL\"/\u003e\n        \u003c/h:child\u003e\n    \u003c/h:root\u003e\n\u003c/h:execution\u003e\n----\n\u003c1\u003e attributes of the infrastructure the tests were run on (same as in the event-based format)\n\u003c2\u003e root node of \"container\" with timestamp, duration, and result status\n\u003c3\u003e child node of \"test\" with timestamp, duration, and result status\n\n[#xml-extensions]\n=== Schema extensions\n\nAll schema definitions mentioned so far are language-agnostic.\n\n==== Java\n\nIn order to report Java-specific attributes, e.g. the class or method name of a test, an extension schema is defined in link:schema/src/main/resources/org/opentest4j/reporting/schema/java-{schemaVersion}.xsd[java-{schemaVersion}.xsd].\n\n[TIP]\n====\nTest frameworks are encouraged to define their own similar framework-specific extensions if they want to report additional information that is not suitable to be added to the core namespace.\nSee the link:https://github.com/junit-team/junit5/blob/61578038ba1e7f4ea1059aea3e0589581991f531/junit-platform-reporting/src/main/resources/org/junit/platform/reporting/open/xml/junit.xsd[JUnit project] for an example of how to define an extension schema.\n====\n\n==== Git\n\nIn order to include Git-specific metadata, e.g. the commit hash or branch name, an extension schema is defined in link:schema/src/main/resources/org/opentest4j/reporting/schema/git-{schemaVersion}.xsd[git-{schemaVersion}.xsd].\n\n[WARNING]\n====\nIf you're implementing support for including Git information in an XML report, you must ensure to strip any credentials from the `originUrl` before writing it to the XML file.\nMoreover, since Git status output may include file names that contain personally identifiable or otherwise sensitive information, it is recommended to include Git-specific metadata in the XML report only if the requesting user has opted in explicitly.\n====\n\n[#reference-implementation]\n== Reference implementation\n\nWhile the reporting formats are language-agnostic, the reference implementation is written in Java due to being the language its authors (the JUnit team) are most familiar with.\n\nThis repository contains the following subprojects:\n\nschema::\n    XML schema definitions of both formats\nevents::\n    \u003c\u003cevents-api, Java API for writing the event-based format\u003e\u003e without having to deal with Java's XML APIs\ncli::\n    \u003c\u003ccli, Command-line interface\u003e\u003e (CLI) for validating both formats, converting from the event-based to the hierarchical format, and \u003c\u003ccli-html-report, generating HTML reports\u003e\u003e\ntooling-core::\n    Java API for validating both formats, converting from the event-based to the hierarchical format (suitable for inclusion in build tools and reporting tools), and generating HTML reports\ntooling-spi::\n    Java Service Provider Interface (SPI) for the \u003c\u003chtml-report-extension, extending the HTML report\u003e\u003e\nhtml-report::\n    Vue.js-based HTML report single-page application (SPA)\nsample-project::\n    Sample project that demonstrates how to enable JUnit's event-based output and set up Gradle to convert it to the hierarchical format and generate an HTML report\n\n[#events]\n\n[#events-api]\n=== API for writing event-based format\n\nTesting frameworks that run on the JVM can use the API provided by the _events_ subprojects as follows.\n\n[source,java]\n----\nimport org.opentest4j.reporting.events.api.DocumentWriter;\nimport org.opentest4j.reporting.events.api.NamespaceRegistry;\nimport org.opentest4j.reporting.events.core.CoreFactory;\nimport org.opentest4j.reporting.events.root.Events;\nimport org.opentest4j.reporting.schema.Namespace;\n\nimport java.nio.file.Paths;\nimport java.time.Instant;\n\nimport static org.opentest4j.reporting.events.core.CoreFactory.*;\nimport static org.opentest4j.reporting.events.core.Result.Status.SUCCESSFUL;\nimport static org.opentest4j.reporting.events.root.RootFactory.finished;\nimport static org.opentest4j.reporting.events.root.RootFactory.started;\n\npublic class DocumentWriterSample {\n\n    public static void main(String[] args) throws Exception {\n\n        NamespaceRegistry namespaceRegistry = NamespaceRegistry.builder(Namespace.REPORTING_CORE) // \u003c1\u003e\n                .add(\"e\", Namespace.REPORTING_EVENTS) //\n                .add(\"java\", Namespace.REPORTING_JAVA) //\n                .build();\n\n        try (DocumentWriter\u003cEvents\u003e writer = Events.createDocumentWriter(namespaceRegistry, Paths.get(\"events.xml\"))) {\n            writer.append(infrastructure(), infrastructure -\u003e infrastructure // \u003c2\u003e\n                    .append(userName(\"alice\")) //\n                    .append(hostName(\"wonderland\")));\n            writer.append(started(\"1\", Instant.now(), \"container\")); // \u003c3\u003e\n            writer.append(started(\"2\", Instant.now(), \"test\"), started -\u003e started.withParentId(\"1\")); // \u003c4\u003e\n            writer.append(finished(\"2\", Instant.now()), finished -\u003e finished.append(CoreFactory.result(SUCCESSFUL))); // \u003c5\u003e\n            writer.append(finished(\"1\", Instant.now()), finished -\u003e finished.append(CoreFactory.result(SUCCESSFUL))); // \u003c6\u003e\n        }\n    }\n}\n----\n\u003c1\u003e create a registry of all namespaces used in the document along with their prefixes\n\u003c2\u003e report infrastructure attributes\n\u003c3\u003e start event of \"container\" with timestamp\n\u003c4\u003e start event of \"test\" with timestamp and reference to its parent \"container\"\n\u003c5\u003e finished event of \"test\" with timestamp and result status\n\u003c6\u003e finished event of \"container\" with timestamp and result status\n\n==== Streaming to a Writer\n\nFor use cases where you need to stream events over a socket or network connection instead of writing to a file, you can use a `Writer` instance:\n\n[source,java]\n----\nimport org.opentest4j.reporting.events.api.DocumentWriter;\nimport org.opentest4j.reporting.events.api.NamespaceRegistry;\nimport org.opentest4j.reporting.events.core.CoreFactory;\nimport org.opentest4j.reporting.events.root.Events;\nimport org.opentest4j.reporting.schema.Namespace;\n\nimport java.io.OutputStreamWriter;\nimport java.time.Instant;\n\nimport static org.opentest4j.reporting.events.core.CoreFactory.*;\nimport static org.opentest4j.reporting.events.core.Result.Status.SUCCESSFUL;\nimport static org.opentest4j.reporting.events.root.RootFactory.finished;\nimport static org.opentest4j.reporting.events.root.RootFactory.started;\n\npublic class DocumentWriterStreamingSample {\n\n\tpublic static void main(String[] args) throws Exception {\n\n\t\tNamespaceRegistry namespaceRegistry = NamespaceRegistry.builder(Namespace.REPORTING_CORE) // \u003c1\u003e\n\t\t\t\t.add(\"e\", Namespace.REPORTING_EVENTS) //\n\t\t\t\t.add(\"git\", Namespace.REPORTING_GIT) //\n\t\t\t\t.add(\"java\", Namespace.REPORTING_JAVA) //\n\t\t\t\t.build();\n\n\t\t// Example: streaming events to System.out (could be a socket, network stream, etc.)\n\t\ttry (DocumentWriter\u003cEvents\u003e writer = Events.createDocumentWriter(namespaceRegistry,\n\t\t\tnew OutputStreamWriter(System.out))) {\n\t\t\twriter.append(infrastructure(), infrastructure -\u003e infrastructure // \u003c2\u003e\n\t\t\t\t\t.append(hostName(\"wonderland\")) //\n\t\t\t\t\t.append(userName(\"alice\")));\n\t\t\twriter.append(started(\"1\", Instant.now(), \"container\")); // \u003c3\u003e\n\t\t\twriter.append(started(\"2\", Instant.now(), \"test\"), started -\u003e started.withParentId(\"1\")); // \u003c4\u003e\n\t\t\twriter.append(finished(\"2\", Instant.now()), finished -\u003e finished.append(CoreFactory.result(SUCCESSFUL))); // \u003c5\u003e\n\t\t\twriter.append(finished(\"1\", Instant.now()), finished -\u003e finished.append(CoreFactory.result(SUCCESSFUL))); // \u003c6\u003e\n\t\t}\n\t}\n}\n----\n\nThis allows you to write test events as they occur, without having to collect all data before writing.\n\nTIP: See the link:https://github.com/junit-team/junit5/blob/86539a286b23b9dd192f3e54bc10e3c95f87773f/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListener.java[JUnit project] for an example of how to write an event-based report.\n\n[#cli]\n=== CLI tool\n\nThe CLI tool provided by the _cli_ subprojects provides subcommands for \u003c\u003ccli-validate, validating\u003e\u003e both formats, \u003c\u003ccli-convert, converting\u003e\u003e from the event-based to the hierarchical format, and generating an \u003c\u003ccli-html-report, HTML report\u003e\u003e.\n\n==== Installation\n\nYou can download the CLI tool from Maven Central using the https://repo1.maven.org/maven2/org/opentest4j/reporting/open-test-reporting-cli/{openTestReportingVersion}/open-test-reporting-cli-{openTestReportingVersion}-standalone.jar[`org.opentest4j.reporting:open-test-reporting-cli:{openTestReportingVersion}:standalone`] coordinates.\n\nAlternatively, you can use https://www.jbang.dev/[JBang]:\n\n[source,console,subs=\"attributes+\"]\n----\n$ jbang org.opentest4j.reporting:open-test-reporting-cli:{openTestReportingVersion}:standalone --help\n----\n\n[#cli-validate]\n==== Validate XML files\n\n[source,console,subs=\"attributes+\"]\n----\n$ java -jar open-test-reporting-cli-{openTestReportingVersion}.jar validate events.xml\nℹ️ Valid: events.xml\n----\n\nNOTE: Please run `validate --help` for more information.\n\n[#cli-convert]\n==== Convert event-based to hierarchical format\n\n[source,console],subs=\"attributes+\"]\n----\n$ java -jar open-test-reporting-cli-{openTestReportingVersion}.jar convert events.xml\nℹ️ Converted events.xml to file:///some/path/hierarchy.xml\n----\n\nNOTE: Please run `convert --help` for more information.\n\n[#cli-html-report]\n==== HTML report\n\nThe HTML report is a single-page application (SPA) that displays the test results in a tree-like structure and allows users to view details about each test/container.\nIt can be generated as follows using the \u003c\u003ccli, CLI\u003e\u003e:\n\n[source,console,subs=\"attributes+\"]\n----\n$ java -jar open-test-reporting-cli-{openTestReportingVersion}.jar html-report --output open-test-report.html events-1.xml hierarchical.xml\nℹ️ Wrote HTML report to file:///some/path/open-test-report.html\n----\n\nNOTE: Please run `html-report --help` for more information.\n\nThe command takes one or multiple XML files in the event-based or hierarchical format as input and generates a single HTML file that can be opened in any modern web browser without requiring a server.\n\n.Sample HTML report where all tests pass (light theme)\n--\nimage::documentation/html-report-successful.png[]\n--\n\n.Sample HTML report with a failing test (dark theme)\n--\nimage::documentation/html-report-failed.png[]\n--\n\n\n[#html-report-extension]\n===== Extending the HTML report\n\nSince the XML formats are \u003c\u003cxml-extensions, extensible\u003e\u003e, the HTML report can be extended to display additional information that is not part of the core schemas.\nIn order to do so, the _tooling-spi_ subproject defines a Java Service Provider Interface (SPI) that allows developers to implement a custom extension that is automatically picked up by the HTML report generator when it is on the classpath/module path.\nPlease refer to the Javadoc of the `org.opentest4j.reporting.tooling.spi.htmlreport.Contributor` interface for more information.\n\nTIP: See the link:https://github.com/junit-team/junit5/blob/86539a286b23b9dd192f3e54bc10e3c95f87773f/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/JUnitContributor.java[JUnit project] for an example of how to implement a `Contributor`.\n\n\n[appendix, #prior-art]\n== Prior art\n\nIn the Java ecosystem, Ant originally defined an XML-based reporting format for tests.\nOther build tools like Maven and Gradle have adopted the format and, in the case of Maven Surefire, later made changes to add additional data.\nMany build servers know how to parse the XML-based format, and even non-Java tools sometimes support it.\nHowever, it’s based on the concept of test classes and methods, so using it for frameworks and tools where those elements are not present is awkward at best.\nMoreover, it does not support nested structures beyond a simple parent-child relationship.\nFinally, it is not extensible: no additional attributes can be added without the risk of breaking existing tools.\n\nFor those reasons, many testing frameworks such as TestNG and Spock have defined their own reporting formats.\nThis has given them the flexibility they need, but the number of tools that can parse, display, or transform their custom formats is very limited.\n\nTo overcome the limitations described above, this document defines a new format for test reporting.\nIts goal is to be platform-agnostic so that as many testing frameworks as possible can benefit from it.\nMoreover, it is designed to be extensible so new data can be added as needed, without breaking consumers.\nHowever, all well-known attributes are properly defined so it’s consumable by downstream reporting tools.\n\n[appendix, #design-goals]\n== Design goals\n\nhuman-readable::\nThe new format needs to be human-readable so it can be inspected without requiring another tool.\nA format that represents the test tree via nesting is easier to understand than a flat list of events that reference their parents via IDs.\n\nstreamable::\nWriting report files during test execution should not require keeping state about currently running tests, etc. in memory.\nInstead, the new format should allow tools to write events to a file as they occur.\n\nmachine-readable::\nAt the same time, the format must be machine-readable so it can be easily parsed and transformed on a variety of platforms.\n\nschema-aware::\nImplementors and tools should be able to validate a given document against a well-known schema.\n\nextensible::\nAdding additional language- or framework-specific attributes to nodes must be possible without breaking backwards compatibility.\n\n=== XML vs. JSON\n\nJSON is less verbose than XML, but the latter provides more expressive ways to define schemas.\nMoreover, XML has typed extensions built-in via the use of multiple schemas.\nThus, the new formats use XML with accompanying XML schemas.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fota4j-team%2Fopen-test-reporting","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fota4j-team%2Fopen-test-reporting","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fota4j-team%2Fopen-test-reporting/lists"}