Coverage without @covers reports code you never tested

Coverage records every line executed during a test, not every line the test was checking. A unit test for an invoice calculator that happens to construct three collaborators marks all of their code covered, and the number climbs without a single assertion behind it.

/**
 * @covers AppBillingInvoice::total
 */
public function testTotalIncludesVat() { /* ... */ }

With @covers, only the named unit is credited and everything incidental is excluded — the figure drops, and what is left means something. Turning on forceCoversAnnotation in phpunit.xml makes an unannotated test count for nothing at all, which is a blunt way to force the habit. Coverage is still only a map of what was executed; it says nothing about whether the assertions were worth making.