Logs, Reports, output.xml, Rebot, and Result Post-Processing: Core Concepts and Mental Model
Treat Robot Framework outputs as durable evidence: distinguish the machine-readable result model from HTML presentations and understand what Rebot changes without re-running tests.
Learning objectives
- Trace execution state into output.xml, log.html, report.html, xUnit, and post-processed artifacts.
- Explain why output.xml is evidence input while HTML files are presentations generated from the result model.
- Distinguish Rebot combine from --merge and identify when each preserves truthful identity.
- Inspect schema/generator metadata and suite/test status without mutating the run.
- Define retention, privacy, and ownership boundaries before post-processing evidence.
Current compatibility baseline. Verified
2026-08-31: Robot Framework 7.4.2 is the current stable release and
requires Python 3.8+; 7.5b1 is a pre-release and is not required
here. The 7.4.2 result.xsd is schema version
5; default XML outputs carry a
schemaversion attribute and Robot Framework 7.x can
also read legacy output. --legacyoutput exists for
Robot Framework 6.x-compatible consumers. Rebot combines independent
outputs by creating a new parent suite; --merge is for
the same logical top-level suite, including reruns, where later
matching test results replace earlier results and later SKIP results
do not replace originals. The built-in Testdoc tool is deprecated in
7.4.2 in favor of external Testdoc and is not a result-reporting
substitute.
1. The problem: a console session is not durable release evidence
Chapter 13 made failure semantics truthful. Chapter 14 asks what happens after the process exits. A green or red console line is transient. CI, incident review, release approval, reruns, and trend systems need artifacts that preserve exactly which suite/test ran, its status, messages, timing, tags, and hierarchy.
Robot Framework solves this with a result model. The executor builds
result state while tests run and serializes it to an output file.
The default XML file is commonly named output.xml.
Human-facing log.html and report.html are
presentations generated from that result state. Rebot reads output
files later and can filter, combine, merge, or regenerate
presentations without executing the system under test again.
2. Read-only preflight before touching artifacts
python --version
python -m robot --version
python -m robot.rebot --version
# Inspect the intended results directory before a run.
# PowerShell: Get-ChildItem -Recurse results -ErrorAction SilentlyContinue
# Bash: find results -maxdepth 3 -type f 2>/dev/null
Record the interpreter, Robot Framework/Rebot version, execution
command, selected source path, output directory, and any files that
already exist. The important question is provenance: if
report.html already exists, which
output.xml produced it? Never overwrite the only
first-failure artifact merely to make a prettier report.
3. Mental model: execution result → evidence → presentations → post-processing
flowchart TD A[.robot source + inputs] --> B[Robot executor] B --> C[In-memory result model] C --> D[output.xml / output.json] C --> E[log.html] C --> F[report.html] C --> G[xUnit XML optional] D --> H[Rebot] H --> I[Filtered/combined/merged result model] I --> J[new log/report] I --> K[new output file optional] I --> L[xUnit optional] M[Artifact retention policy] --> D M --> E M --> F M --> K N[Privacy/access policy] --> M
The executor is the only box that calls test keywords and changes the system under automation. Rebot is downstream: it reads result artifacts and transforms result state. That distinction matters during an incident. A report regenerated with a different title is not a new test execution. A merged result can change the final presentation of a rerun, but it must retain enough provenance to explain which original result was replaced.
4. Define the owners before modifying result data
| Object | Owner / scope | What may change it |
|---|---|---|
| Suite/test/task source | Repository / test author | Source edit; not Rebot |
| Robot variable/library/external state | Execution runtime | Robot run and libraries |
| In-memory result model | Current Robot/Rebot process | Execution or post-processing options/modifiers |
| output.xml | Artifact filesystem / CI workspace | Robot writes it; Rebot writes a new one only with --output |
| log.html / report.html | Presentation artifacts | Robot or Rebot generation |
| xUnit XML | CI interoperability artifact | Robot/Rebot with --xunit |
| Credentials/PII | Secret/privacy boundary | Must be prevented from leaking; HTML/XML are not secret stores |
| Retention/checksum manifest | CI/release governance | Artifact pipeline, not Robot test logic |
5. What output.xml proves—and what it does not
In Robot Framework 7.4.2 the authoritative XSD is schema version
5. The root <robot> element can
carry generator, generated,
rpa, and schemaversion attributes. The
file then contains the executed suite tree, optional statistics, and
execution errors/warnings. Suite/test elements contain status and
execution structure.
<robot generator="..." generated="..." rpa="false" schemaversion="5">
<suite name="Example" source="..." id="s1">
... tests / keywords / messages ...
<status status="PASS" .../>
</suite>
<statistics>...</statistics>
<errors>...</errors>
</robot>
Do not treat a hand-copied XML fragment as proof by itself. Provenance also needs the command, source revision, framework/interpreter versions, environment inputs, artifact path, and ideally a checksum. The XML proves Robot's recorded execution result; it does not independently prove the external system was trustworthy or that a credential was handled safely.
6. Log, report, and xUnit serve different readers
| Artifact | Primary audience | Strength | Limitation |
|---|---|---|---|
output.xml |
Robot/Rebot/tools | Detailed machine-readable result evidence | Can be large and privacy-sensitive |
log.html |
Engineer diagnosing a run | Hierarchical keyword/message detail | HTML presentation; can embed sensitive data |
report.html |
Reviewer/release owner | Suite/tag/test summary and links | Less diagnostic detail than log |
| xUnit XML | CI/testing dashboards | Broad interoperability | Summary-oriented; not a replacement for Robot output |
| Console | Person watching run | Immediate feedback | Transient and incomplete as evidence |
7. Combine and merge answer different identity questions
Combine says: “these are independent result roots
that belong under one reporting umbrella.” Rebot creates a new
top-level suite and places the input roots below it.
Merge says: “these files describe the same logical
top-level suite, perhaps because I reran failures or split
execution.” With --merge, matching later test results
replace earlier ones; later skipped matches are ignored so they do
not erase a real earlier result. Merging requires compatible
top-level suite identity.
| Situation | Choose | Why |
|---|---|---|
| Linux and Windows compatibility runs as independent roots | Combine | Preserve each root as a child under an aggregate report |
| Initial run plus rerun of failed tests | --merge |
Replace matching failed-test results with the rerun result |
| Same suite executed in selected pieces | --merge |
Reconstruct one logical suite tree |
| Two unrelated products with coincidentally similar test names | Combine | Do not pretend they are one logical suite |
8. Artifact retention is a separate control plane
A test can pass while artifact upload fails. A test can fail while its evidence is safely retained. Therefore execution status and evidence-retention status are separate controls. Production CI should normally retain the raw machine-readable result needed for diagnosis, publish appropriate HTML/xUnit derivatives, record versions/checksums, and apply access/retention policy based on sensitivity.
Privacy boundary. Robot result artifacts can
contain arguments, return values, keyword messages, paths,
environment-derived data, HTTP bodies, and library output. Do not
upload them to public artifacts by default.
Secret masking helps only inside Secret-aware Robot
surfaces and is not encryption or a guarantee against downstream
library disclosure.
9. Why this matters in DevOps
A release gate becomes auditable when the same evidence can be consumed by a human, Rebot, CI, and later incident review. The durable contract is: preserve the original run, identify every derived artifact, make transformation commands reproducible, keep schema/version compatibility explicit, and never let report cosmetics replace source-of-truth status.
10. Knowledge check
If you regenerate log.html from output.xml with Rebot, did you execute the tests again?
No. Rebot post-processes recorded result data; it does not call the system under test or re-run test keywords.
When is --merge preferable to normal combining?
When inputs represent the same logical top-level suite, such as a failed-test rerun or a suite executed in pieces. Independent roots should normally be combined.
Why is xUnit not enough as the only retained Robot artifact?
It is an interoperability summary and may not contain the detailed Robot keyword/message/hierarchy evidence needed for diagnosis or later Robot-aware post-processing.
What does schemaversion tell a consumer?
Which result XML schema version the file is compatible with; consumers should check it rather than assume all output.xml files have the same structure.
Does removing a secret-looking value from a derived HTML report prove the raw output is safe?
No. The raw output may still contain it. Prevention, access control, and deliberate retention are required; derived presentation cleanup is not retroactive secrecy.
11. Summary and next step
You now have the evidence model: execution produces result state; output.xml is the machine-readable artifact; log/report/xUnit are different views or interoperability outputs; Rebot transforms recorded results; combine and merge preserve different identities; and retention/privacy are explicit operational controls. Lesson 2 turns this model into a complete local workflow.
Further reading
- Robot Framework 7.4.2 User Guide — Post-processing outputs — Rebot, combine, merge, and JSON/XML result processing.
- Robot Framework 7.4.2 User Guide — Different output files — output, log, report, xUnit, and output-directory behavior.
- Robot Framework 7.4.2 User Guide — Removing and flattening keywords — output-size and evidence trade-offs.
- Robot Framework 7.4.2 result.xsd — authoritative XML schema version and root attributes.
- Robot Framework 7.4.2 release notes — stable release details and built-in Testdoc deprecation.
- Robot Framework 7.4.2 on PyPI — pinned package metadata and Python requirement.
- Robot Framework releases — re-check stable/pre-release status when updating this chapter.
Keep the academy open
Support free, practical DevOps education.
Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0
Send only Ethereum/ERC-20 compatible assets to this
address.