go / expert
Snippet
Parallele Isolation und Ausführungssynchronisation in tabellenbasierten Subtests
Bei der parallelen Ausführung von tabellengesteuerten Subtests mit t.Parallel() erfassen die Subtest-Closures Schleifenvariablen als Referenz. Das erneute Binden der Range-Variable im Schleifen-Scope stellt sicher, dass konkurrierende Subtests unterschiedliche Testeingaben auswerten, anstatt auf den Zustand der letzten Iteration zuzugreifen.
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 ("testing")func TestParallelSubtests(t *testing.T) {tests := []struct {name stringvalue int}{{"case_a", 10},{"case_b", 20},}for _, tt := range tests {tt := ttt.Run(tt.name, func(t *testing.T) {t.Parallel()if tt.value <= 0 {t.Errorf("expected positive value, got %d", tt.value)}})}}
Erklärung
1
for _, tt := range tests {
Iteriert durch das Slice von Testfall-Strukturen.
2
tt := tt
Überdeckt die Schleifenvariable in einen lokalen Block-Scope, um Data Races bei der parallelen Subtest-Ausführung zu verhindern.
3
t.Run(tt.name, func(t *testing.T) {
Startet eine benannte Subtest-Closure innerhalb des übergeordneten Testkontexts.
4
t.Parallel()
Markiert den Subtest so, dass er nebenläufig zu anderen parallelen Tests ausgeführt wird.