J'essaie d'écrire un test d'intégration pour ma base de données Postgres. Pour ce faire, j'utilise un conteneur de test dans Go. J'ai utilisé les migrations tern dans la base de données réelle et placé les migrations dans le dossier migrations. Le problème est que certaines de mes migrations utilisent des propriétés du fichier .tern.conf car les valeurs peuvent varier selon l'environnement. J'ai créé un fichier de configuration similaire local.tern.conf pour les variables locales et essayé de définir des variables globales. Mais pour une raison quelconque, lorsque j'exécute la migration, les valeurs ne sont pas sélectionnées. Voici un exemple -
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, } }
Cela fait partie de ma migration -
.... CREATE TABLE {{.version_table}} ( version integer NOT NULL ); alter table {{.version_table}} owner to {{.master_user}}; .....
C'est local.tern.conf-
[database] host = <host> port = 5432 database = <db name> version_table = schema_version_table [data] master_user = <user>
Je suppose que le fichier de configuration doit cibler le port aléatoire fourni par testcontainers-go au lieu du port 5432 par défaut de Postgres. Vous devrez peut-être générer ce fichier dynamiquement en utilisant la méthode Host
和 MappedPort
du conteneur, en obtenant l'hôte et le port aléatoire de testcontainers-go. Veuillez vous référer à https://golang.testcontainers.org/features/networking/# pour obtenir l'hôte du conteneur
ip, _ := nginxC.Host(ctx) port, _ := nginxC.MappedPort(ctx, "80") _, _ = http.Get(fmt.Sprintf("http://%s:%s", ip, port.Port()))
Peux-tu l'essayer ?
Une autre option consiste à utiliser "Testcontainers Desktop" qui permet de définir un port pour un service donné (postgres) afin de transmettre de manière transparente toute demande adressée à ce port à un port aléatoire. Veuillez vous référer à https://www.php.cn/link/9a4d6e8685bd057e4f68930bd7c8ecc0
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!