NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2894 most downloaded on crates.io
Data model, serializer, and deserializer for JUnit/XUnit XML
Last release 27 days ago
10 Sep 2026
Release timing varies
gaps range from 1 weeks to 12 months
Nearly every release is documented
notes for 22 of 22 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
23 releases · first in 2022
One column per quarter.
Report::name is now an Option<XmlString> rather than an XmlString .
Report::name is now an Option<XmlString> rather than an XmlString.
Many tools, most notably Python's junit-xml, emit a <testsuites> element without a name attribute, and the Jenkins junit-10 schema doesn't require one either. Previously, quick-junit rejected such reports with a missing attribute error. With this change:
name now deserialize with name set to None.name: None omits the attribute.Report::new continues to require a name; use the new Report::unnamed constructor to build a report without one.
Thanks nikstur for your first contribution!
Skipped test counts are now reported via the skipped attribute rather than disabled . For <testsuite> , skipped matches the llg schema and the Jenkins
Skipped test counts are now reported via the skipped attribute rather than disabled. For <testsuite>, skipped matches the llg schema and the Jenkins junit-10 schema, as well as pytest and Maven Surefire.
<testsuite> now emits skipped="N", and the root <testsuites> element now emits an aggregated skipped="N" count. Previously the root didn't carry a skip count at all.skipped is a quick-junit extension. It follows the modern JUnit convention (as documented, for example, by testmoapp/junitxml) and is similar to quick-junit's existing extensions such as uuid.TestSuite's disabled field has been renamed to skipped.Report gains new public skipped and disabled fields, and Report::add_test_suite now aggregates skip counts into Report::skipped.disabled is now modeled as a separate optional count on both Report and TestSuite, distinct from skipped. (disabled is intended to count tests that are disabled by design, such as googletest's DISABLED_-prefixed tests. Note, however, that quick-junit doesn't have a notion of disabled tests at the moment.)
Report is now #[non_exhaustive], consistent with TestSuite and TestCase. Construct it via Report::new and then assign fields, so that future field additions are non-breaking.<testsuite> and <testcase> elements are now serialized as self-closing tags (for example, <testcase name="my-test"/> rather than <testcase name="my-test"></testcase>). The output is semantically identical XML, only more compact and idiomatic. The deserializer already accepted these self-closing forms, so serializing them means round-trip tests now cover those parse paths.Internal dependency update: quick-xml updated to 0.41.0. This resolves the following deserialize-time denial of service issues:
Internal dependency update: quick-xml updated to 0.41.0. This resolves the following deserialize-time denial of service issues:
TestCaseStatus::NonSuccess 's reruns field is now a NonSuccessReruns struct. NonSuccessReruns bundles the list of reruns with a FlakyOrRerun kind that
TestCaseStatus::NonSuccess's reruns field is now a NonSuccessReruns struct. NonSuccessReruns bundles the list of reruns with a FlakyOrRerun kind that controls whether they are serialized as <flakyFailure>/<flakyError> or <rerunFailure>/<rerunError>. This enables representing tests that both failed and exhibited flaky behavior, as permitted by the JUnit XSD and as supported by an upcoming version of cargo-nextest.flakyFailure and rerunFailure being present.A long-requested feature: deserialization support for reports! The new deserializer has undergone fuzzing and property-based testing, and it is known
proptest feature allows for generation of arbitrary Reports.Internal dependency update: quick-xml updated to 0.38.3.
Internal dependency update: quick-xml updated to 0.37.1.
Internal dependency update: quick-xml updated to 0.37.1.
The Output type, which strips invalid XML characters from a string, has been renamed to XmlString .
Output type, which strips invalid XML characters from a string, has been renamed toXmlString.XmlString rather than String.Use newtype-uuid for the report UUID.
Updated repository to https://github.com/nextest-rs/quick-junit .
Updated repository to https://github.com/nextest-rs/quick-junit .
[quick-junit] version 0.3.5
[quick-junit] version 0.3.5
rust-version field in Cargo.toml to 1.70.chrono dependency no longer imports the clock feature. This helps cut down on the dependency tree. Thanks @littledivy for your first contribution!Output::new now strips ANSI escapes as well. Thanks @MaienM for your first contribution!
Output::new now strips ANSI escapes as well. Thanks @MaienM for your first contribution!quick-xml updated to 0.31.0.TestCase now has an extra properties section and an add_property method, similar to TestSuite. Thanks @skycoop for your first contribution!
TestCase now has an extra properties section and an add_property method, similar to TestSuite. Thanks @skycoop for your first contribution!Internal dependency update: quick-xml updated to 0.26.0.
(This version was not published due to a code issue.)
(This version was not published due to a code issue.)
Report contains a new uuid field with a unique identifier for a particular run. This is an extension to the JUnit spec.
Report contains a new uuid field with a unique identifier for a particular run. This is an extension to the JUnit spec.The error type is now defined by quick-junit, so that future breaking changes to quick-xml will not necessitate a breaking change to this crate.
### Changed - Lower MSRV to Rust 1.54.
In readme, fix link to cargo-nextest.
In the readme, replace Markdown checkboxes with Unicode ✅ to make them render properly on crates.io.
- Expand readme. - Add keywords and categories.
Fix repository field in Cargo.toml.
<!-- next-url --> [0.8.0]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.8.0 [0.7.0]: https://github.com/nextest-rs/quick-junit
<!-- next-url --> [0.8.0]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.8.0 [0.7.0]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.7.0 [0.6.1]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.6.1 [0.6.0]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.6.0 [0.5.2]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.5.2 [0.5.1]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.5.1 [0.5.0]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.5.0 [0.4.0]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.4.0 [0.3.6]: https://github.com/nextest-rs/quick-junit/releases/tag/quick-junit-0.3.6 [0.3.5]: https://github.com/nextest-rs/nextest/releases/tag/quick-junit-0.3.5 [0.3.4]: https://github.com/nextest-rs/nextest/releases/tag/quick-junit-0.3.4 [0.3.3]: https://github.com/nextest-rs/nextest/releases/tag/quick-junit-0.3.3 [0.3.2]: https://github.com/nextest-rs/nextest/releases/tag/quick-junit-0.3.2 [0.3.1]: https://github.com/nextest-rs/nextest/releases/tag/quick-junit-0.3.1 [0.3.0]: https://github.com/nextest-rs/nextest/releases/tag/quick-junit-0.3.0 [0.2.0]: https://github.com/nextest-rs/nextest/releases/tag/quick-junit-0.2.0 [0.1.5]: https://github.com/nextest-rs/nextest/releases/tag/quick-junit-0.1.5 [0.1.4]: https://github.com/nextest-rs/nextest/releases/tag/quick-junit-0.1.4 [0.1.3]: https://github.com/diem/diem-devtools/releases/tag/quick-junit-0.1.3 [0.1.2]: https://github.com/diem/diem-devtools/releases/tag/quick-junit-0.1.2 [0.1.1]: https://github.com/diem/diem-devtools/releases/tag/quick-junit-0.1.1 [0.1.0]: https://github.com/diem/diem-devtools/releases/tag/quick-junit-0.1.0
Your coding agent can read these notes before it upgrades. Set up the MCP server →