Начнем!

Давайте посмотрим на архитектуру 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