proklung / bitrix-phpunit-testing-tools
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
Имеющиеся шаблоны:
Дополнительный трэйт - 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'