Начнем!
Давайте посмотрим на архитектуру Codeception. Будем считать, что Codeception уже установлен и наборы тестов инициализированы. Codeception генерирует три стандартных набора для следующих категорий тестов: модульных (unit), функциональных (functional), и приемочных (acceptance). Все они были описаны в предыдущей статье. Внутри каталога /tests
мы имеем три конфигурационных файла и три каталога с названиями, соответствующими наборам. "Наборы тестов" (suites) - это независимые группы тестов, объединенные общей целью.
"Актеры"/Actors ( или Парни/Guys до версии 2.0)
Основной концепцией Codeception является представление тестов как действий человека. По умолчанию мы называем этого человека "парнем" (Guy), но можно дать ему любое название при инициализации проекта. У нас есть CodeGuy, который выполняет функции/методы и тестирует код. Также у нас есть TestGuy - опытный тестировщик, который тестирует приложение целиком и знает кое-что о его внутреннем устройстве. Еще есть WebGuy, пользователь, который работает с нашим приложением через web-интерфейс, который мы ему предоставляем.
Каждый из этих "парней" имеет различные способности и представляет из себя PHP класс с набором действий, которые он может совершать. Способности "парней" не постоянны и Вы можете расширять их, а также, можете создавать новых "парней", но запомните: один "парень" на один набор тестов.
Классы "парней" не нужно писать с нуля, так как их можно просто сгенерировать следующей командой:
$ php codecept.phar build
Классы "парней" генерируются на основании файла конфигурации для набора тестов (suite). Когда Вы меняете конфигурацию - файлы перегенерируются автоматически.
Напишем простой сценарий
По умолчанию тесты пишутся в виде последовательных сценариев. Чтобы PHP-файл стал корректным сценарием, его имя должно содержать суффикс "Cept".
Предположим, что мы хотим создать файл tests/acceptance/SigninCept.php
Это можно сделать следующей командой:
$ php codecept.phar generate:cept acceptance Signin
<?php
$I = new WebGuy($scenario);
?>
Сценарий всегда начинается с инициализации класса нашего "парня". После этого написание сценария сводится к написанию $I->
и выбору соответствующего действия из списка авто-дополнения.
Давайте авторизуемся на нашем сайте. Мы предполагаем, что у нас есть страница "login", на которой для авторизации необходимо ввести логин и пароль. После авторизации мы перекидываем пользователя на страницу, где он видит текст Hello, %username%
. Давайте разберемся как написать этот сценарий, используя Codeception.
<?php
$I = new WebGuy($scenario);
$I->wantTo('log in as regular user');
$I->amOnPage('/login');
$I->fillField('Username','davert');
$I->fillField('Password','qwerty');
$I->click('Login');
$I->see('Hello, davert');
?>
Прежде чем запустить тест, мы должны убедиться, что сайт работает на локальном веб-сервере. Откройте tests/acceptance.suite.yml
и замените URL на URL Вашего приложения:
config:
PhpBrowser:
url: 'http://myappurl.local'
Если у Вас нет запущенного веб-сервера Вы можете использовать PHP Built-in Web Server который доступен, начиная с версии PHP 5.4
После того как Вы установили корректный URL, можно запустить тест, используя следующую команду:
$ php codecept.phar run
Вот, что мы должны увидеть на выходе:
Suite acceptance started
Trying log in as regular user (SigninCept.php) - Ok
Suite functional started
Suite unit started
Time: 1 second, Memory: 21.00Mb
OK (1 test, 1 assertions)
Давайте посмотрим более детальный вывод:
$ php codecept.phar run acceptance --steps
Мы должны увидеть шаг за шагом последовательность выполняемых действий:
Suite acceptance started
Trying to log in as regular user (SigninCept.php)
Scenario:
* I am on page "/login"
* I fill field "Username" "davert"
* I fill field "Password" "qwerty"
* I click "Login"
* I see "Hello, davert"
OK
Time: 0 seconds, Memory: 21.00Mb
OK (1 test, 1 assertions)
Это очень простой сценарий, который Вы можете воспроизвести для своего собственного сайта. Эмулируя действия пользователя, можно протестировать весь Ваш сайт подобным образом.
Просто попробуйте!
Модули и хелперы
Все действия в Guy-классе берутся из модулей. Команда "build", описанная выше, позволяет Codeception эмулировать множественное наследование. Модули спроектированы так, чтобы выполнять только одно действие на каждый метод. В соответствии с DRY principle, если Вы используете одни и те же компоненты в различных модулях - их можно объединить и поместить в свой собственный модуль. По умолчанию каждый набор тестов содержит пустой модуль, который может быть использован для расширения Guy-класса. Они расположены в директории "_helpers".
Bootstrap
Каждый набор тестов имеет свой собственный стартовый (bootstrap) файл. Он расположен в директории, содержащей набор тестов и называется_bootstrap.php
. Этот файл исполняется перед каждым тестом из соответствующего набора. Любые подготовительные операции для набора тестов следует писать именно в этом файле.
Форматы тестов
Codeception поддерживает три формата тестов. Помимо уже описанных тестов в Cept формате, Codeception также может выполнять PHPUnit-тесты для модульного тестирования и смешанные (scenario-unit) тесты в формате "Cest". Они будут описаны в следующих статьях. Нет никакой разницы в том, какой формат теста будет запущен в наборе (suite).
Конфигурация
Codeception имеет глобальный файл конфигурации codeception.yml
и отдельный конфигурационный файл для каждого набора тестов. Также поддерживаются конфигурационные файлы .dist
. Если у Вас в проекте несколько разработчиков - разместите общие параметры конфигрурации в файле codeception.dist.yml
, а индивидуальные настройки каждого разработчика в файле codeception.yml
. Такой подход справедлив и для конфигураций наборов тестов. Например, файл unit.suite.yml
будет объединен с файлом unit.suite.dist.yml
.
Запуск тестов
Тесты могут быть запущены командой 'run':
$ php codecept.phar run
Если передать один аргумент - можно запустить тесты только из указанного набора:
$ php codecept.phar run acceptance
Чтобы запустить только один тест - передайте второй аргумент. Указывайте локальный путь, начиная от директории с набором тестов:
$ php codecept.phar run acceptance SigninCept.php
Вы также можете указать полный путь до теста:
$ php codecept.phar run tests/acceptance/SigninCept.php
Можно указать путь до каталога с тестами:
php codecept.phar run tests/acceptance/backend
Эта команда запустит все тесты из каталога backend
Для запуска группы тестов, которые хранятся в разных каталогах можно организовать их в группы.
Отчеты
Для генерации отчета в формате JUnit XML - запустите тесты с опцией --xml или с опцией --html для генерации HTML отчета
Пример:
$ php codecept.phar run --steps --xml --html
Эта команда запустит все тесты из всех тестовых наборов, все шаги будут выводиться в консоль, результаты тестов будут сохранены в HTML и XML файлах-отчетах в директории tests/_log/
Чтобы увидеть все доступные опции - запустите команду help:
$ php codecept.phar help run
Отладка
Для получения более детальной информации запустите тесты с опцией --debug
В тестах можно выводить любую отладочную информацию с помощью функции codecept_debug
Генераторы
Codeception имеет множество полезных команд для генерации всего и вся:
-
generate:cept
suite filename - Генерировать Cept сценарий. -
generate:cest
suite filename - Генерировать Cest тест. -
generate:test
suite filename - Генерировать PHPUnit Test c Codeception хуками. -
generate:phpunit
suite filename - Генерировать классический PHPUnit Test. -
generate:suite
suite guy - Генерировать новый набор тестов с указанным Guy-классом. -
generate:scenarios
suite - Генерировать текстовый файл, содержащий сценарии из тестов.
Заключение
Мы рассмотрели структуру Codeception. Бóльшая часть вещей, которые Вам понадобятся, уже сгенерированы командой bootstrap
. После того, как Вы рассмотрели базовые понятия и конфигурацию, Вы можете приступить к написанию своего первого сценария.
Трудились и переводили ребята из amyLabs
No Comments