junit¶
Build JUnit XML reports from build events.
JUnit XML schema (consumed by GitLab CI, Jenkins, etc.):
<testsuites>
<testsuite name="..." tests="N" failures="M" errors="K" time="T">
<testcase name="..." classname="..." time="T">
<failure message="..." type="...">details</failure>
<error message="...">details</error>
<system-out>log lines</system-out>
<system-err>error lines</system-err>
</testcase>
</testsuite>
</testsuites>
TestSuite
¶
A single testsuite to include in a multi-suite JUnit report.
Attributes:
| Name | Type | Description |
|---|---|---|
name |
Value for the |
|
builds |
Build events (or synthetic events) for this suite. |
|
error_messages |
Suite-level |
|
elapsed_seconds |
Wall-clock duration of the underlying nix process
that produced these builds, used for the |
|
testcase_times |
Optional per-testcase wall-clock attribution.
Keys are |
Source code in src/junix/junit.py
__init__(name, builds, error_messages=None, elapsed_seconds=None, testcase_times=None)
¶
Initialize a TestSuite.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Value for the |
required |
builds
|
list[BuildEvent]
|
Build events for this suite. |
required |
error_messages
|
list[str] | None
|
Suite-level |
None
|
elapsed_seconds
|
float | None
|
Wall-clock seconds for |
None
|
testcase_times
|
dict[str, float] | None
|
Per-testcase wall-clock attribution. When
supplied, |
None
|
Source code in src/junix/junit.py
_build_suite_element(suite)
¶
Build a single <testsuite> element from a TestSuite.
The suite's time attribute is the sum of the per-testcase
time values that will be emitted below — the standard JUnit
convention. When BuildEvent.duration is None (synthetic
/ cached entries with no start event), the testcase time is 0
and the suite total excludes it. elapsed_seconds is used as
a fallback for callers that have no per-testcase timings.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
suite
|
TestSuite
|
The TestSuite to convert. |
required |
Returns:
| Type | Description |
|---|---|
Element
|
An xml.etree.ElementTree.Element for the testsuite. |
Source code in src/junix/junit.py
_build_testcase(build, error_messages, has_system_err, testcase_time=None)
¶
Build a single <testcase> element.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
build
|
BuildEvent
|
The build event to convert. |
required |
error_messages
|
list[str] | None
|
Suite-level error messages (attached to first failure). |
required |
has_system_err
|
bool
|
Whether system-err has already been emitted. |
required |
testcase_time
|
float | None
|
Per-testcase wall-clock attribution in seconds.
|
None
|
Returns:
| Type | Description |
|---|---|
Element
|
An xml.etree.ElementTree.Element for the testcase. |
Source code in src/junix/junit.py
_format_seconds(seconds)
¶
Format a duration in seconds for a JUnit time attribute.
Whole numbers are rendered without a trailing .0 ("0", "7")
so the output stays clean for the common case. Fractional values keep
up to three significant decimals ("7.5", "0.123") — enough
precision for build timings without trailing-zero noise. Sub-
millisecond values collapse to "0" rather than the empty
string, so the time attribute is always present and parsable.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
seconds
|
float
|
Duration in seconds. |
required |
Returns:
| Type | Description |
|---|---|
str
|
A short, human-readable string suitable for the |
Source code in src/junix/junit.py
_make_text_elem(tag, lines)
¶
Create a text element with joined lines content.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tag
|
str
|
XML tag name (e.g. |
required |
lines
|
list[str]
|
Lines of text to join with newlines. |
required |
Returns:
| Type | Description |
|---|---|
Element
|
An xml.etree.ElementTree.Element with the joined text. |
Source code in src/junix/junit.py
report_to_xml(builds, suite_name='nix-build', error_messages=None, elapsed_seconds=None, testcase_times=None)
¶
Convert build events into a JUnit XML string (single suite).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
builds
|
list[BuildEvent]
|
Collected build events from NixEventHandler. |
required |
suite_name
|
str
|
Value for the |
'nix-build'
|
error_messages
|
list[str] | None
|
Additional error messages (from the Nix logger)
to include in the suite-level |
None
|
elapsed_seconds
|
float | None
|
Wall-clock seconds for |
None
|
testcase_times
|
dict[str, float] | None
|
Per-testcase wall-clock attribution. Takes
precedence over |
None
|
Returns:
| Type | Description |
|---|---|
str
|
A JUnit XML string. |
Source code in src/junix/junit.py
report_to_xml_multi(suites)
¶
Convert multiple TestSuites into a single JUnit XML string.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
suites
|
list[TestSuite]
|
List of TestSuite objects to include. |
required |
Returns:
| Type | Description |
|---|---|
str
|
A JUnit XML string with one |
str
|
|