One reporter. Every framework you already run.
npm i -D @testrelic/playwright-analyticsEvery 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.
playwright.config.ts · reporter: [['@testrelic/playwright-analytics']]
platform.testrelic.ai
No separate upload step, no CI plugin — the reporter does it when the run ends.


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 guidereporter: [
['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$ npx playwright test
214 passed · 12s
✓ run #4820 → memory layer · 6.1 MB
upload step · none — the reporter does it
CI plugin · not required
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 frameworksJavaScript
@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.
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>.
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.
$ 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.
# 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-analyticsimport { defineConfig } from '@playwright/test'
export default defineConfig({
+ reporter: [['@testrelic/playwright-analytics']],
})
// specs import the fixture:
import { test } from '…/fixture'
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$ pip install testrelic-playwright
Successfully installed testrelic-playwright
$ export TESTRELIC_API_KEY=tr_live_••••
$ pytest
214 passed · plugin: testrelic
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▌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.