Категория > Новости > Контейнерно-модульное тестирование. Пишем юнит-тесты для образов Docker - «Новости»

Контейнерно-модульное тестирование. Пишем юнит-тесты для образов Docker - «Новости»


12-05-2021, 00:01. Автор: MacAdam

Взгля­нем, какие мож­но написать тес­ты (код пол­ностью дос­тупен в кон­це статьи).


Вы­несем сбор­ку обра­зов в отдель­ную фун­кцию, что­бы не пов­торять­ся:


func BuildWithTarget(t *testing.T, dCtx string, tag string, target string) {
buildOptions := &docker.BuildOptions{
Tags:[]string{tag},
// Target для сборки multi-stage
Target: target,
}
docker.Build(t, dCtx, buildOptions)
}

Пер­вым тес­том про­верим, как и в пре­дыду­щем при­мере, наличие бинар­ника curl:


func TestBasisLayer(t *testing.T) {
tag := fmt.Sprintf("go_demo:%s", BasisTarget)
// Собирается образ с нужным таргетом
BuildWithTarget(t, "../", tag, BasisTarget)
// И далее схожим образом проверяем наличие файла curl
opts := &docker.RunOptions{
Command: []string{"sh", "-c", "[ -f /usr/bin/curl ] && echo exists"},
Remove: true,
}
chkExisting := docker.Run(t, tag, opts)
assert.Equal(t, "exists", chkExisting)
}

Вто­рым — дос­тупен ли HTTP-сер­вер. Здесь уже слож­нее:


func TestProductionLayerServerAvailability(t *testing.T) {
tag := fmt.Sprintf("go_demo:%s", ProdTarget)
BuildWithTarget(t, "../", tag, ProdTarget)
// Обязательно выставляем параметр Detach, в противном случае
// процесс зависнет на выводе запущенного контейнера.
// Параметр -P позволит пробросить порт на случайный свободный
// порт на хосте, тем самым позволяя избежать ошибки с выбором занятого порта
opts := &docker.RunOptions{
Remove:true,
Detach:true,
OtherOptions: []string{"-P"},
}
// Далее запускаем контейнер и получаем его ID
cntId := docker.RunAndGetID(t, tag, opts)
// Через интерфейс функции Inspect получаем проброшенный порт
cntInsp := docker.Inspect(t, cntId)
hostPort := cntInsp.GetExposedHostPort(uint16(8000))
url := fmt.Sprintf("http://localhost:%d/hello", int(hostPort))
// Используя http_helper из библиотеки terratest, можно сделать
// запрос к выбранному URL и проверить результаты запроса
status, _ := http_helper.HttpGet(t, url, &tls.Config{})
assert.Equal(t, 200, status)
// В последнюю очередь удаляем использованный контейнер
docker.Stop(t, []string{cntId}, &docker.StopOptions{})
}


Перейти обратно к новости