Ich versuche, einige Objekte in meiner Datenbank zu erstellen, damit meine Tests einige Daten haben können, mit denen sie arbeiten können. Ich habe meine Setup-Logik in ein Paket gepackt testsetup
. Ich habe jedoch festgestellt, dass go test
jedes Paket als völlig separate Instanz ausgeführt wird, sodass es, obwohl ich es sync.Once
in meinem Testsetup-Paket verwende, Setup
immer noch mehrmals ausgeführt wird, da die Tests jedes Pakets als separate Go-Instanz ausgeführt werden. Ich möchte meine Tests unbedingt weiterhin parallel ausführen, da dies viel schneller ist, daher denke ich derzeit nicht darüber nach, die Parallelisierung zu deaktivieren. Gibt es eine saubere Möglichkeit, dies zu tun?
An diesem Punkt fange ich sogar an, schmutzige Hacks in Betracht zu ziehen, wie die Verwendung eines Shell-Skripts zur Implementierung der Synchronisierung auf Betriebssystemebene.
Hier ist meine Paketstruktur:
testsetup
testsetup.go
package1
package1.go
package1_test.go
package2
package2.go
package2_test.go
Und hier ist eine vereinfachte Version meiner Testsetup-Funktion:
var onceSetup sync.Once
var data model.MockData
func Setup() model.MockData {
onceSetup.Do(createData)
return data
}
func createData() {
// Do some SQL calls to create the objects. We only want to do this once.
data = model.Data{
Object1:...,
Object2:...,
}
}
Lösung des Problems
Gibt es in Ihrem Testaufbau eine Art Blockiermechanismus? Ich würde denken, dass jedes Paket seine Tests immer noch parallel ausführen und parallel ausführen würde, was sie von testsetup benötigen. Sonst könntest du es so machen:
testsetup
testsetup.go
packages_test.go
package1
package1.go
package2
package2.go
Und dann testpackage/packages_test.go
führen Sie in, Ihre Tests aus und importieren den Code in package1
undpackage2
Es könnte etwa so aussehen:
package testpackage
import (
p1 "project/root/package1"
p2 "project/root/package2"
)
func TestPackages(t *testing.T, s0 store.CampaignStore, storeType string) {
setup:= Setup()
t.Parallel()
t.Run("Package1Test", func(t *testing.T) { package1Test(t, setup) })
t.Run("Package2Test", func(t *testing.T) { package2Test(t, setup) })
}
func package1Test(t *testing.T, d model.MockData) {
err:= p1.RunYourFunc(d.data)
require.NoError(t, err)
}
func package2Test(t *testing.T, d model.MockData) {
err:= p2.OtherFunc(d.data)
require.NoError(t, err)
}
Keine Kommentare:
Kommentar veröffentlichen