Saya cuba menulis ujian penyepaduan untuk pangkalan data Postgres saya. Untuk melakukan ini, saya menggunakan bekas ujian dalam Go. Saya telah menggunakan migrasi tern dalam pangkalan data sebenar dan meletakkan migrasi dalam folder migrasi. Masalahnya ialah beberapa migrasi saya menggunakan sifat dalam fail .tern.conf kerana nilai mungkin berbeza bergantung pada persekitaran. Saya mencipta fail konfigurasi serupa local.tern.conf untuk setempat dan cuba menetapkan pembolehubah global. Tetapi atas sebab tertentu apabila saya menjalankan migrasi nilai tidak dipilih. Berikut adalah contoh -
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, } }
Ini adalah sebahagian daripada penghijrahan saya -
.... CREATE TABLE {{.version_table}} ( version integer NOT NULL ); alter table {{.version_table}} owner to {{.master_user}}; .....
Ini local.tern.conf-
[database] host = <host> port = 5432 database = <db name> version_table = schema_version_table [data] master_user = <user>
Saya rasa fail konfigurasi perlu menyasarkan port rawak yang disediakan oleh testcontainers-go dan bukannya port 5432 lalai Postgres. Anda mungkin perlu menjana fail ini secara dinamik menggunakan kaedah Host
和 MappedPort
bekas, mendapatkan hos dan port rawak daripada testcontainers-go. Sila rujuk https://golang.testcontainers.org/features/networking/# untuk mendapatkan hos kontena
ip, _ := nginxC.Host(ctx) port, _ := nginxC.MappedPort(ctx, "80") _, _ = http.Get(fmt.Sprintf("http://%s:%s", ip, port.Port()))
Bolehkah anda mencubanya?
Pilihan lain ialah menggunakan "Testcontainers Desktop" yang membenarkan penentuan port untuk perkhidmatan tertentu (postgres) untuk proksi secara telus sebarang permintaan ke port tersebut ke port rawak. Sila rujuk https://www.php.cn/link/9a4d6e8685bd057e4f68930bd7c8ecc0
Atas ialah kandungan terperinci Menggunakan migrasi tern dalam bekas ujian go dengan postgres. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!