使用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等工具时,经常会遇到需要在本地和虚拟环境之间切换连接目标的情况,这真的非常方便。
非常感谢!如果有知道更聪明方法的朋友,请务必留下评论!