Skip to content

Instantly share code, notes, and snippets.

@morozVA
Created April 8, 2020 14:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save morozVA/afda988bc6d03d5c5fff4a11002d9580 to your computer and use it in GitHub Desktop.
Save morozVA/afda988bc6d03d5c5fff4a11002d9580 to your computer and use it in GitHub Desktop.
настройка тестов
Создание модульных и интеграционных тестов
Создано и настроено окружение для использования Codeception как надстройки над PhpUnit, теперь мы можем писать тесты (не только модульные на чистом PhpUnit, но и интеграционные, требующие запущенного приложения), а ещё получать статистику по тому, какой процент кода у нас покрыт этими самыми тестами.
Команды:
vendor/bin/codecept run - запустить все тесты
vendor/bin/codecept run unit --coverage-html='coverage' - сформировать отчёт по степени покрытия кода тестами
Контроллеры тонкие, их тестировать не нужно, да и нет возможности, потому что тесты запускаются в консоли, а там нет: веб-сервера, урла, сессий, куков и т.п. Проект запускается как консольное приложение. Так что всё сошлось.
Для тестирования сложных вещей есть практика применений фикстур - тестового набора данных. С помощью инструмента Faker создал шаблоны генерации фикстур:
/tests/fixtures/data/label.php (он опирается на правила валидации формы LabelForm)
/tests/fixtures/data/product.php (для тестирования связей)
/tests/fixtures/data/product_label.php (для тестирования связей)
Команда для генерации, например:
php yii_test fixture/generate-all --interactive=0 --count=100
Результат (создаются файлы с тестовым набором данных):
БД
Для работы тестов требуется база данных с актуальной схемой, а также должна быть добавлена функция getAppTestDatabaseConfig() в конфиг dynamic.config с данными для подключениями с ним.
Откуда ей браться и как мы автоматизируем запуск тестов - это нужно решить. Вероятно, каким-то скриптом должна актуализироваться.
Настройка окружения для тестов
ActiveRecord создана по принципу "db first", поэтому отвязаться от БД очень сложно.
Значит:
0. Выполняем команду ./vendor/bin/codecept bootstrap
1. Создаём тестовую БД с актуальной структурой таблиц
2. Добавляем в dynamic.php новые доступы к этой БД
3. Создаём конфиг test.php на основе console.php, но с доступами из п.2
4. Прописываем этот конфиг в codeception.yml
Теперь можно тестировать AR-сущности и т.п.
Тесты кладём в директорию ./tests/unit/, воссоздав там структуру vigbo-cms.
Запуск:
vendor/bin/codecept run
Может понадобиться тестовый набор данных в БД, тут 2 варианта:
1. Доверить это codeception'у, дав ему: дамп, dsn+доступы к БД
2. Доверить это Yii2, у которого доступы уже есть, но нет дампа
2.1 Создать миграции с нужными данными
2.2 Сгенерировать эти данные
Я пошёл по пути 2.2, а значит нам нужны фикстуры, т.е. тестовые наборы данных.
Их можно создать самому, а можно сгенерировать. Создавать самому лениво.
Поэтому берём Faker. Поехали:
0. Добавляем в ./tests/unit.suite.yml part "fixtures"
1. Выполняем на всякий случай команду vendor/bin/codecept build
2. Создаём директорию ./tests/fixtures/, а в ней ещё data/ и templates/
3. В конфиг test.php дописываем альяс @tests и controllerMap fixture с путями
4. В ./tests/fixtures/ создаём классы фикстур и их шаблоны на основе Faker'а
5. Создаём рядом с yii скрипт yii_test, который будет отличаться конфигом - test.php
6. Генерируем фикстуры: yii_test fixture/generate-all --interactive=0 --count=100
Готово, теперь при запуске тестов в БД будут записываться сгенерированные данные.
Опцией clean в codeception.yml можно попросить очищать их потом за собой.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment