Рубрики
Без рубрики

Как запускать интеграционные тесты на скорости деформации с помощью Docker и tmpfs

Узнайте, как запускать интеграционные тесты на PostgreSQL, MySQL, MariaDB в 20 раз быстрее, используя Docker и сопоставляя папку данных в tmpfs.

Автор оригинала: Vlad Mihalcea.

Вступление

В этой статье я покажу вам, как запускать интеграционные тесты на PostgreSQL, MySQL, MariaDB в 20 раз быстрее, используя Docker и сопоставляя папку данных в tmpfs.

Как уже объяснялось ранее , вы можете запускать тесты интеграции баз данных в 20 раз быстрее ! Хитрость заключается в том, чтобы отобразить каталог данных в памяти, и в моей предыдущей статье я показал вам, какие изменения необходимо внести, если на вашем компьютере установлен экземпляр PostgreSQL или MySQL.

В этом посте я собираюсь расширить первоначальную идею и показать вам, как вы можете достичь той же цели с помощью Docker и tmpfs .

Вау. Я ускоряю тесты со 100 до 10 секунд, подключив #MariaDB к #tmpfs с помощью #Docker . Аккуратно! Благодаря https://t.co/ipjN48OQ0H

Видео на YouTube

Эта статья также доступна в виде видео на YouTube:

МариаДБ

Получение изображения докера

Прежде всего, вам нужен образ Docker для базы данных, в которой вы хотите запустить интеграционные тесты.

Чтобы увидеть, какие изображения Docker есть на вашем компьютере, вам нужно выполнить команду изображения docker :

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
oracle/database     12.1.0.2-se2        b5f12a4d9ae0        9 days ago          11.1 GB
bash                latest              c2a000c8aa3c        11 days ago         12.8 MB
oraclelinux         latest              5a42e075a32b        3 weeks ago         225 MB
d4w/nsenter         latest              9e4f13a0901e        4 months ago        83.8 kB

Теперь давайте получим последнее изображение MariaDB Docker:

> docker pull mariadb
Status: Downloaded newer image for mariadb:latest

Если мы повторим изображения докеров , мы также увидим изображение докера MariaDB в списке:

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
oracle/database     12.1.0.2-se2        b5f12a4d9ae0        9 days ago          11.1 GB
bash                latest              c2a000c8aa3c        11 days ago         12.8 MB
mariadb             latest              7eca0e0b51c9        2 weeks ago         393 MB
oraclelinux         latest              5a42e075a32b        3 weeks ago         225 MB
d4w/nsenter         latest              9e4f13a0901e        4 months ago        83.8 kB

Запуск базы данных в контейнере Docker

Чтобы создать новый контейнер Docker, нам нужно использовать команду docker выполнить :

docker run \
--name mariadb \
-p 3306:3306 \
--tmpfs /var/lib/mysql:rw \
-e MYSQL_ROOT_PASSWORD=admin \
-e MYSQL_USER=hibernate_orm_test \
-e MYSQL_PASSWORD=hibernate_orm_test \
-e MYSQL_DATABASE=hibernate_orm_test  \
-d mariadb

В Windows вместо этого вам придется использовать многострочный разделитель ^ :

docker run ^
--name mariadb ^
-p 3306:3306 ^
--tmpfs /var/lib/mysql:rw ^
-e MYSQL_ROOT_PASSWORD=admin ^
-e MYSQL_USER=hibernate_orm_test ^
-e MYSQL_PASSWORD=hibernate_orm_test ^
-e MYSQL_DATABASE=hibernate_orm_test ^
-d mariadb

Аргументы можно объяснить следующим образом:

  • --имя используется для указания имени вновь созданного контейнера. Затем мы можем ссылаться на контейнер под этим именем, когда захотим остановить или запустить его
  • -p 3306:3306 используется для сопоставления порта контейнера Docker с портом хост-машины, чтобы мы могли получить доступ к базе данных MariaDB с помощью 3306 порт внутри главной машины
  • --tmpfs/var/lib/mysql:rw является самым крутым аргументом, поскольку он позволяет нам сопоставлять каталог данных MariaDB /var/lib/mysql в памяти с помощью tmpfs
  • -e определяет пароль учетной записи root для MariaDB
  • -e создает нового пользователя, которого мы будем использовать для тестирования
  • -e создает новый пароль для нашего тестируемого пользователя
  • -e создает новую базу данных MariaDB

После выполнения вышеупомянутой команды docker run , если мы перечислим текущие контейнеры Docker с помощью docker ps-a , мы сможем увидеть наш недавно созданный mariadb контейнер Docker, который также запущен и запущен:

> docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                    PORTS                    NAMES
2c5f5131566b        mariadb                        "docker-entrypoint..."   12 minutes ago      Up 12 minutes             0.0.0.0:3306->3306/tcp   mariadb
dc280bbfb186        oracle/database:12.1.0.2-se2   "/bin/sh -c $ORACL..."   9 days ago          Exited (137) 7 days ago                            oracle

Используя имя контейнера (например, mariadb ), мы также можем подключить процесс bash, чтобы проверить контейнер докера MariaDB:

> docker exec -i -t mariadb /bin/bash

root@2c5f5131566b:/

df -h

Filesystem Size Used Avail Use% Mounted on overlay 59G 23G 34G 41% / tmpfs 2.2G 0 2.2G 0% /dev tmpfs 2.2G 0 2.2G 0% /sys/fs/cgroup /dev/sda1 59G 23G 34G 41% /etc/hosts shm 64M 0 64M 0% /dev/shm tmpfs 2.2G 115M 2.1G 6% /var/lib/mysql tmpfs 2.2G 0 2.2G 0% /sys/firmware

Как вы можете видеть из вывода df-h , каталог var/lib/mysql данных отображается в tmpfs. У-у-у!

Еще одна вещь, которую нужно сделать, давайте предоставим некоторые права администратора нашему тестовому пользователю. Мы можем сделать это прямо из терминала Docker container bash, используя команду mysql-u root-admin hibernate_orm_test :

root@2c5f5131566b:/

mysql -u root -padmin hibernate_orm_test

Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 6 Server version: 10.1.21-MariaDB-1~jessie mariadb.org binary distribution Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [hibernate_orm_test]>GRANT ALL PRIVILEGES ON *.* TO 'hibernateormtest' WITH GRANT OPTION;

Сделано!

PostgreSQL

Получение изображения докера

Теперь давайте сделаем то же самое для конкретной версии PostgreSQL (например, 9.5.6)

> docker pull postgres:9.5.6
9.5.6: Pulling from library/postgres
Status: Downloaded newer image for postgres:9.5.6

Если мы повторно запустим изображения докеров , мы также увидим изображение докера PostgreSQL в списке:

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            9.5.6               bd44e8a44ab2        2 weeks ago         265 MB
oracle/database     12.1.0.2-se2        b5f12a4d9ae0        9 days ago          11.1 GB
bash                latest              c2a000c8aa3c        11 days ago         12.8 MB
mariadb             latest              7eca0e0b51c9        2 weeks ago         393 MB
oraclelinux         latest              5a42e075a32b        3 weeks ago         225 MB
d4w/nsenter         latest              9e4f13a0901e        4 months ago        83.8 kB

Запуск базы данных в контейнере Docker

Для PostgreSQL команда очень похожа:

docker run ^
    --name postgres95 ^
    -p 5432:5432 ^
    --tmpfs /var/lib/postgresql/data:rw ^
    -e POSTGRES_PASSWORD=admin ^
    -d ^
    postgres:9.5.6

Папка данных находится в папке /var/lib/postgresql/data в PostgreSQL, а другие параметры имеют то же значение, что и в случае с MariaDB.

Запуск интеграционных тестов на MariaDB с использованием Docker и tmpfs

Выполнение всех тестов (около 400 тестов интеграции баз данных) в папке документации Hibernate на MariaDB занимает около 30 секунд:

> gradle test -Pdb=mariadb
:documentation:compileTestJava
:documentation:processTestResources
:documentation:testClasses
:documentation:test

BUILD SUCCESSFUL

Total time: 30.339 secs

Запуск интеграционных тестов на PostgreSQL с использованием Docker и tmpfs

В PostgreSQL они занимают менее 30 секунд:

> gradle test -Pdb=pgsql
:documentation:compileTestJava
:documentation:processTestResources
:documentation:testClasses
:documentation:test

BUILD SUCCESSFUL

Total time: 28.732 secs

Жизненный цикл контейнера

Когда вы используете контейнер базы данных, вы можете остановить его следующим образом:

> docker stop mariadb

или, для PostgreSQL:

> docker stop postgres95

Контейнер сохраняется, поэтому вам не нужно повторять все эти действия в следующий раз, когда он вам понадобится. Все, что вам нужно сделать, это начать вот так:

> docker start mariadb

или, для PostgreSQL:

> docker start postgres95

Вывод

Сопоставление каталога данных СУБД в tmpfs с помощью Docker еще проще, и это особенно актуально для MySQL и MariaDB, поскольку операции DDL занимают значительно больше времени, чем в других системах баз данных (например, Oracle или SQL Server).

Однако даже для PostgreSQL вы обнаружите значительное улучшение при выполнении тестов, когда папка данных отображается на диске оперативной памяти.