My point is that it’s only when functions/methods interact with each other, that we see real errors.
This is the direct consequence of not doing unit tests. Those “real” errors are buried in those small functions you believed worked well.
you may unit test the top ~20% most complex methods/functions in your codebase
That shows a lack of understanding of unit testing. In order to unit-test effectively, you are forced to decouple the code into small testable pieces. Not write huge complex methods, and then write huge elaborate unit tests.
Remember that time when you refactored your code? yeah all your unit tests broke.
That’s funny, since “that time” I refactored code (which is daily), I was much more confident I wouldn’t break the functionality by introducing accidental errors.
On the other hand, do you remember that time when you refactored your code, compiled it, and then new bugs and regressions started popping out in run-time? My mistake, you cannot do refactoring at all, since you don’t test anything.