# Reporters

Source: https://docs.qualflare.com/docs/reporters · Last updated: 2026-10-29

Qualflare reporters write test results with steps, retries and attachments to a results folder, and the Qualflare CLI uploads it as one launch.

A Qualflare reporter is a package for your test framework that writes each run's results, with steps, per-attempt retries and attachments, to a results folder (`qualflare-results` by default) without a network call; `qf <identifier> collect` then uploads it to your project as one launch.

## How a reporter works

1. Install the reporter's package and register it in your framework's configuration, or, for Go and Maestro, run your tests through its command. Each reporter's page has the snippet.
2. Run your tests as usual. The reporter writes one report file per process to its results folder, so the test run needs no token and no network access.
3. After the tests, run `qf <identifier> collect ./qualflare-results` with a saved login. `qf` merges every report of the run into one launch, uploads screenshots by default, and adds videos and traces with `--upload-artifacts video,trace`.

When the folder holds reports of earlier runs, `qf` uploads only the newest run and prints `ignored N file(s) from M earlier run(s)`: see [Collect a directory](https://docs.qualflare.com/docs/cli/sharding#collect-a-directory).

The access token you save with [qf login](https://docs.qualflare.com/docs/cli/authentication) needs a creator who still holds the project role that uploads need (requires the Editor role or higher in the project).

Flutter is the exception: `flutter test` writes its own JSON file, which `qf` reads, and the `qualflare_flutter` package adds its data to that file.

## What a native reporter adds

A native reporter records what generic formats such as JUnit XML can't carry:

* **Per-attempt retry history**: each attempt's own status and error text, not only the final result. pytest's JUnit XML writes a retried test as repeated bare `<testcase>` elements with no failure text, so that information is missing from the file.
* **Steps**, nested ones included, with their own timing and status.
* **Attachments**: screenshots, logs and other files.
* **Labels, links, tags, priority and parameters** that a test sets about itself. A masked parameter's value is dropped before the report is written.
* **CI details**: the provider, build number, pull request and run link that the launch header shows.

The Go reporter also catches build failures, which produce no event in `go test -json` before Go 1.24, so a broken build doesn't upload as a passing run.

*Figure: A case run from a native reporter shows its steps, labels and links.*

## Choose a reporter

Every reporter is Apache-2.0 and published on npm, PyPI, Maven Central, pub.dev, the Go module proxy or the Qualflare Homebrew tap. Pick the one for the framework that runs your tests.

### JavaScript and TypeScript

| Framework                                                            | Package                                                                        | Registry | Works with                                              |
| -------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -------- | ------------------------------------------------------- |
| [Playwright](https://docs.qualflare.com/docs/reporters/playwright)   | [`@qualflare/playwright`](https://github.com/Qualflare/qualflare-playwright)   | npm      | `@playwright/test` 1.40 or later, Node.js 18 or later   |
| [Cypress](https://docs.qualflare.com/docs/reporters/cypress)         | [`@qualflare/cypress`](https://github.com/Qualflare/qualflare-cypress)         | npm      | Cypress 12 or later, Node.js 18 or later                |
| [Jest](https://docs.qualflare.com/docs/reporters/jest)               | [`@qualflare/jest`](https://github.com/Qualflare/qualflare-jest)               | npm      | Jest 29 or later, Node.js 18 or later                   |
| [Vitest](https://docs.qualflare.com/docs/reporters/vitest)           | [`@qualflare/vitest`](https://github.com/Qualflare/qualflare-vitest)           | npm      | Vitest 3 or later, Node.js 18 or later                  |
| [Mocha](https://docs.qualflare.com/docs/reporters/mocha)             | [`@qualflare/mocha`](https://github.com/Qualflare/qualflare-mocha)             | npm      | Mocha 8 or later, Node.js 18 or later                   |
| [Cucumber.js](https://docs.qualflare.com/docs/reporters/cucumber)    | [`@qualflare/cucumberjs`](https://github.com/Qualflare/qualflare-cucumberjs)   | npm      | `@cucumber/cucumber` 10.8 or later, Node.js 18 or later |
| [WebdriverIO](https://docs.qualflare.com/docs/reporters/webdriverio) | [`@qualflare/webdriverio`](https://github.com/Qualflare/qualflare-webdriverio) | npm      | WebdriverIO 8 or 9, Node.js 18.20 or later              |

### Mobile

| Framework                                                      | Package                                                                               | Registry      | Works with                                                |
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------- | --------------------------------------------------------- |
| [Appium](https://docs.qualflare.com/docs/reporters/appium)     | [`@qualflare/appium`](https://github.com/Qualflare/qualflare-appium)                  | npm           | Appium through WebdriverIO 8 or 9, Node.js 18.20 or later |
| [Detox](https://docs.qualflare.com/docs/reporters/detox)       | [`@qualflare/detox`](https://github.com/Qualflare/qualflare-detox)                    | npm           | Detox 20 and Jest 29 or later, Node.js 18 or later        |
| [Espresso](https://docs.qualflare.com/docs/reporters/espresso) | [`com.qualflare:qualflare-espresso`](https://github.com/Qualflare/qualflare-espresso) | Maven Central | minSdk 24, `androidx.test:monitor` 1.4.0 or later         |
| [Maestro](https://docs.qualflare.com/docs/reporters/maestro)   | [`qualflare-maestro`](https://github.com/Qualflare/qualflare-maestro)                 | Homebrew      | Maestro 2.6.0 or later                                    |
| [Flutter](https://docs.qualflare.com/docs/reporters/flutter)   | [`qualflare_flutter`](https://github.com/Qualflare/qualflare-flutter)                 | pub.dev       | Flutter 3.24 or later, Dart 3.5 or later                  |

### Python, Go and JVM

| Framework                                                  | Package                                                                           | Registry                 | Works with                                     |
| ---------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------ | ---------------------------------------------- |
| [pytest](https://docs.qualflare.com/docs/reporters/pytest) | [`qualflare-pytest`](https://github.com/Qualflare/qualflare-pytest)               | PyPI                     | pytest 7.0 or later, Python 3.9 or later       |
| [Go](https://docs.qualflare.com/docs/reporters/go)         | [`qualflare-go`](https://github.com/Qualflare/qualflare-go)                       | Homebrew or `go install` | Go 1.21 or later                               |
| [JUnit 5](https://docs.qualflare.com/docs/reporters/junit) | [`com.qualflare:qualflare-junit5`](https://github.com/Qualflare/qualflare-junit5) | Maven Central            | JUnit Platform 1.12 or later, Java 11 or later |
| [TestNG](https://docs.qualflare.com/docs/reporters/testng) | [`com.qualflare:qualflare-testng`](https://github.com/Qualflare/qualflare-testng) | Maven Central            | TestNG 7.4.0 or later, Java 11 or later        |

## Without a reporter

* For a framework with no Qualflare reporter, upload the report it already writes: `qf` reads 27 frameworks and 4 generic formats. See [Supported formats](https://docs.qualflare.com/docs/cli/formats).
* Most other tools can write [JUnit XML](https://docs.qualflare.com/docs/cli/formats#junit) or [CTRF](https://docs.qualflare.com/docs/cli/formats#ctrf).
* Every framework above also has its own report format that `qf` reads without the reporter, with less detail: each reporter page names it.

## Configure a reporter

Every reporter except `qualflare_flutter`, which has no options, takes its options from its framework's configuration or its command-line flags, or from `QUALFLARE_*` environment variables, and writes the environment and platform you set into its report. Set the environment to the environment's **Identifier**, not its name: see [Reporter configuration](https://docs.qualflare.com/docs/reporters/configuration#environment).

## Related

* **Guides:** [Upload results with qf collect](https://docs.qualflare.com/docs/cli/collect) · [Sharded runs and result directories](https://docs.qualflare.com/docs/cli/sharding) · [Upload screenshots, videos and traces](https://docs.qualflare.com/docs/cli/artifacts)
* **Reference:** [Reporter configuration](https://docs.qualflare.com/docs/reporters/configuration) · [Supported formats](https://docs.qualflare.com/docs/cli/formats) · [Launches](https://docs.qualflare.com/docs/runs/launches)
* **CLI and API:** [Authenticate with qf login](https://docs.qualflare.com/docs/cli/authentication) · [CI/CD](https://docs.qualflare.com/docs/cli/ci-cd)
