我需要在Docker中使用Postgres数据库进行Go集成测试的建议

vltsax25  于 2023-02-10  发布在  Go
关注(0)|答案(2)|浏览(198)

我对Go语言还是个新手,我有一些数据库函数需要测试,所以首先我有一个database.go文件,它连接到一个postgres数据库:

import (
    "fmt"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "os"
)

var DB *gorm.DB
var err error

func Open() error {
    dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable", os.Getenv("HOST"), os.Getenv("USER"),
        os.Getenv("PASSWORD"), os.Getenv("DB"), os.Getenv("PORT"))
    DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})

    if err != nil {
        return err
    }

    return nil
}

然后我有一个customers.go文件,其中包含与该数据库交互的函数:

import (
    "customers/cmd/database"
    "time"
)

type Customers struct {
    ID           int       
    CustomerName string   
    Active       bool      
    Balance      float32   
    ActiveSince  time.Time
}

func Get(id int) (Customers, error) {
    var customer Customers
    result := database.DB.First(&customer, id)

    if result.Error != nil {
        return Customers{}, result.Error
    } else {
        return customer, nil
    }
}

这都是在docker中运行的,有customers容器和postgres容器。现在的问题是我如何测试我的Get(id int)函数?我在研究dockertest,但它会产生一个不同的数据库,我的Get函数使用我在database.go中指定的数据库。那么有没有一个标准的Go语言方法来测试这些函数?

iugsix8n

iugsix8n1#

这是一个 Docker 网络的问题,但golang:
1.你可以创建一个Docker网络,在一个net.doc中运行两个容器或使用网络--network=host
1.将postgres容器的端口导出到localhost,并将客户容器链接导出到localhost,-pxx:xx

sdnqo3pr

sdnqo3pr2#

在go.pl中有标准的单元测试方法,参考testingtestify/assert。单元测试通常写在代码旁边的xxx_test.go文件中。
对于DB访问层代码的单元测试,一个选项是拥有Testenv助手并在这些行上使用它。
客户_测试.go:

package dbaccess

import "testing"

func TestDbAccessLayer(t *testing.T) {
  testEnv := testUtils.NewTestEnv()
  // testEnv should do the required initialization e.g. 
  // start any mocked services, connection to database, global logger etc.
  if err := testEnv.Start(); err != nil {
    t.Fatal(err)
  }
  // at the end of the test, stop need to reset state
  // e.g. clear any entries created by test in db
  defer testEnv.Stop()

  // add test code
  // add required assertion to validate 
}

有一个单独的docker-compose.yml文件,并将其与docker compose命令一起使用,以启动/停止postgresdb等服务。
go test命令可用于运行测试。有关详细信息,请参阅命令文档。

相关问题