# Share an Xcode Test Report — .xcresult at a URL Anyone Can Open

Canonical: https://commareports.com/share-xcode-test-report
Published: 2026-08-30

> An .xcresult bundle only opens in Xcode, on a Mac, by someone with the project. Convert it to HTML and publish it: one link per run, screenshots attached, threads on the failing test.

# Share an Xcode test report

`xcodebuild test` produces an `.xcresult` bundle: genuinely rich, with
per-test timing, attachments, and video of UI test failures. It is also a
macOS bundle that only Xcode can read.

So iOS test results reach everyone else the way they always have — as a
screenshot of the Report Navigator, cropped to the red row.

## Convert the bundle to HTML

```bash
xcodebuild test \
  -scheme MyApp \
  -destination 'platform=iOS Simulator,name=iPhone 15' \
  -resultBundlePath TestResults.xcresult || true

# community converter: reads the bundle, writes a self-contained report
xchtmlreport -r TestResults.xcresult
# → TestResults.xcresult/index.html
```

Apple's own `xcresulttool` exports the bundle's JSON if you'd rather
template it yourself:

```bash
xcrun xcresulttool get --path TestResults.xcresult --format json
```

Note the `|| true` — a failing test fails `xcodebuild`, and everything
after it has to survive that. That's the run you most want published.

## Publish it

```bash
curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile html index.html \
        --arg title "iOS tests — $(git rev-parse --short HEAD)" \
        '{title: $title, html: $html}')"
```

Use a [scoped token](/docs/api-tokens) (`reports:write`) from CI secrets
and `PATCH` a saved report id, so one URL accumulates a revision per run
rather than a new orphan link every build. In GitHub Actions mark the step
`if: always()`. See [publishing from CI](/ci).

For a one-off, drag the generated report folder into
[the app](https://commareports.com/) — the entry HTML becomes the report
body and the screenshots upload alongside it with relative references
rewritten.

## Attach the screenshots

A failed UI test assertion is close to unreadable as text. `XCTAttachment`
screenshots are the actual evidence, and in the normal flow they expire
with the CI artifact retention window.

Upload them as report assets and they live next to the report and the
discussion permanently — 25 MB per file, 250 MB and 500 files per report.
See the [API reference](/docs/api).

## Who the audience actually is

This is the part that makes iOS reports worth publishing more than most.
The people who need to see a failing UI test are frequently **not iOS
engineers**:

- The designer who wants to know whether the layout regression is real.
- The PM triaging whether to ship.
- The backend engineer whose API change broke the integration test.

None of them have Xcode open. All of them can open a URL, and all of them
can leave a comment anchored to the specific failure — which then stays
attached across runs, so a chronically flaky UI test carries its own
history rather than being re-litigated every sprint. See
[commenting on HTML](/comment-on-html).

## Who can see it

Per report: private, your team, any signed-in user with the link, or
public. Test reports name internal screens and API paths, so team is the
usual default. Domain-gating, password gates and expiring links are
Enterprise. See [sharing & access control](/docs/sharing).

## Limits

- **Entry HTML: 5 MB.** Assets: 25 MB per file, 250 MB and 500 files
  total — UI test video can hit the per-file limit, so prefer screenshots
  or trim the recording.
- **Scripts run, sandboxed** (`allow-scripts`, no `allow-same-origin`), so
  the report's filtering and collapsible sections keep working.
- **60 requests/minute per token.**

## Try it

Comma is free — unlimited reports, unlimited commenters, unlimited
revision history.

**[Publish a test report →](https://commareports.com/)**

### Related

- [Share a JUnit report](/share-junit-report) · [Share an Allure report](/share-allure-report)
- [Share a Playwright report](/share-playwright-report) · [Share a Cypress report](/share-cypress-report)
- [Publish from CI](/ci) · [Bitbucket Pipelines HTML reports](/ci/bitbucket-pipelines-html-report)
