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'