Запускаем PHPUnit тесты для проекта на 1С-Битрикс

в 20:35, , рубрики: 1С-Битрикс, метки:

Здравствуйте коллеги,

В этом посте хочу показать свой способ запуска юнит-тестов на битрикс-проектах. При юнит-тестировании таких проектов существует известная проблема инициализации ядра системы. Ниже я покажу как мне удалось ее решить.

Сразу стоит отметить, что задача стояла запускать тесты как локально, где ведется разработка, так и удаленно на тест-прод и прод площадках проектов. А так же, для удаленного запуска тестов обязательно потребуется ssh доступ к серверу с правами к /usr/bin/php или где там у вас установлен интерпретатор PHP на сервере.

Далее следует что-то в роде пошаговой инструкции:

Установка и настройка PHPUnit

PHPUnit устанавливается в проект как dependency через Composer.

Файл /local/composer/composer.json

{
  "require-dev": {
    "phpunit/phpunit": "4.5.*"
  }
}

Далее в папочку /local/tests/ складывается xml-файл конфигурации PHPUnit, бутстрап и файл инициализации ядра Битрикс:
image

Теперь подробно по содержимому файлов.
Файл /local/tests/phpunit.xml.dist

<phpunit
        bootstrap="bootstrap.php"
        colors="true">
    <testsuites>
        <testsuite name="My Test Suit">
            <directory>./</directory>
        </testsuite>
    </testsuites>
</phpunit>

Тут указываем путь к бутстрап файлу в текущей папке и устанавливаем параметр colors в true. Так же задаем путь «тест съюта» для текущей папки (local), чтоб PHPUnit считал все файлы с окончанием *Test.php как файлы с тест-классами.

Файл /local/tests/bootstrap.php

// bitrix/modules/main/include.php with no authorizing and Agents execution
require_once "main_include_no_permission.php";

function initBitrixCore()
{
	// manual saving of DB resource
    global $DB;
    $app = BitrixMainApplication::getInstance();
    $con = $app->getConnection();
    $DB->db_Conn = $con->getResource();

    // "authorizing" as admin
    $_SESSION["SESS_AUTH"]["USER_ID"] = 1;
}

Тут подключается слегка «укороченный» файл /bitrix/modules/main/include.php, я вырезал из него проверку и запуск агентов и прохождение авторизации (к примеру, без этого запуск тестов отпадал с html-кодом формы авторизации на коробочном кор.портале, где авторизация обязательна).
Ниже определяется функция initBitrixCore(), которая явно сохраняет ресурс БД в свойство глобального объекта $DB (без этого часто отпадает с ошибкой в методе CDatabase::ForSql()), а так же сохраняет в сессию идентификатор супер администратора системы.
Код можно забрать с GitHub по этой ссылке

Настройка PhpStorm для тестирования

Настройка самой IDE особо не отличается от описанной в официальной документации. Суть заключается в том, что нам надо добавить удаленный интерпретатор PHP на удаленном сервере, настроить PHPUnit в настройках IDE и добавить PHPUnit конфигурацию в RunDebug Configuration.

Добавляем удаленный интерпретатор:
Настройки — Languages & Frameworks — PHP
Запускаем PHPUnit тесты для проекта на 1С-Битрикс - 2

Добавляем удаленный интерпретатор
Запускаем PHPUnit тесты для проекта на 1С-Битрикс - 3

В появившихся настройках я выбирал «SSH Credentials» и вводил доступ к серверу с описанными в начале поста правами.

Далее идем в Настройки — Languages & Frameworks — PHP — PHPUnit. Там нажимаем на "+" и выбириаем «By Remote Interpreter». Выбираем только что добавленный интерпретатор. В блоке PHPUnit Library выбираем «Use custom autoloader». В «Path to script» нужно указать файл autoloader.php, который создает Composer. А в блоке Test Runner указываем путь к /local/tests/phpunit.xml.dist
Запускаем PHPUnit тесты для проекта на 1С-Битрикс - 4

Следующим шагом будет создание PHPUnit конфигурации в:
Запускаем PHPUnit тесты для проекта на 1С-Битрикс - 5
В появившемся окне важно добавить обычный PHPUnit а не PHPUnit on Server. В его настройках в блоке Test Runner нужно выбрать «Defined in the configuration file»

Это собственно и вся настройка. Теперь при нажатии на зеленую кнопку-стрелку «Run» должна появиться подобная область:
Запускаем PHPUnit тесты для проекта на 1С-Битрикс - 6

Теперь вспоминаем про требование запускать тесты на тестовой удаленной площадке, локальной и боевой. Эта задача, как описанно в статье официальной документации, приведенной выше, решается добавлением нужных интерпретаторов и настройек PHPUnit к ним. Затем в настройках проекта изменяется интерпретатор и та же зеленая стрелочка «Run» запустит те же тесты, но на другом сервере (удобно смотреть «ничего ли не поломалсь» после переноса проекта).

The fact that running PHPUnit tests over SSH on a remote machine with PhpStorm does not require a special Run/Debug configuration means that we can easily switch where unit tests are run. By switching the project's PHP interpreter through Project Settings | PHP, we can run PHPUnit tests either local or remote without having to reconfigure anything else.

Буду рад услышать замечания или рекомендации в комментариях, так как по юнит-тестированию Битрикса материалов мало и вполне возможно, что есть более красивый способ. Спасибо и удачи в тестировании!

UPD: Спасибо BusteR27, который подсказал как можно правильно обойти авторизацию. На GitHub обновлен файл bootstrap.php

Автор: rodion_arr

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js