This works best when you have a segregated interface and implementation
Where this works well:
- Compilers often switch implementation languages
- SQL databases let you write every test in SQL and treat the database as a black box
- Browser engines let you write tests in HTML, CSS, and JavaScript, treating rendering and execution as the contract
Where this is harder:
- UI-heavy products, the frontend often is the product, so testing gets slow and flaky
- In ML
- In distributed systems without deterministic simulation testing, many bugs come from timing, ordering, retries, partitions, and partial failures. DST makes this easier. See TigerBeetle
having a thorough test suite deeply deeply deeply decoupled from implementation seems more useful than ever
decoupled to the point where you're testing your backend by executing the frontend