Mi chiedo se la misurazione della copertura del codice condizionale da parte degli strumenti attuali per Java non sia obsoleta da quando Java 8 è arrivato. Con Java 8 Optional
e Stream
spesso possiamo evitare rami / loop di codice, il che rende facile ottenere una copertura condizionale molto elevata senza testare tutti i possibili percorsi di esecuzione. Confrontiamo il vecchio codice Java con il codice Java 8:
Prima di Java 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
Esistono 3 possibili percorsi di esecuzione nel metodo sopra. Per ottenere il 100% della copertura condizionale è necessario creare 3 test unitari.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
In questo caso, i rami sono nascosti e abbiamo solo 1 test per ottenere una copertura del 100% e non importa in quale caso testeremo. Sebbene ci siano ancora gli stessi 3 rami logici che dovrebbero essere coperti, credo. Penso che al giorno d'oggi renda completamente inaffidabili le statistiche sulla copertura condizionale.
Ha senso misurare la copertura condizionale per il codice Java 8? Esistono altri strumenti per individuare il codice non testato?
getName
? Sembra che se user
è nullo, dovrebbe restituire "sconosciuto". Se user
non è nullo ed user.getName()
è nullo, dovrebbe restituire "sconosciuto". Se user
non è nullo e user.getName()
non è nullo, dovrebbe restituirlo. Quindi testereste questi tre casi perché è questo il contratto getName
. Sembra che tu lo stia facendo all'indietro. Non vuoi vedere le filiali e scrivere i test in base a quelli, vuoi scrivere i test in base al tuo contratto e assicurarti che il contratto sia completato. Questo è quando hai una buona copertura.