Зачем автотестам Docker
Сергей Пирогов
Сергей Пирогов
Senior QA Automation
Testing Center of Excellence
Ciklum
http://automation-remarks.com
@s_pirogov
Зоопарк технологий
Ужос ...
Запакуем все в контейнер
Build once... run anywhere with Docker
Принцип контейнеризации
Контейнер vs VM
Контейнер vs VM
Управляем контейнерами
docker run - запустить
docker stop - остановить
docker rm - удалить
PostgreSQL в контейнере
docker run
--name some-postgres
-p 5432:5432
-e POSTGRES_PASSWORD=secret
-d postgres
Тесты + контейнеры
docker run container
test
docker stop container
Как стартовать?
Руками - не автоматизация
.bat / .sh - не серьезно
Стартовать прямо из кода
Java Testcontainers
Работает через JUnit rule
Умеет запускать любые контейнеры
PostgreSQL в контейнере
public class SimpleDbTest {
@ClassRule
public static PostgreSQLContainer postgres =
new PostgreSQLContainer();
@Test
public void testSimple() throws SQLException {
ResultSet resultSet = performQuery(postgres, "SELECT 1");
int resultSetInt = resultSet.getInt(1);
assertEquals(1, resultSetInt);
}
}
Чем это лучше in-memory БД?
100% повторяет боевую базу
Не нужно чистить после тестов
База данных всегда в одном состоянии
Docker + Selenide
public class BaseTest {
@ClassRule
public static BrowserWebDriverContainer chrome =
new BrowserWebDriverContainer()
.withDesiredCapabilities(chrome())
@BeforeClass
public static void setUp() {
setWebDriver(chrome.getWebDriver());
}
}
docker run -d -p 4444:4444 --name selenium-hub \
selenium/hub:3.0.0-dubnium
docker run -d --link selenium-hub:hub \
selenium/node-chrome:3.0.0-dubnium
docker run -d --link selenium-hub:hub \
selenium/node-firefox:3.0.0-dubnium
Стартуем Grid
Docker compose for Grid
hub:
image: selenium/hub
ports:
- "4444:4444"
firefox:
image: selenium/node-firefox
links:
- hub
expose:
- "5555"
chrome:
image: selenium/node-chrome
links:
- hub
expose:
- "5555"
Docker compose
public class DockerComposeSelenideDemo {
@ClassRule
public static DockerComposeContainer environment =
new DockerComposeContainer(new File(getProperty("user.dir") + "/docker-compose.yml"))
.withExposedService("hub_1", 4444);
@BeforeClass
public static void setUp() throws Exception {
String host = environment.getServiceHost("hub_1", 4444);
int port = environment.getServicePort("hub_1", 4444);
Configuration.remote = "http://" + host + ":" + port + "/wd/hub";
}
...
Чем это лучше?
Быстро разворачивается
Не нужно париться с драйверами
Можно легко перейти на куда угодно
Python tetcontainers
Standalone Selenium контенеры
Selenium Grid контенеры
Контейнеры баз данных
Стартуем Selenium Grid
@pytest.fixture(scope="session")
def selenium_container(request):
container = SeleniumGrid(FIREFOX, node_count=2).start()
yield container
container.stop()
Используем Selenium Grid
def test_google(self, selenium_container):
driver = selenium_container.get_driver()
driver.get("http://google.com")
driver.find("q").type("Hello")
Cобираем свой контейнер
FROM ubuntu:16.04
# Install Python
RUN \
apt-get update && \
apt-get install -y python
RUN apt-get update -qqy \
&& apt-get -qqy install ffmpeg
EXPOSE 8086
USER root
WORKDIR /home/root/
COPY . /home/root
RUN pip install --no-cache-dir -r requirements.txt
ENTRYPOINT [ "python", "main.py" ]
Cобираем свой контейнер
docker = DockerClient()
docker.build_from_path(".", tag="video_service")
docker.run("video_service", bind_ports={8086: 8086})
Реальный пример
Выводы
Docker упрощает жизнь
Биндинги для языков упрощают использование Docker
Спасибо!
http://automation-remarks.com
@s_pirogov
Copy of Атвтоматизация и контейнеры
By Sergey Pirogov
Copy of Атвтоматизация и контейнеры
- 1,729