go / expert
Snippet
Hermetisches Executable-Helfer-Testen via Umgebungsvariablen-Subprozess-Forking
Das Testen von OS-Subprozess-Befehlen ohne Mocking externer System-Binärdateien wird erreicht, indem das kompilierte Test-Binary selbst (`os.Args[0]`) unter Verwendung von Umgebungsvariablen-Guards erneut aufgerufen wird.
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
package mainimport ("os""os/exec""testing")func HelperProcess(t *testing.T) {if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {return}os.Stdout.WriteString("simulated subprocess output")os.Exit(0)}func TestSubprocessExecution(t *testing.T) {cmd := exec.Command(os.Args[0], "-test.run=HelperProcess")cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")out, err := cmd.Output()if err != nil || string(out) != "simulated subprocess output" {t.Fatalf("Subprocess testing failed, output: %s", string(out))}}
Erklärung
1
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
Schützt den Testprozess davor, die Helferlogik während regulärer Testläufe unbeabsichtigt auszuführen.
2
cmd := exec.Command(os.Args[0], "-test.run=HelperProcess")
Erzeugt einen Fork des kompilierten Test-Binärfiles zur isolierten Ausführung einer Sub-Routine im Betriebssystem.
3
cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
Injiziert Umgebungsvariablen zur Aktivierung des Helfer-Modus im erneut aufgerufenen Prozess.