Hai ragione, una metrica di copertura della linea non è garanzia di un test completo. La copertura del percorso (assicurando che ogni possibile percorso attraverso il codice venga esercitato almeno una volta) è molto più importante. Tuttavia, la copertura del percorso è molto più difficile da calcolare rispetto alla copertura del codice, e la copertura del codice è comunque utile (mentre una linea coperta non è necessariamente testata in modo completo, una linea che non è coperta in modo definitivo non è affatto testata) .
Devi prestare molta attenzione ai punti del tuo codice in cui il flusso dei rami di esecuzione. Le operazioni ternarie ( var = foo()? bar(): baz()
) dovrebbero essere di particolare interesse perché questi sono i punti che possono apparire completamente coperti anche quando viene seguito solo uno dei due percorsi di esecuzione disponibili.
Va anche detto che quando una parte del codice non è coperta dai test, è spesso perché è una parte difficile del codice da testare per vari motivi (logica estremamente complicata, dipendenze che non possono essere facilmente derise, dipendenti su eventi probabilistici, destinati a generare un output probabilistico, ecc.). Questo è spesso anche il tipo di codice in cui il test è più importante. Se un modulo ha una copertura del 95% del codice nei suoi test, non è ancora molto utile se il 5% scoperto è la parte del codice che è più probabile che porti bug.
Se il codice è ben progettato con i test in mente (coesivo, liberamente accoppiato, utilizza l'iniezione di dipendenza, ecc.) è quindi possibile una copertura del codice molto alta del 90% o superiore. Ma ovviamente, sebbene sia una metrica utile, una cifra di copertura elevata non significa che il tuo codice sia ben testato.