Quando iniciamos na área da programação, acabamos caindo nessas armadilhas. Eu já caí nela. Achava que tinha que existir 100% de cobertura, e testava só para ver o gráfico indicando que todo o código foi "passado" pelo teste.
Com o tempo e amadurecimento, percebemos que o ideal é entender os casos de uso, e testar esses casos. Por isso faz sentido o que você falou sobre especificação de requisitos.
Agora, não devemos deixar de lado a parte unitária da coisa, pois elas garantem sim qualidade e tendem a executar mais rápido que os testes E2E.
Tenho percebido que o ideal é uma mistura de DDD com testes de vários níveis, conforme pirâmide de testes que já foi citada.