PHPackages                             proklung/bitrix-phpunit-testing-tools - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. proklung/bitrix-phpunit-testing-tools

ActiveLibrary[Testing &amp; Quality](/categories/testing)

proklung/bitrix-phpunit-testing-tools
=====================================

Bitrix PHPUNIT testing tools.

1.4.9(4y ago)765110MITPHP

Since Apr 23Pushed 4y ago1 watchersCompare

[ Source](https://github.com/ProklUng/bitrix.phpunit.testing.tools)[ Packagist](https://packagist.org/packages/proklung/bitrix-phpunit-testing-tools)[ RSS](/packages/proklung-bitrix-phpunit-testing-tools/feed)WikiDiscussions master Synced 2w ago

READMEChangelog (10)Dependencies (3)Versions (24)Used By (10)

Кастомные инструменты для PHPUnit тестов под Битрикс
====================================================

[](#кастомные-инструменты-для-phpunit-тестов-под-битрикс)

**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

[](#трэйт-resetdatabasetrait)

Указание сбрасывать базу перед каждым тестом и загружать по новой.

#### Трэйт CustomDumpTrait

[](#трэйт-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

[](#трэйт-sprintmigrationstrait)

Использование миграций модуля [sprint.option](https://github.com/andreyryabin/sprint.migration).

Путь к директории с миграциями указывается в методе `getPathSprintMigrations` теста:

```
    protected function getPathSprintMigrations() : string
    {
        return __DIR__ . '../../../../../../Tests/sprint_migrations/';
    }
```

##### Нюансы

[](#нюансы-1)

В силу особенностей использования сборки [Bitrix CI](https://github.com/sheerockoff/bitrix-ci) приходится устанавливать модуль хитро - прямо внутрь пакета сборки (в папку `vendor/sheerockoff/bitrix-ci/files/bitrix/modules/sprint.option`) на стадии работы композера. Побочный эффект - если обновится сама сборка, то модуль миграций улетит в трубу.

Пока так.

Периодически база тухнет по сроку годности ("... пробной версии истек ..."). Чтобы пофиксить нужно запустить любой тест с трэйтом `ResetDatabaseTrait`, пересоздающим базу заново.

#### Трэйт UseMigrationsTrait

[](#трэйт-usemigrationstrait)

Указание запускать миграции перед каждым тестом.

Под капотом урезанная версия [пакета](https://github.com/arrilot/bitrix-migrations), так что подходят миграции и от него. За одним исключением - миграция наследуется не от класса `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()` - определение свойств. Массив вида \[код свойства =&gt; номер столбца в CSV\];
- `getCsvPath()` - путь к CSV файлу;

**Важно!** - в CSV файле не должно быть первой строчки с названиями столбцов.

### Инвокеры

[](#инвокеры)

Из [пакета](https://github.com/worksolutions/bitrix-module-bunit). Переработаны под частные нужды.

#### Нюансы

[](#нюансы-2)

Для помощи в тестировании кода компонента используется класс `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-&gt;\_\_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)

Тестировать result\_modifier шаблона компонента можно объектом класса `Prokl\BitrixTestingTools\Invokers\ResultModifierInvoker`.

Методы:

- `__construct($componentName, $template)` - инициализация объекта, параметры совпадают с параметрами метода `CMain::IncludeComponent()`;
- `setArResult($arResult)` - искусственная установка результата для передачи адаптеру;
- `setArParams($params)` - устанавливает arParams для запуска тестируемого компонента;
- `execute()` - запуск адаптера на выполнение;
- `getArResult()` - возвращает полный `$arResult` работы адаптера;
- `getArResultCached()` - возвращает кэшированную часть (через $this-&gt;\_\_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'
```

###  Health Score

31

—

LowBetter than 66% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity15

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~12 days

Recently: every ~64 days

Total

23

Last Release

1624d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/9210c86ee6734e537eaf22c0f2fe7a965451e340e39e1aae2b74013f24c2660d?d=identicon)[gedovan](/maintainers/gedovan)

---

Top Contributors

[![ProklUng](https://avatars.githubusercontent.com/u/19857467?v=4)](https://github.com/ProklUng "ProklUng (35 commits)")

---

Tags

bitrixphp-libraryphp7phpunit

### Embed Badge

![Health badge](/badges/proklung-bitrix-phpunit-testing-tools/health.svg)

```
[![Health](https://phpackages.com/badges/proklung-bitrix-phpunit-testing-tools/health.svg)](https://phpackages.com/packages/proklung-bitrix-phpunit-testing-tools)
```

###  Alternatives

[dms/phpunit-arraysubset-asserts

This package provides ArraySubset and related asserts once deprecated in PHPUnit 8

14228.7M340](/packages/dms-phpunit-arraysubset-asserts)[orchestra/workbench

Workbench Companion for Laravel Packages Development

8219.1M69](/packages/orchestra-workbench)[roquie/laravel-dusk-select2

Select2.js support for the Laravel Dusk testing.

41356.2k5](/packages/roquie-laravel-dusk-select2)[kunicmarko/graphql-test

GraphQL Test Cases

1359.0k](/packages/kunicmarko-graphql-test)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
