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