Зачем автотестам 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

Made with Slides.com