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:

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 "[email protected]" \
        -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.

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