Mutation testing finds the test that asserts nothing

Line coverage says a line ran, and mutation testing says a test would have noticed if it were wrong.

$ vendor/bin/infection --threads=4 --min-covered-msi=80

412 mutations generated:
     251 killed
     118 not covered by tests
      43 covered but NOT detected     ← the finding

# 43 lines that a test executes and no assertion checks.
# line coverage for those lines: 100%.

The forty-three are the interesting number and they are usually concentrated: a test that calls a method and asserts only that no exception was thrown, or one asserting on a field the mutated line does not affect. Running it on the whole suite is slow enough to be a nightly job rather than a per-push one, and running it on the diff is what makes it usable in a pull request.