Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
| Помогли мы вам |
Взглянем, какие можно написать тесты (код полностью доступен в конце статьи).
Вынесем сборку образов в отдельную функцию, чтобы не повторяться:
func BuildWithTarget(t *testing.T, dCtx string, tag string, target string) { buildOptions := &docker.BuildOptions{Tags:[]string{tag},// Target для сборки multi-stageTarget: 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{})}
|
|
|