Автоматизация и контейнеры

Сергей Пирогов

Сергей Пирогов

Senior QA Automation

Testing Center of Excellence

Ciklum

http://automation-remarks.com

@s_pirogov

О чем поговорим?

Как использовать Docker

Docker и автоматизация на  Java

Docker и Python

Почему Java и Python?

Микросервисы и не только

Поднимаем все локально

Тестируем на разных версиях

  • MySQL 5.5
  • MySQL 5.6
  • MySQL 5.7

Ужос ...

Запакуем все в контейнер

MySql в контейнере - это просто

docker run -e -p 3306:3306 \
        MYSQL_ROOT_PASSWORD=root mysql:5.7

Тесты + контейнеры

docker run container
test
docker stop container

Как стартовать?

Руками  - не автоматизация

.bat / .sh - не серьезно

Стартовать прямо из кода

Java Testcontainers

Работает через JUnit rule

Умеет запускать любые контейнеры

Все тот же MySql

public class SimpleMySQLTest {

    @Rule
    public MySQLContainer mysql = new MySQLContainer();

    @Test
    public void testSimple() throws SQLException {
       ResultSet resultSet = performQuery(mysql, "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());
    }
}

Чем это лучше?

Быстро разворачивается

Не нужно париться с драйверами

Можно легко перейти на клауды

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