Sugiro escrever um conjunto completo de testes em áreas onde é sensato e prático. Em áreas menos práticas, escreva verificações de sanidade.
Na minha experiência, a sobrecarga de um conjunto completo de casos de teste certamente vale a pena na maioria dos casos, mas a cobertura de código realisticamente tem retornos decrescentes. Em algum momento, escrever mais testes apenas para aumentar a cobertura do código simplesmente não faz sentido.
Por exemplo, dependendo do seu idioma / tecnologia, testar a interface do usuário pode não ser prático ou mesmo viável. Muitos testes provavelmente dependerão do que o usuário vê e não pode ser automatizado. Como você testaria se um método para gerar um captcha produz uma imagem legível por um ser humano, por exemplo?
Se um conjunto completo de testes levar três dias para você escrever, a probabilidade de um bug ser introduzido nesse componente no caminho é muito baixa e a função em si leva apenas meia hora para ser escrita, você provavelmente deve pensar muito sobre se esse tempo vale a pena. Talvez apenas escrever uma verificação básica de sanidade para essa função forneça valor?
Meu conselho geral seria que você deveria testar os componentes completamente, onde os testes podem ser escritos com relativa facilidade. No entanto, se for uma área muito difícil de testar, desenhe uma linha na areia e escreva testes que testarão a área em um nível mais alto, em vez de testá-la completamente.
No exemplo captcha anterior, talvez escreva testes que verifiquem se uma imagem do tamanho e formato corretos é retornada e que nenhuma exceção é lançada. Isso oferece um certo nível de garantia sem exagerar.