Dans les tests logiciels, la couverture du code mesure le pourcentage de code exécuté pendant les tests. Cependant, il est possible que certains chemins de code ne soient pas couverts, créant ainsi des angles morts dans le rapport de couverture. Un de ces scénarios se produit lors de l'utilisation d'un binaire compilé à partir du code de production pour des tests fonctionnels.
Considérez l'exemple suivant :
<code class="go">package main import ( "fmt" "math/rand" "os" "time" ) func main() { rand.Seed(time.Now().UTC().UnixNano()) for { i := rand.Int() fmt.Println(i) if i%3 == 0 { os.Exit(0) } if i%2 == 0 { os.Exit(1) } time.Sleep(time.Second) } }</code>
Le problème :
La fonction exit() quitte le processus sans permettre l'écriture du profil de couverture. Par conséquent, la ligne contenant os.Exit() n'est pas couverte dans le rapport de couverture, créant un angle mort.
Solutions potentielles :
1. Évitez d'utiliser os.Exit() dans le code de test :
Déplacez la fonctionnalité de sortie dans une fonction distincte et utilisez cette fonction à la fois dans le code de production et dans le code de test. Cela permet de capturer le profil de couverture avant de quitter.
2. Utilisez un time.Sleep() avant de quitter :
Insérez un délai time.Sleep() avant d'appeler os.Exit() pour permettre l'écriture du profil de couverture, mais cela peut ralentir la production code si le binaire est utilisé à la fois pour la production et les tests.
3. Exclure la fonction principale de la couverture :
Étant donné que la fonction principale quitte uniquement le processus, elle peut être exclue de l'analyse de couverture à l'aide de balises de construction. Cela garantit que l'angle mort est éliminé.
Exemple de refactorisation :
<code class="go">package main import ( "fmt" "math/rand" "os" "time" ) //+build !test func main() { os.Exit(exitFunc()) } func exitFunc() int { rand.Seed(time.Now().UTC().UnixNano()) for { i := rand.Int() fmt.Println(i) if i%3 == 0 { return 0 // Exit with code 0 } if i%2 == 0 { fmt.Println("status 1") return 1 // Exit with code 1 } time.Sleep(time.Second) } }</code>
En excluant la fonction principale de la couverture, nous obtenons une couverture à 100 % sans aucun angle mort .
Remarque :
Pour les scénarios complexes, il est recommandé de consulter des développeurs expérimentés afin de déterminer la meilleure approche pour éliminer les angles morts de couverture sans compromettre la fonctionnalité du code ou l'efficacité des tests.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!