В данное время покрываю тестами проект-долгострой на Yii2. Возможно кому-то пригодятся заметки.
На официальном сайте Codeception хорошо описаны основы и модули для Yii2. Там можно найти исчерпывающее руководство по функционалу и настройкам.
В документации Yii2 упоминается устаревший пакет yiisoft/yii2-codeception. Он уже практически нигде не используется и с 2018 года помечен как "deprecated". Вместо него используется codeception/module-yii2.
Настройка
- Входной скрипт - /web/index-test.php
load();
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
(new yii\web\Application(
require __DIR__ . '/../config/test.php'
))->run();
2. Конфигурация приложения - /config/test.php
[
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=' . env('MYSQL_TEST_HOST') . ';dbname=' . env('MYSQL_TEST_DATABASE'),
'username' => env('MYSQL_TEST_USER'),
'password' => env('MYSQL_TEST_PASSWORD'),
'charset' => 'utf8',
],
],
// ...
];
Для тестирования желательно создавать дополнительную базу данных или отдельный контейнер, если разработка происходит в окружении Докера.
3. Конфигурация приложения - /config/console.php
[
// ...
'fixture' => [
'class' => 'yii\faker\FixtureController',
],
// ...
],
// ...
];
4. Конфигурация запуска - /tests/_bootstrap.php
load();
define('YII_ENV', 'test');
defined('YII_DEBUG') or define('YII_DEBUG', true);
require_once __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
Настройки модульных, функциональных и приёмочных тестов также находятся в корне директории tests:
- /test/functional.suite.yml
- /test/unit.suite.yml
- /test/acceptance.suite.yml.example (по умолчанию приёмочные тесты не включены и добавлен только пример конфигурации);
Эти файлы в дополнительной настройке для начала работы не нуждаются.
Основные команды
Первичная настройка:
vendor/bin/codecept bootstrap
По умолчанию в шаблонах приложений Yii2 эта команда уже выполнена.
Генерация модулей для тестов:
vendor/bin/codecept build
Они появится в /tests/_support/_generated
Запуск тестов:
vendor/bin/codecept run
vendor/bin/codecept run unit
vendor/bin/codecept run unit --steps
vendor/bin/codecept run functional
vendor/bin/codecept run functional --steps
php vendor/bin/codecept run --steps --xml --html
Генерация тестов:
vendor/bin/codecept generate:cest functional MyTest
vendor/bin/codecept generate:test unit MyTest
Фикстуры
За генерацию фикстур отвечает yii\faker\FixtureController. Основные настройки:
- namespace - пространство имен по умолчанию;
- globalFixtures - глобальные фикстуры;
- templatePath - путь до директории шаблонов;
- fixtureDataPath - путь до директории выходных данных;
- language - язык на котором генерируются данные;
- count - количество записей.
Эти настройки можно указать в конфигурации приложений или при вызове команд генерации фикстур через параметры.
Пример конфигурации:
[
// ...
'fixture' => [
'class' => 'yii\faker\FixtureController',
'namespace' => 'app\tests\fixtures',
'globalFixtures' => [
'yii\test\InitDbFixture'
// ...
],
'templatePath' => '@tests/fixtures/templates',
'fixtureDataPath' => '@tests/fixtures/data',
'language' => 'ru_RU',
'count' => 10,
],
// ...
],
// ...
];
Пример фикстуры /tests/fixtures/UserFixture.php
Пример шаблона фикстуры /tests/fixtures/templates/users.php
User::ROLE_USER,
'status' => $faker->randomElement([
User::STATUS_NOT_ACTIVE,
User::STATUS_ACTIVE,
User::STATUS_LOCKED,
]),
'email' => $faker->email,
'password_hash' => Yii::$app->security->generatePasswordHash(123456),
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
Генерация фикстур:
php yii fixture/generate users
php yii fixture/generate users --count=20
php yii fixture/generate users --count=20 --language=ru_RU
php yii fixture/generate users --templatePath=@tests/fixtures/templates
php yii fixture/generate users --fixtureDataPath=@tests/fixtures/data
Работать с фикстурами можно двумя способами, через консольные команды и код.
Консольные команды:
ВНИМАНИЕ! Перед работой с фикстурами для тестов перейдите в соответствующую директорию бинарников. Иначе будет затронута текущая база вместо тестовой.
cd /app/tests/bin
# загрузка данных в базу
php yii fixture User
php yii fixture/load User
php yii fixture/load "User, Product"
php yii fixture/load "*, -Product"
php yii fixture/load "*"
# удаление данных из базы
php yii fixture/unload User
php yii fixture/unload "User, Product"
php yii fixture/unload "*, -Product"
php yii fixture/unload "*"
Через код так:
[
'class' => UserFixture::class,
'dataFile' => '@app/tests/fixtures/data/random_users.php'
]
];
}
}
Или так:
tester->haveFixtures([
'user' => [
'class' => UserFixture::class,
'dataFile' => '@app/tests/fixtures/data/random_users.php'
]
]);
// или по одной
$this->tester->haveRecord(User::class, [
'role' => User::ROLE_USER,
'status' => User::STATUS_ACTIVE,
'email' => 'user2@test.com',
'password_hash' => \Yii::$app->security->generatePasswordHash(123456),
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
}
}
Все остальные примеры находятся в документации.
Полезные ссылки
- codeception.com/for/yii - документация по codeception для Yii2.
- codeception.com/docs/modules/Yii2 - модули codeception для Yii2.
- github.com/yiisoft/yii2-codeception - устаревшая библиотека.
- github.com/yiisoft/yii2/blob/master/docs/guide-ru/test-fixtures.md - документация по фикстурам.
- bologer.ru/yii2-basic-pishem-i-zapuskaem-testy-s-codeception/ - Yii2 basic: Пишем и запускаем тесты с Codeception.
- runebook.dev/ru/docs/yii/yii-faker-fixturecontroller - еще про фикстуры.
- yiiframework.com/doc/api/2.0/yii-test-initdbfixture
Комментарии (0)