Maison >développement back-end >Golang >## Comment obtenir une couverture complète des tests fonctionnels : combler le fossé entre le code et l'exécution ?
Comment afficher une couverture complète dans les tests fonctionnels
Problème :
Les tests fonctionnels exécutent une compilation code binaire, laissant de la place aux angles morts découverts.
Extrait de code :
<code class="go">package main import ( "fmt" "math/rand" "os" "time" ) var exitCode int func Test_main(t *testing.T) { go main() exitCode = <-exitCh } func TestMain(m *testing.M) { m.Run() // can exit because cover profile is already written os.Exit(exitCode) } 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>
Solution :
1. Exclure la fonction principale à l'aide de balises de construction :
<code class="go">//+build !test package main func main() { os.Exit(doFunc()); }</code>
Construire avec des balises :
go test -c -coverpkg=. -o example -tags test
2. Extraire la fonctionnalité vers du code testable :
Évitez de tester la fonction principale en extrayant la fonctionnalité dans d'autres classes. Utilisez func TestMain pour contrôler l'exécution du code sur le thread principal.
3. Utilisez Mocking :
Créez des simulations pour les dépendances afin d'isoler des chemins de code spécifiques et d'améliorer la testabilité.
4. Délais d'attente pour la couverture :
Ajoutez un délai d'attente au test pour donner à l'outil de couverture le temps d'écrire le profil avant la fermeture de l'application.
Exemple avec les délais d'attente :
<code class="go">func exit(code int) { exitCh <- code time.Sleep(1 * time.Second) // Allow time for coverage data to be written os.Exit(code) }</code>
Avantages :
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!