Настройка фреймворка Kahlan для Yii2
2021-09-30 21:20:21
Kahlan - современный фреймворк для написания тестов на php. Его особенности - BDD подход и describe-it синтаксис. Создатели вдохновлялись библиотекой, написанной на Ruby под названием RSpec. В этой статье мы разберемся как подружить Kahlan с фреймворком Yii2.
Для того, чтобы Yii2 фреймворк работал в рамках автоматических тестов - нужно создать некий файл начальной загрузки, в котором нужно подгрузить конфигурационные файлы и создать экземпляр приложения Yii.
Создание bootstrap файла
Дня начала нужно создать файл, код из которого Kahlan выполнит перед запуском тестов. Сами тесты по умолчанию должны лежать в папке spec. Создадим файл bootstrap.php в папке spec.
Для того, чтобы Kahlan выполнил этот код нужно запустить тесты с параметром, то есть тесты должны запускаться следующим образом:
vendor/bin/kahlan --config=spec/bootstrap.php
Настройки Kahlan в bootstrap файле.
В самом фреймфорке есть функция expect в корневом пространстве имен, которая будет конфликтовать с одноименной функцией из codeception (этот фреймфорк для тестов используется в Yii2 по умолчанию). Поэтому нужно определить константу KAHLAN_DISABLE_FUNCTIONS со значением true. Если этого не сделать - при запуске Kahlan тестов мы получим ошибку:
The Kahlan global function `expect()`s can't be created because of some naming collisions with another library.
Поэтому добавляем в bootstrap.php строчку define('KAHLAN_DISABLE_FUNCTIONS', true);
.
В самих тестах придется использовать use с пространством имен для каждой функции Kahlan:
<?php
use function kahlan\describe;
use function kahlan\it;
use function kahlan\expect;
use function kahlan\context;
describe("...", function() {
context("...", function () {
it("...", function () {
expect('someValue')->toBe('someValue');
});
});
});
Конфигурация и создания экземпляра приложения Yii2 в bootstrap файле
За основу следует взять содержимое файла yii_test, который находится в корневой папке приложения. Скопируйте код из него в spec/bootstrap.php
и скорректируйте по необходимости. Корректировки могут касаться конфигурационных файлов приложения Yii2. Убедитесь, что все нужные конфиг файлы подключены и их содержимое верное.
И в заключении стоит удалить строчки $exitCode = $application->run();
и exit($exitCode);
, так как нам не нужно запускать приложение и возвращать exit code.
В итоге наш bootstrap файл будет выглядеть следующим образом:
<?php
define('KAHLAN_DISABLE_FUNCTIONS', true);
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
require __DIR__ . '/../common/config/bootstrap.php';
require __DIR__ . '/../console/config/bootstrap.php';
$config = yii\helpers\ArrayHelper::merge(
require __DIR__ . '/../common/config/main.php',
require __DIR__ . '/../common/config/main-local.php',
require __DIR__ . '/../common/config/test.php',
require __DIR__ . '/../common/config/test-local.php',
require __DIR__ . '/../console/config/main.php',
require __DIR__ . '/../console/config/main-local.php',
require __DIR__ . '/../console/config/test.php',
require __DIR__ . '/../console/config/test-local.php'
);
$application = new yii\console\Application($config);
Теперь следует создать какой-нибудь Unit тест и попробовать обратиться к экземпляру Yii приложения или попробовать выгрузить из БД какие-то данные с помощью Active Record.
Запускаем тесты с помощью команды:
vendor/bin/kahlan --config=spec/bootstrap.php
Я для удобство создаю script в composer.json:
"scripts": {
"test": "./vendor/bin/kahlan --config=spec/bootstrap.php"
}
И запускаю следующей командой:
composer test