Golang+Docker+RDB 유닛 테스트를 실행할 때 로컬 호스트 이름에 대한 문제

Golang+Docker+RDB 유닛 테스트를 실행할 때 로컬 호스트 이름에 대한 문제


최근 골랑이 흥미로워졌다. 이번에는 골랑+Docker+RDB에 골랑의 단원 테스트에 RDB 등에 기록을 삽입하려면 실행할 때의 로컬 호스트 이름을 다시 읽어야 하는 문제에 대해 자동화하는 방법이기 때문에 이 노트를 작성했다.

너 뭐 하고 싶어?


Golang의test 코드에서 호출config.ReadConfig()하면 설정을 다시 읽을 수 있습니다.
Docker 등을 사용할 때 로컬 및 가상 루프 내에서 연결 대상을 전환하는 데 사용합니다.

여러 단계


다시 쓸 파일
config.yml
db:
  host: host.docker.internal #ここをlocalhostに書き換えたい
  name: title
  password: password
  user: user
지금까지 수동으로 하나씩 전환했지만 효율이 너무 떨어져서 테스트를 뛸 때 자동으로 다시 쓰고 싶어요.
먼저config.goconfig.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의 표준 라이브러리가 없습니다.
따라서 외부 라이브러리 등을 사용합니다
골랑의 구조체나 지도 등을 (Unmarshal)로 변환할 수 있고, 골랑의 데이터 형식에서 YAML로 변환할 수 있다.
ライブラリ 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)
}
error 포장
error.go
package error

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

var (
	ErrorEmptyEnvironmentVariableConfig = xerrors.New("Environment variable CONFIG is empty.")
)
이렇게 테스트 코드에서 호출config.ReadConfig()하면 다시 읽을 수 있습니다.
Docker 등을 이용하고 싶을 때 로컬과 가상 환경에서 연결처를 전환하고 싶을 때 자주 발생하는데 정말 편리해요.
고마워요 고마워요
더 똑똑한 방법을 아는 사람이 있다면 꼭 메시지를 남겨주세요!

좋은 웹페이지 즐겨찾기