Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man umfassende Abdeckungsprofile ohne blinde Flecken für Funktionstests, die mit einer kompilierten Go-Binärdatei interagieren?

Wie erreicht man umfassende Abdeckungsprofile ohne blinde Flecken für Funktionstests, die mit einer kompilierten Go-Binärdatei interagieren?

Susan Sarandon
Susan SarandonOriginal
2024-10-25 07:14:29525Durchsuche

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

Abdeckung von Funktionstests ohne blinde Flecken anzeigen

Problem:

Um zu generieren Abdeckungsprofile für Funktionstests, die in einer Nicht-Go-Sprache geschrieben sind und mit einer kompilierten Go-Binärdatei interagieren, enthält die Datei main_test.go eine Test_main-Funktion, die die main()-Methode ändert, um den Exit-Code an einen Kanal zu senden. Allerdings erzeugt die Bedingung if flag.Lookup("test.coverprofile") != nil in der Funktion exit() einen blinden Fleck in den Coverage-Ergebnissen, da os.Exit(code) möglicherweise nie ausgeführt wird, wenn ein Coverage-Profil angefordert wird .

Lösung:

Um Abdeckungsprofile ohne blinde Flecken zu schreiben, wird empfohlen, die Datei main.go vom Test auszuschließen. Dies kann mithilfe von Build-Tags erreicht werden, indem die Zeile // build !test oben in der Datei main.go hinzugefügt wird. Dadurch wird der Go-Compiler angewiesen, die Datei während der Testbuilds zu ignorieren.

Das Folgende ist eine modifizierte Version des Beispielcodes, der diesen Ansatz beinhaltet:

<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>

Verwendung:

  1. Erstellen Sie die Coverage-Binärdatei mit Tags: go test -c -coverpkg=. -o myProgram -tags test
  2. Führen Sie die Coverage-Binärdatei aus: ./myProgram -test.coverprofile=/tmp/profile
  3. Generieren Sie den Coverage-HTML-Bericht: go tool cover -html /tmp/profile -o /tmp/profile.html

Durch den Ausschluss von main.go vom Test ist die Funktion „exit()“ nicht mehr Teil der Abdeckungsanalyse und die Abdeckungsprofile spiegeln das Verhalten von genau wider Funktionstests.

Das obige ist der detaillierte Inhalt vonWie erreicht man umfassende Abdeckungsprofile ohne blinde Flecken für Funktionstests, die mit einer kompilierten Go-Binärdatei interagieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn