Перейти к основному содержимому

Тестирование ядра

Pimcore использует Codeception для тестирования своих основных функций.

Для выполнения основных тестов Pimcore предоставляет файл docker-compose.yaml, который позволяет создать настройки для запуска тестов.

Docker-образы базируются на дебаг-версиях, поэтому вы можете отлаживать тесты с помощью xdebug. Однако убедитесь, что сопоставления путей применены правильно

Требования

  • Установленные в системе docker и docker compose
  • Локально клонированный git-репозиторий Pimcore

Подготовка

  • Перейдите в директорию tests\bin репозитория Pimcore
  • Выполните скрипт ./init-tests.sh. Он сделает следующее:
    • Запустит docker compose up -d и настроит необходимые сервисы (БД, Redis и т.д.). Исходный код Pimcore монтируется в контейнер, поэтому изменения в файлах подхватываются сразу.
    • Скопирует некоторые файлы из .github\ci\file для подготовки системы к выполнению тестов (фактически то же самое, что и для действий с github)
    • Выполнит composer install для установки всех зависимостей
    • Выведет дальнейшие инструкции

Теперь система готова, и тесты можно выполнять внутри контейнеров docker (смотрите также команды ниже).

После завершения работы не забудьте остановить docker контейнеры и очистить тома командой docker compose down -v --remove-orphans.

Выполнение тестов

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

Это запустит все тесты

docker compose exec php vendor/bin/codecept run -c . -vvv  

Запуск конкретного набора тестов (suite):

Запускает только тесты моделей данных (Model). Список наборов приведен ниже.

docker compose exec php vendor/bin/codecept run -c . Model -vvv  

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

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

docker compose exec php vendor/bin/codecept run -c . Model -vvv -g dataTypeLocal  

Тесты Redis кэша

Для Redis параметр PIMCORE_TEST_REDIS_DSN является обязательным. Если вы не используете Redis, предоставляемый docker-compose.yaml, установите для него значение, которое не конфликтует ни с какими другими базами данных Redis в вашей системе.

docker compose exec php vendor/bin/codecept run -c . Cache  

Проверяйте лог-файлы

Не забывайте проверять лог-файлы (особенно test.log и php.log) внутри контейнера docker при возникновении проблем.

Важные переменные окружения

Настроены по умолчанию в docker-compose.yaml, но могут быть изменены по мере необходимости.

ПеременнаяПримерКомментарий
APP_ENVtestТестовое окружение
PIMCORE_TEST1Важно переключает пути к директориям (например, /var/classes)
PIMCORE_TEST_SKIP_DB1Пропускает настройку БД (ускоряет запуск тестов, не требующих БД).
PIMCORE_TEST_REDIS_DSNredis://localhostНеобходим для тестов REDIS

Наборы тестов (Suites)

Тесты разделены на наборы, каждый из которых охватывает определенные области ядра.

Название набораОписание
CacheТесты кэша
ModelТесты объектов данных (Dataobjects)
ServiceТесты, охватывающие общие задачи или совместно используемые элементы (управление версиями, ...)
UnitДругие тесты (возможно, потребуется реструктуризация)
...

Группы

В следующей таблице перечислены все группы, используемые в настоящее время в основных тестах Pimcore. Если вы расширяете тесты или пишете новые, пожалуйста, пометьте их соответствующим образом.

ГруппаОписание
cache-cliТесты командной строки кэша
cache.core.arrayТесты обработчика массива кэша
cache.core.dbТесты обработчика базы данных кэша
cache.core.fileТесты обработчика файлов кэша
cache.core.redisТесты обработчика Redis кэша
cache.core.redis_luaТесты обработчика Redis кэша с включенным LUA
dataTypeLocalDataobject - тесты типов данных
model.relations.multipleassignmentDataobject - тесты "разрешить несколько назначений"
...

Полезные опции командной строки

Полезные примеры:

ОпцияПримерОписание
--group (-g--group dataTypeLocalЗапуск только указанных групп
--skip (-s)--skip cache,restПропускать тесты кэширования и Rest
--skip-group (-x)--skip-group cache.core.fileПропустить тесты файлового кэша
--fail-fast--fail-fastОстановить при первой же ошибке
...

Дополнительные опции см. здесь: Команды Codeception.

Предоставление новых тестов и расширение существующих

В целом, мы высоко ценим вклад в расширение и улучшение формы тестов. Пожалуйста, следуйте структуре и принципам, описанным выше.

Если у вас есть возможность расширить модель данных, пожалуйста, ознакомьтесь с Model.php. Там вы найдете все определения классов, используемые для тестирования.

Выполнение анализа PHPStan

Сначала получите копию этого примера файла конфигурации и поместите его в свой корневой каталог.

Добавьте зависимости:

# минимум  
composer require "phpstan/phpstan:^0.12" "phpstan/phpstan-symfony:^0.12"

# требуется, если вы хотите провести полный анализ
composer require "elasticsearch/elasticsearch:^7.11" "composer/composer:*"

Запустите

TMPDIR=/tmp/[dedicateddir] ./vendor/bin/phpstan analyse --memory-limit=-1  

где /tmp/[dedicateddir] должен быть доступным для записи временным каталогом.

Работа PHPStan

Откройте журнал сборки и проверьте, нет ли проблем.

PHPStan лог

Функция базового файла PHPStan

PHPStan может создавать базовый файл, содержащий все текущие ошибки. Смотрите эту запись blog.

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

vendor/bin/phpstan analyse --memory-limit=-1 --generate-baseline  

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

Обзор уровней PHPStan

УровеньПроверки
0основные проверки, неизвестные классы, неизвестные функции, неизвестные методы, вызываемые с помощью $this, неправильное количество аргументов, передаваемых этим методам и функциям, всегда неопределенные переменные
1возможно, неопределенные переменные, неизвестные магические методы и свойства в классах с __call и __get
2неизвестные методы проверяются во всех выражениях (не только в $this), проверяя PHPDocs
3возвращаемые типы, типы, назначенные свойствам
4базовая проверка неактивного кода - всегда ложный instanceof и другие проверки типов, неактивные ветки else, недоступный код после возврата и т.д.
5проверка типов аргументов, передаваемых методам и функциям
6проверка на отсутствие указателей типов
7сообщение о частично неверных типах объединения
8сообщение о вызове методов и доступе к свойствам для типов с нулевым значением

Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.