Ich versuche, einen Integrationstest für meine Postgres-Datenbank zu schreiben. Dazu verwende ich einen Testcontainer in Go. Ich habe Tern-Migrationen in der eigentlichen Datenbank verwendet und die Migrationen im Migrationsordner abgelegt. Das Problem besteht darin, dass einige meiner Migrationen Eigenschaften in der Datei .tern.conf verwenden, da die Werte je nach Umgebung variieren können. Ich habe eine ähnliche Konfigurationsdatei local.tern.conf für lokal erstellt und versucht, globale Variablen festzulegen. Aber aus irgendeinem Grund werden die Werte nicht ausgewählt, wenn ich die Migration durchführe. Hier ist ein Beispiel -
func SetupTestDatabase() *TestDatabase { // Set the TERN_CONFIG environment variable to the path of your local.tern.conf file if err := os.Setenv("TERN_CONFIG", "../local.tern.conf"); err != nil { // Handle error if setting the environment variable fails zap.S().Fatal("failed to set TERN_CONFIG", err) } // setup db container ctx, cancel := context.WithTimeout(context.Background(), time.Second*60) defer cancel() container, dbInstance, dbAddr, err := createContainer(ctx) if err != nil { zap.S().Fatal("failed to setup test", err) } conn, _ := dbInstance.Acquire(ctx) m, err := migrate.NewMigrator(ctx, conn.Conn(), "schema_version_table") if err != nil { zap.S().Fatal("failed to setup migrator", err) } if err := m.LoadMigrations("../migrations"); err != nil { zap.S().Fatal("failed to load migrations", err) return nil } if len(m.Migrations) == 0 { zap.S().Fatal("no migrations found") return nil } if err := m.Migrate(ctx); err != nil { zap.S().Fatal("failed to migrate", err) return nil } return &TestDatabase{ container: container, DbInstance: dbInstance, DbAddress: dbAddr, } }
Das ist Teil meiner Migration -
.... CREATE TABLE {{.version_table}} ( version integer NOT NULL ); alter table {{.version_table}} owner to {{.master_user}}; .....
Das ist local.tern.conf-
[database] host = <host> port = 5432 database = <db name> version_table = schema_version_table [data] master_user = <user>
Ich schätze, die Konfigurationsdatei muss auf den von testcontainers-go bereitgestellten zufälligen Port abzielen, anstatt auf den Standardport 5432 von Postgres. Möglicherweise müssen Sie diese Datei dynamisch mit der Host
和 MappedPort
-Methode des Containers generieren und dabei den Host und den zufälligen Port von testcontainers-go abrufen. Bitte beziehen Sie sich auf https://golang.testcontainers.org/features/networking/#, um den Container-Host zu erhalten
ip, _ := nginxC.Host(ctx) port, _ := nginxC.MappedPort(ctx, "80") _, _ = http.Get(fmt.Sprintf("http://%s:%s", ip, port.Port()))
Kannst du es versuchen?
Eine weitere Option ist die Verwendung von „Testcontainers Desktop“, die es ermöglicht, einen Port für einen bestimmten Dienst (Postgres) zu definieren, um alle Anfragen an diesen Port transparent an einen zufälligen Port weiterzuleiten. Bitte beachten Sie https://www.php.cn/link/9a4d6e8685bd057e4f68930bd7c8ecc0
Das obige ist der detaillierte Inhalt vonVerwendung von Tern-Migrationen im Go-Testcontainer mit Postgres. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!