I write fairly large backend systems that are continuously growing and facing evolving requirements. I follow those principles, and have yet to write a single test. It's just so much more robust to separate I/O code from other code, and verify that the building blocks of the system work.
I do this in Clojure, but am looking to migrate to Haskell soon to enforce this even further.