Настройка фреймворка 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