go / expert
Snippet
Subprozess-Signalabfangung und Isolationstests über Umgebungs-Flag-Trigger
Das sichere Testen von OS-Signalhandlern oder Prozess-Beendigungslogik erfordert die Ausführung eines separaten Subprozesses, damit os.Exit-Aufrufe nicht den Haupt-Testrunner zum Absturz bringen. Dieses Muster führt die Test-Binärdatei mit einer Umgebungsvariable erneut aus, um die Signalzustellung zu isolieren.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package mainimport ("os""os/exec""os/signal""syscall""testing""time")func TestSignalHandlingProcess(t *testing.T) {if os.Getenv("BE_SUBPROCESS") == "1" {sigChan := make(chan os.Signal, 1)signal.Notify(sigChan, syscall.SIGTERM)select {case sig := <-sigChan:if sig == syscall.SIGTERM {os.Exit(0)}case <-time.After(2 * time.Second):os.Exit(1)}return}cmd := exec.Command(os.Args[0], "-test.run=TestSignalHandlingProcess")cmd.Env = append(os.Environ(), "BE_SUBPROCESS=1")if err := cmd.Start(); err != nil {t.Fatalf("Failed to launch subprocess: %v", err)}time.Sleep(100 * time.Millisecond)_ = cmd.Process.Signal(syscall.SIGTERM)_ = cmd.Wait()}
Erklärung
1
if os.Getenv("BE_SUBPROCESS") == "1" {
Abzweigender Einstiegspunkt, der die laufende Binärdatei in einen dedizierten Subprozess-Worker verwandelt.
2
cmd := exec.Command(os.Args[0], "-test.run=TestSignalHandlingProcess")
Führt die aktuell kompilierte Test-Ausführungsdatei gezielt für die spezifische Testfunktion erneut aus.