INTERNAL
composer require --dev proklung/bitrix-phpunit-testing-tools
В пакете, использующем этот пакет как зависимость, в composer.json должна быть секция (нужно, чтобы модуль миграций установился куда надо):
"extra": {
"installer-paths": {
"vendor/sheerockoff/bitrix-ci/files/bitrix/modules/{$name}/": ["type:bitrix-module"]
}
}Базовый класс для тестов - BitrixableTestCase. Запускает, приложенный к пакету Битрикс и позволяет использовать в тестах
его API.
Параметры доступа к БД определяются в методе setupDatabaseData базового класса BitrixableTestCase.
Если база на момент запуска не существует, то будет создана.
По умолчанию:
protected function setupDatabaseData() : void
{
putenv('MYSQL_HOST=localhost');
putenv('MYSQL_DATABASE=bitrix_ci');
putenv('MYSQL_USER=root');
putenv('MYSQL_PASSWORD=');
}Можно переопределить в каждом конкретном тесте.
Указание сбрасывать базу перед каждым тестом и загружать по новой.
Сбрасывать базу и загружать кастомный дамп базы.
Путь к дампу указывается в методе getDumpPath теста:
protected function getDumpPath() : string
{
return $_SERVER['DOCUMENT_ROOT'] . '/Tests/dump/dump.sql';
}Действует только в сочетании с ResetDatabaseTrait.
При использовании дампов с боя обычно возникают проблемы с просроченностью лицензии. В таком случае приходится вручную
заменить файл include.php в vendor/sheerockoff/bitrix-ci/files/bitrix/modules/main.
Использование миграций модуля sprint.option.
Путь к директории с миграциями указывается в методе getPathSprintMigrations теста:
protected function getPathSprintMigrations() : string
{
return __DIR__ . '../../../../../../Tests/sprint_migrations/';
}В силу особенностей использования сборки Bitrix CI приходится устанавливать модуль хитро - прямо внутрь пакета сборки
(в папку vendor/sheerockoff/bitrix-ci/files/bitrix/modules/sprint.option) на стадии работы композера. Побочный эффект - если обновится сама сборка,
то модуль миграций улетит в трубу.
Пока так.
Периодически база тухнет по сроку годности ("... пробной версии истек ..."). Чтобы пофиксить нужно
запустить любой тест с трэйтом ResetDatabaseTrait, пересоздающим базу заново.
Указание запускать миграции перед каждым тестом.
Под капотом урезанная версия пакета, так что подходят миграции и от него.
За одним исключением - миграция наследуется не от класса Arrilot\BitrixMigrations\BaseMigrations\BitrixMigration, а от
Arrilot\BitrixMigrationsFork\BaseMigrations\BitrixMigration.
Путь к директории с миграциями указывается в методе getMigrationsDir теста:
protected function getMigrationsDir() : string
{
return __DIR__ . '/../migrations';
}К трэйту приложен метод-хелпер makeMigration для создания миграций по шаблону.
protected function makeMigration(string $name, string $template) : voidИмеющиеся шаблоны:
| Название | Описание | Алиасы |
|---|---|---|
| `default` | Чистый шаблон по умолчанию | |
| `add_iblock_type` | Добавление типа инфоблока | |
| `add_iblock` | Добавление инфоблока | |
| `add_iblock_element_property` | Добавление свойства в инфоблок | `add_iblock_prop`, `add_iblock_element_prop`, `add_element_prop`, `add_element_property` |
| `add_uf` | Добавление UF свойства | |
| `query` | Произвольный запрос в БД через АПИ d7 | |
| `add_table` | Создание таблицы через АПИ d7 | `create_table` |
| `delete_table` | Удаление таблицы через АПИ d7 | `drop_table` |
Дополнительный трэйт - CSVTrait для импорта CSV файлов (формата экспорта Битрикса) в миграциях.
После его задействования тест должен реализовать методы:
getIblockCode()- код инфоблока;getImportDefinitionSections()- определение подразделов. Массив с номером столбцов в CSV файле (IC_GROUP0 итд);getImportDefinitionProperties()- определение свойств. Массив вида [код свойства => номер столбца в CSV];getCsvPath()- путь к CSV файлу;
Важно! - в CSV файле не должно быть первой строчки с названиями столбцов.
Из пакета. Переработаны под частные нужды.
Для помощи в тестировании кода компонента используется класс Prokl\BitrixTestingTools\Invokers\ComponentInvoker
Методы класса:
__constructor($componentObject)- инициализация объекта запуска компонента;init()- инициализация;setParams($params)- устанавливает параметры для запуска тестируемого компонента;setArParams($params)- устанавливает arParams для запуска тестируемого компонента;setName(string $name)- устанавливает название компонента("test.component");setTemplate($template)- устанавливает шаблон компонента("test.component");execute()- запускает компонент на выполнение (шаблон при этом не используется);getResultValue($name)- возвращает параметр $arResult по ключу $name;getArResult()- возвращает полный $arResult работы компонента;getArResultCached()- возвращает кэшированную часть (через $this->__component) $arResult после работы компонента;getExecuteResult()- возвращает результат работы компонента, когда в коде компонента используется оператор возвратаreturn.
Пример:
// ...
/**
* @label component
* @test
*/
public function useComponentInvoker() {
/** @var CBitrixComponent $componentObject */
$component = new \Prokl\BitrixTestingTools\Invokers\ComponentInvoker($componentObject);
$component->init();
$component->setParams(array("id" => 10));
$component->execute();
$this->getAssert()->equal($component->getResultValue("id"), 10, "Результат не верен");
}Тестировать result_modifier шаблона компонента можно объектом класса Prokl\BitrixTestingTools\Invokers\ResultModifierInvoker.
Методы:
__construct($componentName, $template)- инициализация объекта, параметры совпадают с параметрами методаCMain::IncludeComponent();setArResult($arResult)- искусственная установка результата для передачи адаптеру;setArParams($params)- устанавливает arParams для запуска тестируемого компонента;execute()- запуск адаптера на выполнение;getArResult()- возвращает полный$arResultработы адаптера;getArResultCached()- возвращает кэшированную часть (через $this->__component) $arResult после работы компонента;getArResultValue($name)- значение результата работы адаптера по ключу$name;
Пример:
/**
* @label component
* @test
*/
public function modifierForSomeTemplate() {
$rm = new \Prokl\BitrixTestingTools\Invokers\ResultModifierInvoker("project:test.with.class", "list");
$rm->setArResult(array("id" => 10));
$rm->execute();
$this->getAssert()->equal($rm->getArResultValue("id"), 10, "Параметры не равны");
}Класс Prokl\BitrixTestingTools\Invokers\EventInvoker облегчает тестирование обработки событий.
Методы:
__construct($module, $eventName)- инициализация объекта запуска события, $module - имя модуля выброса события, $eventName - название события;setExecuteParams($params)- установка параметров события в виде массива, будут переданы в параметры события;execute()- выброс события;countOfHandlers()- получение количества обработчиков события;getEvent()- получение объекта события;
Пример:
// ...
/**
* @test
*/
public function handlersOfEventExist() {
$eventInvoker = new \Prokl\BitrixTestingTools\Invokers\EventInvoker("main", "OnPageStart");
$eventInvoker->setExecuteParams(array(
"IBLOCK_ID" => 12
));
$eventInvoker->execute();
$this->getAssert()->asTrue($eventInvoker->countOfHandlers() > 1);
}- Метод
goToклассаBitrixableTestCase. Эмулирует нахождение на каком-либо URL. Выставляет все, что связано с URL в старом ядре и D7.
Также подменяет автоматом все, что возможно из супер-глобалов типа $_SERVER, $_POST и т.д.
$_GET['test'] = 'OK';
$this->goTo('/test/');
$url = $APPLICATION->GetCurPage(); // $url = '/test/index.php'
$request = Application::getInstance()->getContext()->getRequest();
$uriString = $request->getRequestUri(); // $uriString = '/test/'
$testGetParam = $request->getQuery('test'); // $testGetParam = 'OK'