Здравствуйте коллеги,
В этом посте хочу показать свой способ запуска юнит-тестов на битрикс-проектах. При юнит-тестировании таких проектов существует известная проблема инициализации ядра системы. Ниже я покажу как мне удалось ее решить.
Сразу стоит отметить, что задача стояла запускать тесты как локально, где ведется разработка, так и удаленно на тест-прод и прод площадках проектов. А так же, для удаленного запуска тестов обязательно потребуется ssh доступ к серверу с правами к /usr/bin/php
или где там у вас установлен интерпретатор PHP на сервере.
Далее следует что-то в роде пошаговой инструкции:
Установка и настройка PHPUnit
PHPUnit устанавливается в проект как dependency через Composer.
Файл /local/composer/composer.json
{
"require-dev": {
"phpunit/phpunit": "4.5.*"
}
}
Далее в папочку /local/tests/ складывается xml-файл конфигурации PHPUnit, бутстрап и файл инициализации ядра Битрикс:
Теперь подробно по содержимому файлов.
Файл /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
Добавляем удаленный интерпретатор
В появившихся настройках я выбирал «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 конфигурации в:
В появившемся окне важно добавить обычный PHPUnit а не PHPUnit on Server. В его настройках в блоке Test Runner нужно выбрать «Defined in the configuration file»
Это собственно и вся настройка. Теперь при нажатии на зеленую кнопку-стрелку «Run» должна появиться подобная область:
Теперь вспоминаем про требование запускать тесты на тестовой удаленной площадке, локальной и боевой. Эта задача, как описанно в статье официальной документации, приведенной выше, решается добавлением нужных интерпретаторов и настройек 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