Heim >Backend-Entwicklung >Golang >## Wie erreicht man eine vollständige Abdeckung bei Funktionstests: Überbrückung der Lücke zwischen Code und Ausführung?
So zeigen Sie die vollständige Abdeckung in Funktionstests an
Problem:
Funktionstests werden kompiliert ausgeführt Binärcode, der Raum für ungedeckte blinde Flecken lässt.
Code-Snippet:
<code class="go">package main import ( "fmt" "math/rand" "os" "time" ) var exitCode int func Test_main(t *testing.T) { go main() exitCode = <-exitCh } func TestMain(m *testing.M) { m.Run() // can exit because cover profile is already written os.Exit(exitCode) } func main() { rand.Seed(time.Now().UTC().UnixNano()) for { i := rand.Int() fmt.Println(i) if i%3 == 0 { os.Exit(0) } if i%2 == 0 { os.Exit(1) } time.Sleep(time.Second) } }</code>
Lösung:
1. Hauptfunktion mit Build-Tags ausschließen:
<code class="go">//+build !test package main func main() { os.Exit(doFunc()); }</code>
Build mit Tags:
go test -c -coverpkg=. -o example -tags test
2. Funktionalität in testbaren Code extrahieren:
Vermeiden Sie das Testen der Hauptfunktion, indem Sie Funktionalität in andere Klassen extrahieren. Verwenden Sie func TestMain, um die Codeausführung im Hauptthread zu steuern.
3. Verwenden Sie Mocking:
Erstellen Sie Mocks für Abhängigkeiten, um bestimmte Codepfade zu isolieren und die Testbarkeit zu verbessern.
4. Timeouts für die Abdeckung:
Fügen Sie dem Test ein Timeout hinzu, um dem Coverage-Tool Zeit zu geben, das Profil zu schreiben, bevor die Anwendung beendet wird.
Beispiel mit Timeouts:
<code class="go">func exit(code int) { exitCh <- code time.Sleep(1 * time.Second) // Allow time for coverage data to be written os.Exit(code) }</code>
Vorteile:
Das obige ist der detaillierte Inhalt von## Wie erreicht man eine vollständige Abdeckung bei Funktionstests: Überbrückung der Lücke zwischen Code und Ausführung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!