Maison >développement back-end >Golang >Comment obtenir des profils de couverture complets sans angles morts pour les tests fonctionnels interagissant avec un binaire Go compilé ?

Comment obtenir des profils de couverture complets sans angles morts pour les tests fonctionnels interagissant avec un binaire Go compilé ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-25 07:14:29616parcourir

How to achieve comprehensive coverage profiles without blind spots for functional tests interacting with a compiled Go binary?

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 :

  1. Construisez le binaire de couverture avec des balises : go test -c -coverpkg=. -o myProgram -tags test
  2. Exécuter le binaire de couverture : ./myProgram -test.coverprofile=/tmp/profile
  3. Générer le rapport HTML de couverture : go tool cover -html /tmp/profile -o /tmp/profile.html

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn