Runtime coverage · ReplayOps sessions · 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 and a cross-service call tree, joined to the ReplayOps session it happened in.

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 on this side, not GBs
KBs
per session on this side, not GBs

The parts people remember

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

A click → the code it ran

Every session, down to the line it ran

Sessions come from ReplayOps, whose SDK stamps the session id on every request the page makes. The agents read it, so each click a person made is joined to the services it reached and the methods and lines it executed. The picture of the session stays in ReplayOps, one link away; what lives here is what it touched in your code.

Steps → hops → lines

A test's steps, in words, and its session

Click any test and see the steps the person took (Open, Navigate, Click, Input) as ReplayOps saw them, beside the request hops they caused and the files they covered. Every red block in a file names the nearest scenario that reached it, with its steps and a link to watch the session where it happened.

Who actually ran this line

Real traffic, not only tests

A ReplayOps session needs no test name to count. Every visit the agents saw is listed with the services it reached and the requests it made, and a line of code can say how many real sessions ran it. That is the dead-code question answered from the other end.

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. Every red block names the nearest scenario that reached it, with its steps and the ReplayOps session to watch.

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 ReplayOps session stamps every request the page makes with W3C trace context and its session id. The agents read it, so each step a person took names the services it reached and the methods that actually executed. The recording stays over there; the code it ran is over here.

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 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.That 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

Catalogue cases flow in from Jira, Xray and TestRail; verdicts and the coverage behind each case flow back, so a case says what code it exercised, not only whether it passed.

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

28 integrations, across 8 kinds of tool

25 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 and map it to your stack: coverage per test, a ReplayOps session down to the code it ran, the changed-code gate. 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