Автор оригинала: 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 вы обнаружите значительное улучшение при выполнении тестов, когда папка данных отображается на диске оперативной памяти.