go / expert
Snippet
Sichere konkurrierende tabellengesteuerte Untertests durch Closure-Variablen-Rebinding
Bei der Kombination von tabellengesteuerten Tests mit t.Parallel() laufen Untertests gleichzeitig in separaten Goroutinen. Das direkte Erfassen der Schleifeniterationsvariablen innerhalb der Closure führt zu Race Conditions, da Untertests veränderte Schleifenvariablen lesen. Das Re-Binding 'tt := tt' innerhalb des Schleifenbereichs stellt sicher, dass jeder Untertest eine eigene, isolierte Speicherkopie seiner Testfalldaten erhält.
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
package validator_testimport ("testing")func TestValidateInput(t *testing.T) {tests := []struct {name stringinput stringisValid bool}{{"empty string", "", false},{"no domain", "user@", false},}for _, tt := range tests {tt := ttt.Run(tt.name, func(t *testing.T) {t.Parallel()if result := (len(tt.input) > 3); result != tt.isValid {t.Errorf("got %v, want %v", result, tt.isValid)}})}}
Erklärung
1
tt := tt
Bindet die Schleifeniterationsvariable an eine meilensteinbezogene Variable neu, um sie pro Goroutine zu isolieren.
2
t.Run(tt.name, func(t *testing.T) {
Erzeugt eine benannte Untertest-Closure, die sich sicher auf die lokale Kopie von tt bezieht.
3
t.Parallel()
Signalisiert dem Go-Test-Runner, dass dieser Untertest parallel zu anderen parallelen Tests ausgeführt werden kann.