How to Share Jest Test Results with Your Team

Jest runs your tests and prints results to the console. CI captures the output, but sharing it with your team means “go check the workflow run” or screenshotting terminal output into Slack. There’s no built-in way to share Jest results as a link.

The Sharing Problem

Jest outputs to stdout by default. You can add reporters for JSON or HTML, but those files are stuck in CI artifacts:

Common (Bad) Solutions

1. “Check the CI logs”

  • Requires repo access and navigating through workflow runs
  • QA or PMs might not have CI access
  • Logs disappear when retention expires

2. CI artifacts

  • Download a zip, extract, find the right file
  • GitHub Actions keeps artifacts 90 days max
  • Finding the right artifact in dozens of workflow runs is tedious

3. Screenshot the terminal

  • Loses all structure and detail
  • Can’t reference later
  • Looks terrible in Slack

4. Paste JSON output in a thread

  • Nobody reads raw JSON
  • Truncated for large test suites
  • No filtering or navigation

Upload Jest results after every CI run. Every test run gets a permanent URL that anyone on your team can open.

What This Looks Like

  1. CI runs your Jest tests
  2. Results upload automatically
  3. You get a URL like https://app.gaffer.sh/reports/abc123
  4. Share in Slack, GitHub PRs, Jira — anywhere
  5. Anyone with access sees the full report

No downloads. No CI access required. No expiring artifacts.

Setting Up Jest Report Sharing with Gaffer

Step 1: Configure Jest Output

CTRF gives the richest analytics data:

Terminal window
npm install jest-ctrf-json-reporter --save-dev
jest.config.js
module.exports = {
reporters: [
'default',
['jest-ctrf-json-reporter', { outputFile: 'ctrf-report.json' }]
]
};

Gaffer also accepts Jest’s built-in JSON output and jest-html-reporter if you prefer those.

Step 2: Add the Upload Step to CI

GitHub Actions:

- name: Run tests
run: npm test
- name: Upload to Gaffer
if: always()
uses: gaffer-sh/gaffer-uploader@v1
with:
gaffer_api_key: ${{ secrets.GAFFER_UPLOAD_TOKEN }}
report_path: ./ctrf-report.json
commit_sha: ${{ github.sha }}
branch: ${{ github.ref_name }}

GitLab CI:

test:
script:
- npm ci
- npm test
after_script:
- |
curl -X POST https://app.gaffer.sh/api/upload \
-H "X-API-Key: $GAFFER_UPLOAD_TOKEN" \
-F "files=@ctrf-report.json" \
-F 'tags={"commitSha":"'"$CI_COMMIT_SHA"'","branch":"'"$CI_COMMIT_REF_NAME"'"}'

After upload, share the URL in Slack, GitHub PR comments, or Jira tickets. Recipients see the full report in their browser.

For people outside your organization, you can generate a public share link with configurable expiration. They view the results without needing a Gaffer account.

Slack and Webhook Notifications

Stop checking CI manually. Get notified when Jest tests finish:

Slack integration:

[FAILED] my-project - main
3 tests failed, 142 passed
View report: https://app.gaffer.sh/reports/abc123
  • Direct link to the full report
  • Filter by branch — only notify on main, skip feature branches

Webhooks:

  • Send results to any endpoint
  • Integrate with your existing alerting or workflow tools
  • Trigger custom actions on failure

No more “did the tests pass?” messages in Slack. See Test Failure Notifications for the full setup guide.

GitHub Integration

Commit statuses show test results directly on PRs. No clicking through to CI logs to find out if tests passed.

Monorepo Support

Running Jest across multiple packages? Upload results from each:

- name: Upload to Gaffer
if: always()
uses: gaffer-sh/gaffer-uploader@v1
with:
gaffer_api_key: ${{ secrets.GAFFER_UPLOAD_TOKEN }}
report_path: |
./packages/api/ctrf-report.json
./packages/web/ctrf-report.json
./packages/shared/ctrf-report.json

All results appear in the same project dashboard.

Get Started

Gaffer’s free tier includes 500 MB of storage with 7-day retention. Paid plans offer extended retention up to 90 days.

Start Free