Eu realmente gosto da resposta do @ RevBingo, porque ele sugere que a luta em direção a 100% pode fazer com que você limpe ou exclua o código não utilizado. O que não vi nas outras respostas é uma sensação de quando você precisa de alta cobertura e quando não. Eu tomei uma facada em começar isso. Acho que adicionar detalhes a um gráfico como esse seria uma busca mais útil do que encontrar um número de cobertura de teste adequado para todo o código.
100%
Para uma API pública, como as coleções java.util, que não é acoplada a um banco de dados e não retorna HTML, acho que 100% de cobertura é uma meta inicial nobre, mesmo se você se contentar com 90-95% devido a tempo ou outro restrições. Aumentar a cobertura do teste após a conclusão do recurso força um nível de análise mais detalhado do que outros tipos de revisão de código. Se a sua API for popular, as pessoas a usarão, subclassificarão, desserializarão etc. de maneiras que você não pode esperar. Você não quer que a primeira experiência deles seja encontrar um bug ou supervisionar o design!
90%
Para o código de infraestrutura de negócios, que absorve estruturas de dados e retorna estruturas de dados, 100% ainda é provavelmente uma boa meta inicial, mas se esse código não for público o suficiente para convidar muito uso indevido, talvez 85% ainda seja aceitável?
75%
Para o código que recebe e retorna Strings, acho que o teste de unidade é muito mais frágil, mas ainda pode ser útil em muitas situações.
50% ou menos
Eu odeio escrever testes para funções que retornam HTML porque é muito quebradiço. E se alguém alterar o CSS, o JavaScript ou todo o blob de HTML e inglês que você retornar não fizer sentido para os usuários finais humanos? Se você puder encontrar uma função que use muita lógica de negócios para produzir um pouco de HTML, vale a pena testar. Mas a situação inversa pode não valer a pena testar.
Perto de 0%
Para alguns códigos, a definição de "correto" é "faz sentido para o usuário final". Existem testes não tradicionais que você pode executar com relação a esse código, como verificação gramatical automatizada ou validação HTML da saída. Eu até configurei declarações grep para pequenas inconsistências às quais geralmente somos vítimas no trabalho, como dizer "Login" quando o resto do sistema chama "Login". Esse homem não é estritamente um teste de unidade, mas uma maneira útil de capturar problemas sem esperar resultados específicos.
Em última análise, porém, apenas um humano pode julgar o que é sensível aos humanos. O teste de unidade não pode ajudá-lo lá. Às vezes, são necessários vários humanos para julgar isso com precisão.
Absoluto 0%
Esta é uma categoria triste e eu me sinto menos uma pessoa por escrevê-la. Porém, em qualquer projeto suficientemente grande, existem tocas de coelho que podem sugar semanas de pessoas por pessoa, sem fornecer nenhum benefício comercial.
Comprei um livro porque alegava mostrar como simular dados automaticamente para testar o Hibernate. Mas ele apenas testou as consultas Hibernate HQL e SQL. Se você precisa fazer muito HQL e SQL, realmente não está obtendo a vantagem do Hibernate. Existe uma forma de banco de dados na memória do Hibernate, mas não investi tempo para descobrir como usá-lo efetivamente nos testes. Se eu tivesse essa execução, gostaria de ter uma cobertura de teste alta (50% -100%) para qualquer lógica comercial que calcule coisas navegando em um gráfico de objeto, fazendo com que o Hibernate execute algumas consultas. Minha capacidade de testar esse código está perto de 0% no momento e isso é um problema. Portanto, aprimoro a cobertura de teste em outras áreas do projeto e tento preferir funções puras sobre aquelas que acessam o banco de dados, principalmente porque é mais fácil escrever testes para essas funções. Ainda,