Heim > Backend-Entwicklung > Golang > Wie kann ich mit „os.Exit()' eine genaue Testabdeckung für Go-Code erreichen?

Wie kann ich mit „os.Exit()' eine genaue Testabdeckung für Go-Code erreichen?

DDD
Freigeben: 2024-12-23 14:39:22
Original
312 Leute haben es durchsucht

How Can I Achieve Accurate Test Coverage for Go Code Using `os.Exit()`?

Testen von os.Exit-Szenarien in Go mit Coverage-Informationen (coveralls.io/Goveralls)

Diese Frage bezieht sich auf Testszenarien mit Betriebssystemen. Exit() in Go, insbesondere wie man Abdeckungsinformationen für diese Szenarien erfasst. Der bereitgestellte Beispielcode demonstriert eine Re-Exec-Methode, weist jedoch Einschränkungen hinsichtlich der Coverage-Tools und Fragilität auf.

Coverage-Herausforderungen

Eine Schwierigkeit besteht darin, dass Coverage-Frameworks wie z coveralls.io zeichnet möglicherweise nicht die Abdeckung von Tests auf, die os.Exit() hervorrufen. Dies liegt daran, dass die Coverage-Instrumentierung nicht angewendet wird, wenn die Testbinärdatei erneut ausgeführt wird.

Geänderte Methode zur erneuten Ausführung

Um dieses Problem zu beheben, wurde eine modifizierte exec-Methode kann verwendet werden. Der ursprüngliche Code wird umgestaltet, um os.Exit als Variable mit dem Namen osExit zu extrahieren. Der Testcode ersetzt dann osExit durch eine Scheinfunktion, die den Exit-Code aufzeichnet. Dadurch können Abdeckungsinformationen für osExit-Aufrufe erfasst werden.

Abdeckung externer Anrufe

Die gleiche Technik kann angewendet werden, um Aufrufe von Funktionen wie log.Fatalf() abzudecken. , die indirekt os.Exit aufrufen. Die logFatalf-Funktion wird durch eine Scheinfunktion ersetzt, die das Nachrichtenformat und die an sie übergebenen Argumente aufzeichnet. Dies gewährleistet die Abdeckung von Szenarien, in denen os.Exit von externen Funktionen aufgerufen wird.

Beispiel

Der geänderte Code und Test lauten wie folgt:

// bar.go
package foo

import (
    "fmt"
    "os"
)

var osExit = os.Exit

func Crasher() {
    fmt.Println("Going down in flames!")
    osExit(1)
}
Nach dem Login kopieren
// bar_test.go
package foo

import (
    "reflect"
    "testing"
)

var logFatalf = log.Fatalf

func TestCrasher(t *testing.T) {
    // Save original functions and restore at the end
    oldOsExit := osExit
    oldLogFatalf := logFatalf
    defer func() {
        osExit = oldOsExit
        logFatalf = oldLogFatalf
    }()

    // Mock osExit
    var got int
    myExit := func(code int) {
        got = code
    }
    osExit = myExit

    // Mock logFatalf
    var gotFormat string
    var gotV []interface{}
    myFatalf := func(format string, v ...interface{}) {
        gotFormat, gotV = format, v
    }
    logFatalf = myFatalf

    // Run test
    Crasher()

    // Check results
    exp := 1
    if got != exp {
        t.Errorf("Expected exit code: %d, got: %d", exp, got)
    }

    expFormat, expV := "Exiting with code: %d", []interface{}{1}
    if gotFormat != expFormat || !reflect.DeepEqual(gotV, expV) {
        t.Error("Something went wrong")
    }
}
Nach dem Login kopieren

Durch die Isolierung der Exit-bezogenen Funktionalität und die Verwendung von Scheinfunktionen können sowohl os.Exit als auch externe Funktionsaufrufe, die os.Exit auslösen, abgedeckt werden in Go-Tests. Dieser Ansatz gewährleistet eine genaue Abdeckungsberichterstattung für Szenarien mit Prozessbeendigung.

Das obige ist der detaillierte Inhalt vonWie kann ich mit „os.Exit()' eine genaue Testabdeckung für Go-Code erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage