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
Libérer: 2024-10-25 07:14:29
original
614 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal