•
Drizz raises $2.7M in seed funding •
•
Featured on Forbes
•
Drizz raises $2.7M in seed funding •
•
Featured on Forbes

Three things to know before reading:
Code coverage vs test coverage is one of most commonly confused distinctions in software testing. Both involve word "coverage," both produce percentages, and both appear in QA dashboards. But they measure different things, they're owned by different roles, and they answer different questions about software quality.
Code coverage is a developer metric. Test coverage is a QA metric. Understanding when to use each, and where each one lies to you, is what separates teams that ship confidently from teams that ship with false confidence.
Code coverage tracks what percentage of your source code gets executed when your test suite runs. It's a white-box metric, meaning it looks at internal structure of code, not at what user sees.
There are several types, and they don't all catch same things:
Common code coverage tools include JaCoCo (Java), Istanbul/nyc (JavaScript), Coverage.py (Python), and SonarQube for aggregated reporting across languages.
The Google Testing Blog published internal guidelines: 60% is acceptable, 75% is commendable, 90% is exemplary. Their research also found that statement coverage predicts fault detection better than branch or path coverage in practice.
Test coverage tracks what percentage of your software's requirements, features, and user scenarios have at least one test mapped to them. It's a black-box metric. It doesn't care about code structure. It cares about whether things user does are being tested.
Test coverage typically includes:
Test coverage is usually tracked through a requirements traceability matrix (RTM) or a test management tool that links test cases to requirements. It's harder to automate than code coverage because there's no tool that automatically knows whether a test case adequately covers a business requirement.
For teams running end-to-end testing tools across web and mobile, test coverage is metric that tells you whether your automation suite actually covers flows your users depend on.
A codebase can have 90% line coverage and still ship bugs in its most important flow. Here's how.
Imagine a checkout function that calculates a discount, applies tax, and charges a payment. A unit test calls function with valid inputs and checks that it returns without error. That test executes every line of function. Line coverage: 100%.
But test doesn't verify that discount was applied correctly. It doesn't check tax calculation. It doesn't validate that payment amount matches cart total. The code ran, but behavior wasn't verified.
This is blind spot of code coverage. It measures execution, not validation. A test that calls a function and asserts nothing still counts as covering those lines.
Test coverage catches this gap because it asks a different question: "Do we have a test that validates discount logic? Do we have a test for tax calculation? Do we have a test for payment amount accuracy?" If those requirements exist and have mapped test cases with proper assertions, behavior is covered, regardless of what line coverage number says.
Codecov's analysis of open-source repositories found that most projects center around 80% code coverage, and values tend to slide downward when they exceed that. The maintenance cost of reaching and holding 90%+ is real: last 10-20% of coverage requires complex, brittle tests that exercise uncommon paths and provide minimal bug-finding value.
For code coverage, practical targets are well-established:
For test coverage, targets depend on risk:
The more useful practice is to treat code coverage as a floor, not a goal. If it drops below 70%, that's a signal. If it's at 78%, don't spend engineering weeks pushing it to 85%. Instead, check your test coverage: are critical flows covered with proper assertions?
Code coverage tools work well for backend code and frontend JavaScript. They work less well for mobile apps, where codebase is split across:
You can instrument a Kotlin codebase with JaCoCo and get 80% code coverage. But that number tells you nothing about whether app works correctly on a Pixel 8 running Android 15 versus a Samsung Galaxy S23 on Android 14. It doesn't tell you if a permission dialog interrupts checkout flow. It doesn't tell you if app handles a network drop during payment.
For mobile teams, test coverage of real-device behavior matters more than code coverage of compiled source. That's where tools built for mobile testing fill gap that code coverage tools can't.
Drizz operates entirely on test coverage side. It doesn't instrument source code. It tests what user actually sees and does on a real device.
A Drizz test for a checkout flow:
Tap on "Add to Cart"
Scroll down until "Proceed to Pay"
Type "4111111111111111" in "Card Number"
Tap on "Pay Now"
Validate "Payment Confirmed" is visible
Validate total matches cart amount
Each line validates a behavior, not just that code executed. The "Validate" commands check that expected outcome is visible on screen. If discount wasn't applied, total won't match. If payment failed, confirmation won't appear. This is test coverage: every requirement in flow has a mapped assertion.
Because Drizz uses Vision AI instead of selectors, these tests run on any Android or iOS device without modification. That covers device-specific dimension of test coverage that code coverage tools miss entirely.
For teams tracking mobile test maintenance, Drizz's approach also reduces maintenance cost that normally comes with expanding test coverage. No selectors means no breakage when UI changes. No explicit waits means no flaky timing issues. Expanding coverage doesn't expand maintenance burden at same rate.
Code coverage measures source code executed during tests. Test coverage measures how many requirements and user flows have mapped tests.
Rarely. The last 10-20% requires complex tests with high maintenance cost and minimal bug-finding value. Most teams target 70-80%.
Test coverage. It measures whether product's requirements are tested, which is what QA is accountable for.
Yes. Code coverage tracks execution, not validation. A test that runs code without checking output still counts as covered.
JaCoCo (Java), Istanbul/nyc (JavaScript), Coverage.py (Python), and SonarQube for cross language reporting.
Partially. It covers compiled source code but misses device-specific behavior, OS interactions, and real-screen validation.