Skip to content

One reporter. Every framework you already run.

npm i -D @testrelic/playwright-analytics

Every test run becomes shared context for Cursor, Claude Code, Copilot, and Codex — over MCP. So your whole team ships at senior-IC speed, not just the engineer who's been here longest.

Why one SDK family

Same conventions, every language and framework

Drop-in, not a rewrite

Add a reporter or a fixture import and keep your existing test files. No new test-writing API, and zero new production dependencies — the SDKs run on built-ins and the frameworks you already have.

Installation guide
playwright.config.ts

reporter: [

['list'],

+ ['@testrelic/playwright-analytics', {

+ includeNetworkStats: true,

+ includeCodeSnippets: true,

+ }],

],

+6 −0 · no test files touched

0 new production dependencies · built-ins only

A run becomes memory automatically

The moment a run finishes locally, its report is memory — read by Ask AI, the Studio and the CLI. No separate upload step, no CI plugin to babysit.

How memory works
shop-e2e — zsh

$ npx playwright test

214 passed · 12s

✓ run #4820 → memory layer · 6.1 MB

upload step · none — the reporter does it

CI plugin · not required

Ask AIStudioCLIMCP

readable by every surface, seconds after the run

One family, every framework

Playwright, Appium and Maestro on the JS side; pytest plugins for Playwright, Appium and DeepEval on the Python side — the same conventions across all of them.

Browse frameworks
node_modules · site-packages

JavaScript

@testrelic/playwright-analytics

@testrelic/appium-analytics

@testrelic/maestro-analytics

Python

testrelic-pytest

testrelic-playwright

testrelic-appium

testrelic-deepeval

Every framework, its own report

How each surface captures a run

Playwright, Appium and Maestro each open their own interactive HTML report the moment a run ends — same box-summary-then-drill-in shape, whichever framework failed, so investigating a red CI run looks the same no matter what broke. The base pytest plugin streams straight to TestRelic Cloud instead of writing a local file.

Playwright

Browser and API tests, JS or Python.

Captures

  • Navigation timeline
  • API calls + network stats
  • Action steps with code snippets
  • Screenshots and video
  • Console logs, secrets auto-redacted

Python: pip install pytest-playwright testrelic-playwright — same captures, auto-registers.

HTML report — Own interactive HTML report — npx testrelic serve <dir>, opens automatically outside CI.

playwright.config.ts

reporter: [

['list'],

+ ['@testrelic/playwright-analytics', {

+ includeNetworkStats: true,

+ includeCodeSnippets: true,

+ }],

],

$ npx playwright test

Appium (WDIO)

Mobile UI tests, JS or Python.

Captures

  • WebDriver command timeline
  • Device logs (logcat / syslog)
  • Network via CDP or proxy
  • Console logs
  • Screenshots on failure

Python: pip install testrelic-appium — auto-wraps any Appium WebDriver fixture, no conftest edits.

HTML report — Own interactive HTML report — npx testrelic-appium serve <dir>.

wdio.conf.ts

import { TestRelicService } from '@testrelic/appium-analytics/service'

import { TestRelicReporter } from '@testrelic/appium-analytics'

+ services: [[TestRelicService, { screenshotOnEvery: 'failure' }]],

+ reporters: ['spec', [TestRelicReporter, { openReport: true }]],

$ appium

$ npx wdio run wdio.conf.ts

Maestro

Mobile flows — a CLI wrapper, no YAML changes.

Captures

  • Step-level timeline
  • Screenshots and video
  • AI-detected UI defects
  • Maestro debug logs
  • Network, with --capture-network (mitmproxy)

HTML report — Own interactive HTML report, written to ./test-results/testrelic-maestro.html and auto-opened.

flows/

$ npx testrelic-maestro test ./flows

# optional network capture (needs mitmproxy on PATH):

$ npx testrelic-maestro test ./flows --capture-network

Python package · none — JS/CLI only

pytest

The base plugin — for suites with no Playwright or Appium underneath.

Captures

  • Pass/fail/skip + assertions
  • Warnings
  • REST, GraphQL, gRPC, Kafka, MCP, WebSocket fixtures
  • Allure / JUnit-XML enrichment, if present
  • pytest-xdist aware

HTML report — No local HTML file — streams straight to TestRelic Cloud. Pair it with testrelic-playwright or testrelic-appium for a local report too.

pytest.ini — Python

# nothing to import — auto-registers via the pytest11 entry point

$ export TESTRELIC_API_KEY=tr_live_••••

$ pytest

testrelic: uploaded 214 test result(s) to TestRelic cloud

Pick your framework

Install, and hand the prompt to your agent

Two commands and a config line. Or skip both and let an agent do it.

JavaScript

Install the reporter, add one line to your Playwright config, and import the fixture in your specs.

npm i -D @testrelic/playwright-analytics
playwright.config.ts — JavaScript

import { defineConfig } from '@playwright/test'

export default defineConfig({

+ reporter: [['@testrelic/playwright-analytics']],

})

// specs import the fixture:

import { test } from '…/fixture'

PlaywrightAppium (WDIO)Maestro

TESTRELIC_API_KEY · tr_live_••••

Python

A pytest plugin. Install it, export your key, and run pytest exactly as you did before.

pip install testrelic-playwright
pytest — Python

$ pip install testrelic-playwright

Successfully installed testrelic-playwright

$ export TESTRELIC_API_KEY=tr_live_••••

$ pytest

214 passed · plugin: testrelic

pytestPlaywrightAppiumDeepEval

Python · 3.10+

Hand it to your agent

Every framework ships an AI setup prompt. Give it to Cursor, Claude Code or Copilot and it wires the SDK into your project for you.

Read the setup docs
Cursor — shop-e2e

set up TestRelic analytics in this repo

✻ Agent

edit(playwright.config.ts)

reporter added · +6 −0

edit(.env)

TESTRELIC_API_KEY written

✓ wired in 2 edits — run npx playwright test

Your next run is memory, not just a pass/fail line.

Every SDK is included in every plan, starting with the free local SDK.