AskUIDocs
Results & Reports

Export

Export an execution report, a run summary, or a Management Report as PDF for people, as JSON for your own tools, or as JUnit XML for your CI system, and what each format holds.

Three reports export as PDF, JSON, and JUnit XML:

ReportWhere you export it
Execution report of one testRuns page: Export in the header row above the report, or right-click the test
Run summary of one runRuns page: Export on the summary report
Management Report of a date rangeRuns page, with no test selected: Generate Management Report in the report pane, then Download PDF, Download JSON, or Download JUnit XML

PDF is for people who don't have the app: a test manager, a customer, an auditor. JSON is for your own toolchain: a dashboard, a quality gate, or a test management system. JUnit XML is for the test report view of your CI system, such as Jenkins or GitLab.

Export a report

  1. Open the execution report or the summary report on the Runs page.
  2. Click Export. Above an execution report, it sits in the header row with the test's name, which stays visible while the report scrolls.
  3. Pick Export as PDF, Export as JSON, or Export as JUnit XML.
  4. Pick the folder and the file name in the save dialog.

The save dialog opens in the project's reports/ folder. The first export creates that folder. You can pick any other location.

For an execution report, you can also right-click the test and pick Export as PDF, Export as JSON, or Export as JUnit XML. The entries appear once the test's report is written. The Management Report has its own steps: Create a report.

If the export fails, AskUI Desktop shows the error and writes no file. A half-written file never replaces an existing one.

Every PDF has the AskUI design. Statuses appear as labelled markers, for example PASSED.

  • Execution report and run summary: no cover and no end page. The PDF opens with a dark header band: the AskUI logo, Execution report or Run summary, the test or plan name, and the facts (status, duration, cost, run, device, model).
  • Management Report: a dark cover page, numbered sections, and a dark end page: What the report shows.

Every page except a cover and an end page has a running header (the AskUI mark, the project and the kind of document) and a footer (Generated with AskUI Desktop with the date and time, and Page n / m).

The first PDF export

AskUI Desktop prints PDFs with a Chromium browser. If it is missing, the first PDF export downloads it once, about 170 MB. This export takes longer. The download and its cache are the same as for runs on a web browser profile, so a machine that already ran a web test downloads nothing.

The JSON documents

Every JSON document starts with two fields:

  • schemaVersion: the version of the document's layout, currently 1. A new version means a field changed meaning or was removed.
  • kind: execution-report, run-summary, or management-report.

Read kind first, then the fields of that kind. Times are ISO 8601 with a time zone offset. A value that is unknown is null.

The run

The execution report and the run summary both carry a run object:

FieldHolds
folderThe run's folder name under agent_workspace/
startedAt, endedAtWhen the run started and ended
planThe test plan the run executed
deviceThe name of the device profile the run used
modelThe model that ran the tests
appVersionThe version of AskUI Desktop
costThe run's total cost in USD, reports included

Counts

The run summary and the Management Report count results in a counts object: counts in the run summary and in each test and run entry of the Management Report, and totals at the top of the Management Report. Every counts object has the same fields:

{ "passed": 11, "failed": 1, "broken": 0, "warnings": 2, "notCounted": 3,
  "executed": 12, "passRate": 92, "allGreen": false }
FieldHolds
passedTests that passed, warnings included
failedTests that failed
brokenTests that broke
warningsTests that passed with a warning
notCountedRows that do not count: skipped tests, discarded and deprecated tests, and setup or teardown rows
executedTests that count: passed, failed, and broken
passRatePassed out of executed, in percent, or null when nothing ran
allGreentrue when something executed and nothing failed or broke

Execution report

login_test.json (shortened)
{
  "schemaVersion": 1,
  "kind": "execution-report",
  "run": { "folder": "2026-10-05_09-00-00", "device": "Staging browser", "...": "..." },
  "test": "login_test",
  "file": "/projects/shop/tests/login_test.md",
  "status": "FAILED",
  "reason": "Expected the dashboard, saw an error banner.",
  "startedAt": "2026-10-05T09:00:00+00:00",
  "endedAt": "2026-10-05T09:01:12+00:00",
  "markdown": "# Test Case Report: login_test\n...",
  "writer": {
    "state": "ready",
    "writtenAt": "2026-10-05T09:01:40+00:00",
    "model": "claude-sonnet-5",
    "inputTokens": 21500,
    "outputTokens": 1180,
    "cacheReadTokens": 0,
    "cacheWriteTokens": 0,
    "cost": 0.0822,
    "error": null
  },
  "cost": { "execution": 0.3315, "report": 0.0822, "total": 0.4137 }
}
FieldHolds
runThe run
test, fileThe test's name and its file
status, reasonThe recorded result
startedAt, endedAtWhen the test started and ended
markdownThe execution report as Markdown, or null when none was written
writerHow the report was written: state (ready or failed), writtenAt, model, the tokens, cost, and the error of a failed report
costWhat the test cost in USD: execution, its report, and the total. Each part is null when unknown, total only when both are

Run summary

FieldHolds
runThe run
countsCounts over the run's tests
testsOne entry per row of the summary: id, name, status, duration. It lists every test, the setup and teardown rows that recorded something to report, and the tests that never started as SKIPPED

Management Report

FieldHolds
projectThe project's name
from, toThe date range you picked
firstRunAt, lastRunAtThe test period: the first and the last counted run
detailsThe additional information from the dialog: softwareVersion, author, preparedFor, reference, remarks. Each is null when empty
runNameFilterThe run name text the report was narrowed by, or null when no filter was set
plans, devicesLists of the plans and devices of the counted runs
totalsCounts over all counted runs
testsOne entry per test: name, runs, counts, lastStatus, lastRunAt
runsOne entry per run in the range: folder, startedAt, title, plan, device, counts, and excluded (true for a run you unticked)
executionsOne entry per test execution of the counted runs: runFolder, startedAt, run, test, status, duration, hasReport (true when the execution has an execution report), and canHaveReport (true when a report can be written for it: it recorded a test result and its run kept its conversation)
daysOne entry per day: date, executed, passed

The same runs and the same choices give the same Management Report JSON, byte for byte. It has no timestamp of its own and no text from a model.

JUnit XML

The root of every JUnit XML file is <testsuites>. Inside it:

ReportHolds
Run summaryOne <testsuite> for the run
Management ReportOne <testsuite> per counted run
Execution reportOne <testcase>, with the report's Markdown and its screenshots in <system-out>

In an execution report, each screenshot is one line of this form, after the Markdown:

[[ATTACHMENT|<absolute path>]]

Jenkins, with the JUnit Attachments plugin, and GitLab read these lines and show the screenshots next to the test.

The statuses map to JUnit like this:

AskUI statusIn JUnit XML
PASSED, WARNINGpassed
FAILED<failure>
BROKEN<error>
SKIPPED, DISCARDED, DEPRECATED, and tests that never ran<skipped>, with the reason

Each <testcase> has the test file as its classname. Each <testsuite> carries the plan, the device, the model, and the app version as properties.

AskUI Desktop writes these files and does not read them back. To keep a report inside the app, keep the run folders.

On this page