Runtime coverage · Session replay · Test impact

Know exactly what your tests really cover

CoverOps attaches lightweight agents to your running services and turns every functional test — automated or manual — into line-level coverage, a replayable session and a cross-service call tree.

One flag per service · first coverage in minutes · no code changes

runtimes — Java, Node, .NET, Python, Go, PHP
6
runtimes — Java, Node, .NET, Python, Go, PHP
runtime overhead
<1%
runtime overhead
of tests attributed to code
100%
of tests attributed to code
per session replay, not GBs
KBs
per session replay, not GBs

The parts people remember

Not a coverage report. A flight recorder for your test runs.

Replays cost KBs, not GBs

Session replay, down to the DOM

Every recorded test — automated or a tester clicking through — plays back pixel-for-pixel from a DOM recording that costs kilobytes, not video files. Console, network with request/response bodies, Web Vitals, DOM changes and backend hops sit on the same clock: click any row and the player seeks to that exact moment.

Debug mode: one step per Space

Re-run any scenario on the live app

One click packs a session's user steps into a link; opening it replays them on the running application — clicks, typing, navigation — while a live step list marks progress. Flip on debug mode and advance step by step with the space bar. The re-run records itself and carries the name of the person who launched it.

Annotated screenshot → Jira

Tester mode that files real bugs

The in-page widget records named sessions, replays catalogue cases, and captures the screen when something is wrong. Draw arrows, boxes and notes over the screenshot — the annotated capture lands in Jira as an attachment on the bug, with the session linked.

Dead code → runnable scenario

Call trees with coverage, per hop

Each session unfolds as a New-Relic-style trace: every service hop with the classes and methods that actually ran, framework plumbing folded away. Click a red block in any source file and CoverOps hands you the recorded scenario that exercises it.

What you actually see

Coverage on the code itself, not in a summary row

Every file opens like this: green ran, red never did, amber took one branch and not the other. Hover a line to see which tests executed it — and every red block offers the nearest recorded scenario that would reach it, one click to replay.

Who ran line 133

  • REG-006::Contract → Commission9×
  • property purchase smoke3×

Per-test attribution, across service hops: the platform knows which lines each Playwright, Cypress or manual session executed.

Changed-code gate, this branch

8.8%of the 61 changed lines are tested

One CLI call, exit 0/1/2, a commit status on the PR. The repository average stays flattering; this number tells the truth about today.

What the agents build

The pictures nobody has to draw

Every one is made from the same traced calls the agents already report. Nothing here is maintained by hand, which is why none of it goes stale the week after it is drawn.

The service map

Drawn from the calls that actually happened, so a service nothing reaches has no edge to hide behind. Colour is coverage: green ran, amber ran partly, red is code your tests never touched.

storefront78%checkout64%search71%pricing55%payments9%catalog83%

Change-based selection

A commit names the lines it changed. The footprint says which tests walked those lines — so a pull request runs the four that can fail, not the four hundred that cannot.

commit a4f19c2 files, 31 linesPricing.cslines 44–61Cart.tsxlines 12–254 tests to runof 412 in the suiteThe other 408 cannot reach a changed line.Running them proves nothing about this commit.

From a click to the code it ran

A recorded session stamps every request the page makes with W3C trace context. The agents read it, so each step of a replay names the services it reached and the methods that actually executed — a tester's bug report arrives with the backend already attached.

the sessionwhat it calledwhat actually ranClick “Place order”step 7 of a replaytraceparent+ session idPOST/checkoutcheckout-api · 217 msGET/pricingpricing-api · 42 msOrderController.placeOrder.cs:44PricingService.totalPricing.cs:61TaxRules.applyTax.cs:1816 requests · 179 methods for one session — each of them a click away from its source.

Code that shipped and never ran

Coverage read backwards. Over a window you choose, in the environment you choose, these are the methods the agents watched and nothing ever reached — the safest thing to delete and the first thing to question.

production · last 90 days1,830 methods ran at least once12 never didLegacyDiscount.applyCouponDiscount.cs:112ExportV1.writeCsvExport.cs:38Only measured methods count. One no agent ever loaded is unknown, not dead —which is the difference between deleting safely and deleting something that runs.

The gate

A number that can block a merge

Total coverage is a vanity metric: it barely moves, whatever you do to it. The question a release actually turns on is narrower — did this change get covered? The gate answers that for the lines the pull request touched, and nothing else.

What the reviewer sees

✓

CoverOps / changed-code coverage

86% — 27 of 31 changed lines · required 80%

✗

CoverOps / changed-code coverage

61% — 19 of 31 changed lines · required 80%

!

CoverOps / changed-code coverage

no run measured these files — reported as missing data, not as a pass

The threshold is yours, per project. Leave it unset and the gate still reports — it simply stops blocking, which is the honest way to roll one out.

One call, no new secret

The pipeline asks with the agent token it already holds. Passing the pull request's own commits makes the answer exact for that branch.

curl -sf -H "authorization: Bearer $COVERAGEOPS_TOKEN" \
  "$API/v1/agent/gate?shas=$PR_COMMITS&min_changed=80" \
  | jq -e .passed

It always answers 200 with a verdict and lets the caller decide — a coverage service that can fail your build by being unreachable is a coverage service that will.

Platform

Coverage that answers questions, not just percentages

Agents for every runtime

Java (bytecode), Node (V8), .NET Core and Framework (IL weaving), Python, Go and PHP agents attach with one flag — no code changes, under 1% overhead. Parallel shards merge into a single run.

Per-test attribution

Every request carries its test's identity across service hops, so the platform knows which lines each Playwright, Cypress, Selenium or manual test actually executed.

Change-based test selection

Connect git, pick a date, and the diff is matched against what every test touched on its last run. Schedule only the impacted cases — minutes instead of hours.

Coverage monitoring

A regression that runs over days, mixing automation and manual testing? Turn monitoring on; every agent joins, resets and accumulates until you stop it.

A service map that is true

Built from recorded traces, not a diagram: which services requests walk through, in what order, and which methods run hottest — as APM-style cards you can zoom and pan.

Multi-project, multi-repo

A product can span many repositories and services — define projects, choose which services and repos each one watches, and share common ones between them.

Fits the tools you have

Playwright, Cypress, Selenium/JUnit 5, Postman, k6, GitHub Actions, Jenkins, GitLab CI, Kubernetes auto-attach — plus a plain REST API for everything else.

Jira, Xray & TestRail, both ways

Import cases into the catalogue, sync run verdicts back, and file tester bugs — with annotated screenshots attached — straight into your Jira project.

How it works

From first agent to change-based testing in an afternoon

  1. 01

    Attach the agents

    One JVM flag, one NODE_OPTIONS entry or one .NET startup hook per service — or a single Kubernetes annotation for the whole cluster.

  2. 02

    Run your tests

    Functional suites, UI automation, load tests, manual click-throughs. Each test names itself in a header; the agents do the rest.

  3. 03

    See what really ran

    Line-level coverage per service, per file and per test — with the gaps your suite never reaches called out explicitly.

  4. 04

    Run less, ship faster

    The next release only needs the tests its diff impacts. The platform picks them, schedules them and reports the verdicts.

Integrations

23 integrations, across 7 kinds of tool

20 are live today — source control, test automation, CI, test management, alerting and the language models. It plugs into the pipeline you already run rather than asking for a new one.

PlaywrightCypressSelenium / JUnit 5Postmank6GitHub ActionsJenkinsGitLab CIKubernetesJira / XrayTestRailZephyr Scale

Request a demo

See it on a system that looks like yours

Thirty minutes, your questions first. We will walk a multi-service demo — coverage per test, session replay, the changed-code gate — and map it to your stack. No slides unless you ask for them.

We use these details only to reply about the demo.

Stop guessing what your regression suite covers

Attach the first agent in minutes. The first run tells you what your tests really reach — and what they never have.

Get started