Skip to content

Early Adopter Offer:Get 40% off Core & Scale for your first year with code EARLYQFView pricing

Jest test reporting

Jest gives you a terminal summary and a --json results file — but that’s a file, not a dashboard, and it’s gone next run. Qualflare ingests your Jest results and turns them into hosted, historical reporting: AI clusters failures by root cause, scores flaky tests from run history, and rates each launch’s risk — across every CI run and every package in your monorepo. A native Jest reporter captures results as the run happens, so steps, attachments and metadata arrive with them rather than being reconstructed from a results file.

Why Jest’s built-in output isn’t enough

Jest’s reporting is intentionally local: rich terminal output, a machine-readable --json file, and — if you add a package like jest-html-reporters — a local HTML report. All of it is per-run and lives on the machine that ran it. Nothing collects results across CI runs, aggregates the packages in a monorepo, or tells you whether a test has been getting flakier over the last two weeks. For that you need something that stores results over time and analyzes them.

Send Jest results to Qualflare

Install the native reporter as a dev dependency:

npm install --save-dev @qualflare/jest

Add it to reporters alongside Jest's own, so you keep the terminal output:

// jest.config.js
module.exports = {
  reporters: ['default', ['@qualflare/jest/reporter', { environment: 'staging' }]],
};

Then run Jest as usual. It writes a report directory and makes no network calls; the CLI uploads it. Your testEnvironment is untouched:

npx jest                               # writes ./qualflare-results
qf my-project collect ./qualflare-results

Requires Jest 29 or newer and Node 18+. Sharded runs point every shard at the same output directory and collect once at the end — each process writes its own uniquely-named file, so shards never overwrite each other.

Without the reporter: the JSON results file

If you would rather not add a dependency, Jest's own --json output still works — you lose steps, attachments and metadata, but the results land:

# Jest writes a JSON results file natively — no extra reporter needed
npx jest --json --outputFile=jest-results.json

Upload it with the Jest-aware parser; the CLI attaches your Git branch and commit automatically:

# Upload to Qualflare with the Jest-aware parser
qf my-project collect jest-results.json --format jest

In CI, that’s one extra step after your test run (GitHub Actions shown — GitLab CI, CircleCI, and Jenkins work the same way). Authenticate the CLI once with your Qualflare access token, stored as a CI secret — see the CLI docs.

# .github/workflows/tests.yml
- name: Run Jest
  run: npx jest

- name: Upload results to Qualflare
  if: always() # upload even when tests fail — that's the point
  run: qf my-project collect ./qualflare-results

What you get on top of Jest

  • AI failure clustering. When a single broken mock or import takes down 40 tests, Qualflare groups them by root cause — so you fix one thing instead of scrolling 40 stack traces.
  • Flaky detection from history. Qualflare scores each test’s flakiness from its pass/fail record across runs — the accurate, retry-free method. (Jest doesn’t retry by default; if you emit JUnit XML via jest-junit, any in-run retries are read too.)
  • Monorepo aggregation. Upload each package’s JSON and Qualflare merges them into one launch — a single picture across every project in the repo.
  • Per-launch risk. Each CI run becomes a launch with a risk rating, the failing areas, and recommended next steps — a ship / don’t-ship signal that arrives with the results.
  • History, trends & defects. Pass rate, slowest tests, and flakiness over time across branches — plus a defect you can open straight from a failing run.

Raw Jest output vs Qualflare

  --json / jest-html-reporters Qualflare
History across CI runs—Yes
Aggregates monorepo packages—Yes
AI failure clustering (root cause)—Yes
Flaky scoring over time—Yes
Local, zero-setup, offlineYes—

Complementary: keep --json / jest-html-reporters for local runs, add Qualflare for hosted, historical CI observability.

Get AI analysis on your Jest runs

Start free — add --json --outputFile, run qf collect, and get your first AI analysis in minutes.

Get Started Free

Qualflare works the same with Playwright, pytest, Cypress, JUnit and 20+ more frameworks. Testing a mobile app too? See our Android (Espresso), iOS (XCTest), and Maestro guides. Weighing tools? See how it compares to other test management platforms, or browse all framework reporting guides. Hitting non-deterministic specs? See our guide to fixing flaky Jest tests in CI.

Monorepos, projects, and Jest sharding

Jest is the framework most likely to be running inside a monorepo, and its projects feature runs every package’s suite in one invocation — which means one results file already covering the whole repo, with each test tagged by its project:

// jest.config.js — multi-project monorepo: one run, every package reported
module.exports = {
  projects: ['<rootDir>/packages/*'],
};

For big suites, Jest 28+ added native sharding. Unlike Playwright there’s no blob-merge step — each shard writes its own JSON, and you pass all of them to a single qf collect (it takes multiple files and globs) so the whole sharded run lands as one launch:

# Jest 28+ shards natively — one JSON per shard
npx jest --shard=1/3 --json --outputFile=jest-results-1.json

# Collect every shard's file in ONE command so the run stays one launch
qf my-project collect jest-results-*.json

One thing Jest deliberately lacks is built-in retries at the runner level — jest.retryTimes() exists per test file but most teams run without retries, so flakiness shows up as raw intermittent failures rather than recorded retry attempts. That makes cross-run history the only reliable way to separate a flaky Jest test from a real regression — exactly what hosted reporting adds.

Frequently asked questions

How do I send Jest results to Qualflare?

Install the native reporter with npm install --save-dev @qualflare/jest and add it to your reporters array alongside Jest's own: reporters: ['default', ['@qualflare/jest/reporter', { environment: 'staging' }]]. Run npx jest as usual — it writes ./qualflare-results and makes no network calls — then upload with qf <project> collect ./qualflare-results. If you would rather not add a dependency, Jest's built-in JSON output still works: npx jest --json --outputFile=jest-results.json, then qf <project> collect jest-results.json --format jest, without steps, attachments or metadata. Either way the CLI attaches your Git branch and commit and turns the run into a tracked launch with AI analysis.

Do I need the reporter, or is the JSON file enough?

Both work, and the difference is context rather than correctness. The native @qualflare/jest reporter runs inside the Jest run, so it can record steps, file attachments and author-facing metadata such as labels, links, tags and priority, and it writes one uniquely-named file per process so sharded runs merge into a single launch. Jest's own --json file carries the results and nothing else. Use the reporter unless you cannot add a dev dependency. It requires Jest 29+, Node 18+, and @qualflare/cli v0.1.24 or newer for image attachments.

Does Qualflare detect flaky Jest tests?

Yes — by analyzing each test’s pass/fail history across runs, which is the accurate, retry-free way to spot flakiness (in-run retries can actually mask it). Jest doesn’t retry by default, so history-based scoring is the right approach: Qualflare surfaces which Jest tests are intermittently failing and whether that’s trending up.

Can I use the jest-junit reporter instead of JSON?

Yes. If you already emit JUnit XML with jest-junit, upload it with --format junit instead of --format jest — both work. The JUnit-XML route also reads any in-run retry counts and flaky status you’ve enabled (e.g. via jest.retryTimes()) directly from the file. Pick whichever format your pipeline already produces.

Does it work with a monorepo or Jest “projects”?

Yes. Run Jest across your monorepo packages or projects config, then upload the JSON (or one file per package). Qualflare aggregates them into a single launch, so you get one pass/fail picture and shared history across the whole repo rather than a separate report per package.

Does it work in GitHub Actions and other CI for Node?

Yes. Add a step after your Jest run that calls qf <project> collect on the JSON file. The CLI auto-attaches the Git branch and commit (or pass --branch/--commit), so each CI run becomes a tracked launch. The same flow works in GitLab CI, CircleCI, Bitbucket Pipelines, and Jenkins.

Setup reflects the Qualflare CLI (docs.qualflare.com) and Jest’s built-in JSON output as of June 2026. Written by İbrahim Süren, Qualflare.