A few weeks ago I stopped babysitting a pull request and let an agent do it instead. The task was the boring, exhausting kind every team knows. A PR is open, CI runs, something fails, you fix it, you push, you wait ten minutes for CI to come back, and then the next gate fails. Coverage dropped below the threshold. Checkstyle is unhappy. A flaky test failed on retry. The static analysis tool fo...
A few weeks ago I wrote about mutation testing for Java with PIT: why 100% line coverage can still catch nothing, and how deliberately injecting small bugs, mutants, measures whether your tests would actually notice. If you want the full case for why coverage lies, start there. This post is the other half of the stack: the same sensor, applied to Angular with Stryker Mutator. The frontend is w...
Your Angular service reads courseName off every response. Last Tuesday the backend renamed that field to name. Both projects compile. Both test suites are green. Production shows a table full of blanks. Nothing in either codebase was wrong on its own. The Spring controller returns a perfectly valid DTO. The Angular CoursesService maps a perfectly valid TypeScript interface. The bug lives in th...
Your architecture diagram says controllers never touch the repository directly. Your codebase disagrees. It happens quietly. Someone is in a hurry, injects a CourseRepository straight into a controller to skip a service method, and the pull request gets approved because the tests pass and the change is small. The diagram in the wiki still shows a clean three-layer flow. The code no longer matc...
You have 100% line coverage for unit testing. A bug ships anyway. It happens because line coverage measures which lines of code your tests execute, not whether your tests are actually capable of detecting a defect. A test that calls a method but never asserts anything will push your coverage number to 100% while catching precisely nothing. That is not a corner case. It is a systematic blind sp...