Skip to content

Запуск тестов ​

По умолчанию тесты запускаются на SQLite в памяти:

bash
composer test

Чтобы запустить их на MySQL или PostgreSQL, поднимите базы из compose.yml и направьте на них тесты:

bash
docker compose up -d mysql pgsql
DB_CONNECTION=mysql DB_PORT=33306 composer test
DB_CONNECTION=pgsql DB_PORT=54329 composer test

Имя базы, пользователь и пароль по умолчанию — query_builder, user и secret, как в compose.yml. При необходимости переопределите их через DB_DATABASE, DB_USERNAME, DB_PASSWORD и DB_HOST.

На MySQL и PostgreSQL схема и данные фикстур создаются один раз на тестовый процесс, и каждый тест выполняется в транзакции, которая затем откатывается (перенесённый набор spatie в tests/Compat по-прежнему мигрирует свои таблицы для каждого теста). Последовательный прогон использует одну базу, поэтому не запускайте два прогона на одном сервере одновременно.

Тесты также запускаются параллельно, по умолчанию по процессу на ядро процессора:

bash
composer test:parallel
DB_CONNECTION=mysql DB_PORT=33306 composer test:parallel
DB_CONNECTION=pgsql DB_PORT=54329 composer test:parallel
vendor/bin/pest --parallel --processes=4

Каждый процесс получает свою базу <DB_DATABASE>_<n> (query_builder_1, query_builder_2, …), которая создаётся при первом использовании и сохраняется до следующего прогона. Поэтому пользователю базы нужно право создавать эти базы:

  • PostgreSQL: user из compose.yml — суперпользователь, ничего делать не нужно.

  • MySQL: compose.yml выдаёт user все привилегии на query\_builder\_% через docker/mysql-init.sql, который выполняется только при создании тома с данными. Для контейнера, созданного до появления этого скрипта, выдайте их один раз вручную:

    bash
    docker compose exec mysql mysql -uroot -psecret \
        -e "GRANT ALL PRIVILEGES ON \`query\\_builder\\_%\`.* TO 'user'@'%'"

    или пересоздайте контейнер вместе с данными: docker compose rm -sfv mysql, затем docker compose up -d mysql.

Все тесты можно запустить и внутри Docker, без PHP на хосте:

bash
docker compose build php
docker compose run --rm php composer install
docker compose run --rm php composer test
docker compose up -d mysql pgsql
docker compose run --rm -e DB_CONNECTION=mysql -e DB_HOST=mysql -e DB_PORT=3306 php composer test
docker compose run --rm -e DB_CONNECTION=pgsql -e DB_HOST=pgsql -e DB_PORT=5432 php composer test

Сборка образа с другой версией PHP:

bash
PHP_VERSION=8.3 docker compose build php

На Linux-хосте, где id пользователя не 1000, собирайте образ со своим id, чтобы у файлов, записанных в bind mount, был правильный владелец:

bash
docker compose build --build-arg UID="$(id -u)" php

Статический анализ и стиль кода:

bash
composer analyse
composer lint