Gostaria de saber se a medição da cobertura condicional do código pelas ferramentas atuais para Java não é obsoleta desde que o Java 8 surgiu. Com o Java 8 Optional
e Stream
muitas vezes podemos evitar ramificações / loops de código, o que facilita obter uma cobertura condicional muito alta sem testar todos os caminhos de execução possíveis. Vamos comparar o código Java antigo com o código Java 8:
Antes do Java 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
Existem 3 caminhos de execução possíveis no método acima. Para obter 100% de cobertura condicional, precisamos criar 3 testes de unidade.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
Nesse caso, as ramificações estão ocultas e precisamos apenas de 1 teste para obter 100% de cobertura e não importa em que caso iremos testar. Embora ainda existam os mesmos três ramos lógicos que devem ser abordados, acredito. Eu acho que isso torna as estatísticas de cobertura condicional completamente não confiáveis hoje em dia.
Faz sentido medir a cobertura condicional do código Java 8? Existem outras ferramentas para detectar código não testado?
getName
? Parece que, se user
for nulo, deve retornar "desconhecido". Se user
não for nulo e user.getName()
for nulo, deve retornar "desconhecido". Se user
não for nulo e user.getName()
não for nulo, deve retornar isso. Então você testaria esses três casos, porque é disso que getName
trata o contrato . Você parece estar fazendo isso ao contrário. Você não deseja ver as filiais e escrever os testes de acordo com eles, deseja escrever seus testes de acordo com o seu contrato e garantir que o contrato seja cumprido. É quando você tem uma boa cobertura.