What we automate
Coverage where it actually pays
Automation is sold as a coverage percentage and lived as a maintenance bill. The work that matters is choosing what to automate, keeping the suite fast enough that people run it, and refusing to tolerate tests nobody believes.
Regression suites
Automated coverage over the flows that must not break: the transaction that takes money, the batch that closes the period, the login everything depends on.
Scope is chosen from incident and defect history rather than from a feature list, because the past is the best available guide to where this system breaks.
A suite that catches the failures you have actually had.
Unit and integration testing
Test coverage inside the codebase where feedback is fast: business logic, edge cases, boundary conditions and the interfaces between components.
Pushing coverage down the layers is what makes a suite quick. A pipeline that takes half a working day to report is a pipeline people learn to bypass.
Failures that point at a function, not at a screen.
API and interface testing
Contract tests on the interfaces between services and to third parties, including the error responses and timeouts that only appear in production.
Interfaces are tested for behaviour when the far end is slow, wrong or absent, which is the case teams write last and hit first.
Integration breakage caught before a release, not during.
End to end and browser testing
A deliberately small set of flows through the real interface with Playwright, Cypress or Selenium, kept stable with proper selectors and no timing guesswork.
This layer is capped on purpose. Every flow added here is a maintenance commitment for as long as the interface keeps changing.
A short, trusted set of flows rather than a slow one.
Performance and load testing
Load profiles built from real usage patterns, run against production-shaped data, with the results traced to the component that gave way.
A load test on an empty database measures the wrong system, and a result without a bottleneck named is a number rather than a finding.
A limit you have measured and can point at.
Taking over an untested codebase
Characterisation tests around current behaviour first, then coverage extended outward as the code becomes safe to change.
Existing behaviour is captured before anything is corrected, including behaviour that turns out to be wrong. Those get reported, not silently fixed.
A codebase that can be changed without holding its breath.