使用Golang + Docker + RDB进行本地主机名的问题在执行单元测试时

在Golang + Docker + RDB的单元测试执行时,本地主机名的问题。

最近,我对Golang变得有趣了。这次我想记录一下关于在Golang的单元测试中使用Golang + Docker + RDB时,需要在运行时更改本地主机名的问题,并介绍一种自动化的方法。

你想做什么?

通过在 Golang 的测试代码中调用 config.ReadConfig(),可以实现配置文件的读取和更改。
当在使用 Docker 等工具时,需要在本地和虚拟环境之间切换连接时,可以使用它。

不同的步骤

我想要修改的文件

db:
  host: host.docker.internal #ここをlocalhostに書き換えたい
  name: title
  password: password
  user: user

过去一直都是手动逐个切换,但是效率太低了,所以希望在运行测试时能够自动进行重写。

首先,config.go

package config

import (
    "io/ioutil"
    "os"

    err "path/to/pkg/error"

    yaml "gopkg.in/yaml.v2"
)

type Config struct {
    DB configDB `yaml:"db"`
}

type configDB struct {
    Host     string `yaml:"host"`
    Name     string `yaml:"name"`
    Password string `yaml:"password"`
    User     string `yaml:"user"`
}

func ReadConfig() (*Config, error) {
    file := os.Getenv("CONFIG")
    if file == "" {
        return nil, err.ErrorEmptyEnvironmentVariableConfig
    }

    buf, err := ioutil.ReadFile(file)
    if err != nil {
        return nil, err
    }

    var config Config
    err = yaml.Unmarshal([]byte(buf), &config)
    if err != nil {
        return nil, err
    }

    return &config, nil
}

由于Golang没有内置的YAML标准库,
因此可以使用外部库等来将Golang的结构体和映射等转换为YAML(Unmarshal),
并且可以将Golang的数据类型转换为YAML(Marshal)。

ライブラリ yaml.v2

ソース: go-yaml/yaml GitHub

在结构体中定义配置项config,并使其可读写。

type configDB struct {
    Host     string `yaml:"host"`
    Name     string `yaml:"name"`
    Password string `yaml:"password"`
    User     string `yaml:"user"`
}

下一步,比如编写setup_test.go文件。

package db_test

import (
        "path/to/pkg/config"
    db "path/to/pkg/db"
    "os"
    "testing"
)

func TestMigration(t *testing.T) {
    os.Setenv("CONFIG", "../../config.yml")
    config, _ := config.ReadConfig()
    config.DB.Host = "localhost" #ここで読みかえます

    db.ConnectDatabase(config)
}

错误包

package error

import (
    "golang.org/x/xerrors"
)

var (
    ErrorEmptyEnvironmentVariableConfig = xerrors.New("Environment variable CONFIG is empty.")
)

通过从测试代码中调用config.ReadConfig()函数,可以实现读取配置的操作。

我认为在使用Docker等工具时,经常会遇到需要在本地和虚拟环境之间切换连接目标的情况,这真的非常方便。

非常感谢!如果有知道更聪明方法的朋友,请务必留下评论!

广告
将在 10 秒后关闭
bannerAds