Давайте посмотрим на архитектуру Codeception. Будем считать, что Codeception уже установлен и наборы тестов инициализированы. Codeception генерирует три стандартных набора для следующих категорий тестов: модульных (unit), функциональных (functional), и приемочных (acceptance). Все они были описаны в предыдущей статье. Внутри каталога /tests мы имеем три конфигурационных файла и три каталога с названиями, соответствующими наборам. "Наборы тестов" (suites) - это независимые группы тестов, объединенные общей целью.
Основной концепцией 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.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:ceptsuite filename - Генерировать Cept сценарий.generate:cestsuite filename - Генерировать Cest тест.generate:testsuite filename - Генерировать PHPUnit Test c Codeception хуками.generate:phpunitsuite filename - Генерировать классический PHPUnit Test.generate:suitesuite guy - Генерировать новый набор тестов с указанным Guy-классом.generate:scenariossuite - Генерировать текстовый файл, содержащий сценарии из тестов.
Мы рассмотрели структуру Codeception. Бóльшая часть вещей, которые Вам понадобятся, уже сгенерированы командой bootstrap. После того, как Вы рассмотрели базовые понятия и конфигурацию, Вы можете приступить к написанию своего первого сценария.
Трудились и переводили ребята из amyLabs