Affichage de la couverture des tests fonctionnels sans angles morts
Problème :
Afin de générer profils de couverture pour les tests fonctionnels écrits dans un langage non-Go qui interagissent avec un binaire Go compilé, le fichier main_test.go inclut une fonction Test_main qui modifie la méthode main() pour envoyer le code de sortie à un canal. Cependant, la condition if flag.Lookup("test.coverprofile") != nil dans la fonction exit() crée un angle mort dans les résultats de couverture, car os.Exit(code) peut ne jamais être exécuté lorsqu'un profil de couverture est demandé .
Solution :
Pour rédiger des profils de couverture sans angles morts, il est recommandé d'exclure le fichier main.go des tests. Cela peut être accompli à l'aide de balises de build en ajoutant la ligne // build !test en haut du fichier main.go. Cela demandera au compilateur Go d'ignorer le fichier lors des versions de test.
Ce qui suit est une version modifiée de l'exemple de code qui intègre cette approche :
<code class="go">// dofunc.go package main import ( "fmt" "math/rand" "time" ) var seed int64 = time.Now().UTC().UnixNano() func doFunc() int { rand.Seed(seed) var code int for { i := rand.Int() fmt.Println(i) if i%3 == 0 { code = 0 break } if i%2 == 0 { fmt.Println("status 1") code = 1 break } time.Sleep(time.Second) } return code } // main.go //+build !test package main import "os" func main() { os.Exit(doFunc()) } // dofunc_test.go package main import ( "testing" "flag" "os" ) var exitCode int func TestMain(m *testing.M) { flag.Parse() code := m.Run() os.Exit(code) } func TestDoFuncErrorCodeZero(t *testing.T) { seed = 2 if code := doFunc(); code != 0 { t.Fail() } } func TestDoFuncErrorCodeOne(t *testing.T) { seed = 3 if code := doFunc(); code != 1 { t.Fail() } }</code>
Utilisation :
En excluant main.go des tests, la fonction exit() ne fait plus partie de l'analyse de couverture, et les profils de couverture refléteront avec précision le comportement du tests fonctionnels.
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!