proklung / bitrix-phpunit-testing-tools
Bitrix PHPUNIT testing tools.
Installs: 63
Dependents: 10
Suggesters: 0
Security: 0
Stars: 4
Watchers: 1
Forks: 1
Open Issues: 0
pkg:composer/proklung/bitrix-phpunit-testing-tools
Requires
- ext-mysqli: *
- andreyryabin/sprint.migration: ^4
- proklung/phpunit-testing-tools: ^1.0
- sheerockoff/bitrix-ci: ^21.400
README
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='); }
Можно переопределить в каждом конкретном тесте.
Управление
Трэйт ResetDatabaseTrait
Указание сбрасывать базу перед каждым тестом и загружать по новой.
Трэйт CustomDumpTrait
Сбрасывать базу и загружать кастомный дамп базы.
Путь к дампу указывается в методе getDumpPath теста:
protected function getDumpPath() : string { return $_SERVER['DOCUMENT_ROOT'] . '/Tests/dump/dump.sql'; }
Действует только в сочетании с ResetDatabaseTrait.
При использовании дампов с боя обычно возникают проблемы с просроченностью лицензии. В таком случае приходится вручную
заменить файл include.php в vendor/sheerockoff/bitrix-ci/files/bitrix/modules/main.
Трэйт SprintMigrationsTrait
Использование миграций модуля sprint.option.
Путь к директории с миграциями указывается в методе getPathSprintMigrations теста:
protected function getPathSprintMigrations() : string { return __DIR__ . '../../../../../../Tests/sprint_migrations/'; }
Нюансы
В силу особенностей использования сборки Bitrix CI приходится устанавливать модуль хитро - прямо внутрь пакета сборки
(в папку vendor/sheerockoff/bitrix-ci/files/bitrix/modules/sprint.option) на стадии работы композера. Побочный эффект - если обновится сама сборка,
то модуль миграций улетит в трубу.
Пока так.
Периодически база тухнет по сроку годности ("... пробной версии истек ..."). Чтобы пофиксить нужно
запустить любой тест с трэйтом ResetDatabaseTrait, пересоздающим базу заново.
Трэйт UseMigrationsTrait
Указание запускать миграции перед каждым тестом.
Под капотом урезанная версия пакета, так что подходят миграции и от него.
За одним исключением - миграция наследуется не от класса 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)
Тестировать 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'