Wie teste ich „os.Exit'-Szenarien in Go, ohne die Testsuite zu unterbrechen?

Susan Sarandon
Freigeben: 2024-11-12 17:08:02
Original
628 Leute haben es durchsucht

How to Test `os.Exit` Scenarios in Go Without Disrupting the Test Suite?

Unit-Test-Exit-Szenarien in Go

Die Abdeckung verschiedener Testszenarien ist für eine robuste Softwareentwicklung von entscheidender Bedeutung. In Go stellt das Testen von Funktionen, die os.Exit aufrufen, eine einzigartige Herausforderung dar. Wie können wir Exit-Szenarien testen, ohne die gesamte Testsuite zu beeinträchtigen?

Betrachten Sie die folgende Funktion als zum Scheitern verurteilt:

func doomed() {
  os.Exit(1)
}
Nach dem Login kopieren

Um effektiv zu testen, ob der Aufruf dieser Funktion einen Exit auslöst, werden Sie Folgendes tun Sie müssen eine Strategie anwenden, die den os.Exit-Aufruf innerhalb des Tests einschränkt und verhindert, dass er sich auf andere Tests auswirkt.

OS.Exit testen

Andrew Gerrand, ein Kernmitglied des Go-Teams, bietet in seinem Vortrag einen genialen Ansatz für dieses Problem. Lassen Sie uns diese Lösung implementieren:

main.go (Programm mit zu testender Funktion)

package main

import (
    "fmt"
    "os"
)

func Crasher() {
    fmt.Println("Going down in flames!")
    os.Exit(1)
}
Nach dem Login kopieren

main_test.go (Test auf Crasher-Funktion)

package main

import (
    "os"
    "os/exec"
    "testing"
)

func TestCrasher(t *testing.T) {
    // Check if "BE_CRASHER" environment variable is set.
    if os.Getenv("BE_CRASHER") == "1" {
        Crasher()
        return
    }

    // Invoke the test again with "BE_CRASHER=1" to trigger the Crasher call.
    cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
    cmd.Env = append(os.Environ(), "BE_CRASHER=1")
    err := cmd.Run()

    // Validate exit code.
    if e, ok := err.(*exec.ExitError); ok && !e.Success() {
        return
    }
    t.Fatalf("process ran with err %v, want exit status 1", err)
}
Nach dem Login kopieren

Ausführung:

Diese Lösung funktioniert wie folgt:

  • Go-Test erneut in einem separaten Prozess über exec aufrufen. Befehl, der die Ausführung auf den TestCrasher-Test beschränkt.
  • Übergabe eines Flags über eine Umgebungsvariable (BE_CRASHER=1), um das Verhalten des zweiten Aufrufs zu steuern.
  • Überprüfung des Flags und, falls gesetzt , Crasher aufrufen und sofort beenden.
  • Validierung des Exit-Codes, um sicherzustellen, dass der Test wie erwartet bestanden wurde.

Mit diesem Ansatz können Sie Exit-Szenarien in Go sicher testen, ohne den zu unterbrechen Rest Ihrer Testsuite.

Das obige ist der detaillierte Inhalt vonWie teste ich „os.Exit'-Szenarien in Go, ohne die Testsuite zu unterbrechen?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage