GOOGLE ADS

Freitag, 22. April 2022

Wie führe ich das Datenbank-Setup nur einmal aus mehreren Go-Paketen aus?

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 testjedes Paket als völlig separate Instanz ausgeführt wird, sodass es, obwohl ich es sync.Oncein meinem Testsetup-Paket verwende, Setupimmer 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.goführen Sie in, Ihre Tests aus und importieren den Code in package1undpackage2

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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...