Начало работы
Давайте рассмотрим архитектуру Codeception. Мы предполагаем, что вы уже установили её и запустили свои первые наборы тестов. Codeception сгенерировал три из них: unit, functional и acceptance. Они подробно описаны в предыдущей главе. Внутри папки /tests у вас будут три .yml файла конфигурации и три директории с названиями, соответствующими этим наборам: unit, functional, acceptance. Наборы — это независимые группы тестов с общей целью.
Синтаксис Codeception
Codeception использует простые правила именования, чтобы сделать названия методов лёгкими для запоминания (и понимания).
- Действия начинаются с глагола на английском языке, например, «click» или «fill». Примеры:
<?php
$I->click('Login');
$I->fillField('#input-username', 'John Dough');
$I->pressKey('#input-remarks', 'foo');
- Ассершены всегда начинаются с «see» или «dontSee». Примеры:
<?php
$I->see('Welcome');
$I->seeInTitle('My Company');
$I->seeElement('nav');
$I->dontSeeElement('#error-message');
$I->dontSeeInPageSource('<section class="foo">');
- Сборщики данных извлекают информацию. Возвращаемое значение этих методов предназначено для сохранения в переменных и последующего использования. Пример:
<?php
$method = $I->grabAttributeFrom('#login-form', 'method');
$I->assertEquals('post', $method);
Актеры
Одним из основных понятий Codeception является представление тестов как действий человека. У нас есть UnitTester, который выполняет функции и тестирует код. У нас также есть FunctionalTester, квалифицированный тестировщик, который тестирует приложение в целом, зная его внутренности. Наконец, у нас есть AcceptanceTester, пользователь, который взаимодействует с нашим приложением через предоставленный нами интерфейс.
Методы классов актеров обычно берутся из модулей Codeception. Каждый модуль предоставляет предварительно определённые действия для различных целей тестирования, и их можно комбинировать, чтобы они соответствовали среде тестирования. Codeception пытается решить 90% возможных проблем тестирования в своих модулях, поэтому вам не нужно изобретать велосипед. Мы считаем, что вы можете тратить больше времени на написание тестов и меньше на написание вспомогательного кода для их выполнения. По умолчанию AcceptanceTester полагается на модуль PhpBrowser, который задан в файле конфигурации tests/acceptance.suite.yml:
actor: AcceptanceTester
modules:
enabled:
- PhpBrowser:
url: http://localhost/myapp/
- \Helper\Acceptance В этом файле конфигурации вы можете включать/отключать и перенастраивать модули для своих нужд. При изменении конфигурации классы актеров автоматически перестраиваются. Если классы актеров не создаются или не обновляются так, как вы ожидаете, попробуйте сгенерировать их вручную с помощью команды build:
php vendor/bin/codecept build
Написание образцового теста
Codeception имеет собственный формат тестирования под названием Cest (Codecept + Test). Чтобы начать написание теста, нам нужно создать новый файл Cest. Мы можем сделать это, выполнив следующую команду:
php vendor/bin/codecept generate:cest acceptance Signin
Это сгенерирует SigninCest.php файл внутри tests/acceptance директории. Давайте откроем его:
<?php
class SigninCest
{
function _before(AcceptanceTester $I)
{
}
public function _after(AcceptanceTester $I)
{
}
public function tryToTest(AcceptanceTester $I)
{
// todo: write test
}
} У нас есть _before и _after методы для выполнения некоторых общих действий до и после теста. И у нас есть заполнитель действия tryToTest, который нам нужно реализовать. Если мы пытаемся протестировать процесс входа в систему, неплохо начать с тестирования успешного входа. Давайте переименуем этот метод в signInSuccessfully.
Предположим, у нас есть страница «login», где мы авторизуемся, указав имя пользователя и пароль. Затем нас отправляют на страницу пользователя, где мы видим текст Hello, %username%. Давайте посмотрим, как этот сценарий записывается в Codeception:
<?php
class SigninCest
{
public function signInSuccessfully(AcceptanceTester $I)
{
$I->amOnPage('/login');
$I->fillField('Username','davert');
$I->fillField('Password','qwerty');
$I->click('Login');
$I->see('Hello, davert');
}
} Этот сценарий, вероятно, может быть понятен и нетехническим пользователям. Если вы просто удалите все специальные символы, такие как фигурные скобки, стрелки и $, этот тест преобразуется в обычный текст на английском языке:
I amOnPage '/login' I fillField 'Username','davert' I fillField 'Password','qwerty' I click 'Login' I see 'Hello, davert'
Codeception генерирует это текстовое представление из PHP-кода, выполняя:
php vendor/bin/codecept generate:scenarios
Эти сгенерированные сценарии будут храниться в вашей папке _data в текстовых файлах.
Прежде чем выполнить этот тест, мы должны убедиться, что веб-сайт работает на локальном веб-сервере. Давайте откроем файл tests/acceptance.suite.yml и заменим URL на URL вашего веб-приложения:
actor: AcceptanceTester
modules:
enabled:
- PhpBrowser:
url: 'http://myappurl.local'
- \Helper\Acceptance После настройки URL мы можем запустить этот тест с помощью команды run:
php vendor/bin/codecept run
Вот что мы должны увидеть в выводе:
Acceptance Tests (1) ------------------------------- ✔ SigninCest: sign in successfully ---------------------------------------------------- Time: 1 second, Memory: 21.00Mb OK (1 test, 1 assertions)
Давайте получим более подробный вывод:
php vendor/bin/codecept run acceptance --steps
Мы должны увидеть пошаговый отчёт о выполненных действиях:
Acceptance Tests (1) ------------------------------- SigninCest: Login to website Signature: SigninCest.php:signInSuccessfully Test: tests/acceptance/SigninCest.php:signInSuccessfully 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)
Этот простой тест можно расширить до полного сценария использования сайта, поэтому, имитируя действия пользователя, вы можете протестировать любой из ваших веб-сайтов.
Чтобы запустить больше тестов, создайте для каждого из них публичный метод. Включите объект AcceptanceTester как $I в качестве параметра метода и используйте ту же API $I->, что и раньше. Если тесты имеют общие действия настройки, поместите их в метод _before.
Например, чтобы протестировать CRUD, нам нужно реализовать 4 метода, и все последующие тесты должны начинаться на странице /task:
<?php
class TaskCrudCest
{
function _before(AcceptanceTester $I)
{
// will be executed at the beginning of each test
$I->amOnPage('/task');
}
function createTask(AcceptanceTester $I)
{
// todo: write test
}
function viewTask(AcceptanceTester $I)
{
// todo: write test
}
function updateTask(AcceptanceTester $I)
{
// todo: write test
}
function deleteTask(AcceptanceTester $I)
{
// todo: write test
}
} Узнайте больше о формате Cest в разделе «Расширенное тестирование».
Интерактивная пауза
Трудно написать полный тест сразу. Вам нужно будет попробовать разные команды с разными аргументами, прежде чем вы найдёте правильный путь.
С Codeception 3.0 вы можете приостановить выполнение в любой момент и войти в интерактивную оболочку, где сможете попробовать различные команды в действии. Всё, что вам нужно сделать, это вызвать $I->pause() где-нибудь в вашем тесте, а затем запустить тест в режиме отладки.
Интерактивная пауза требует hoa/console, которая не устанавливается по умолчанию. Чтобы установить её, выполните:
php composer.phar require --dev hoa/console
<?php // use pause inside a test: $I->pause();
Выполнение теста останавливается на этом этапе, и отображается консоль, где вы можете попробовать все доступные команды «в реальном времени». Это может быть очень полезно при написании функциональных, приемочных или API-тестов.

Внутри интерактивной паузы вы можете использовать весь потенциал PHP-интерпретатора: переменные, функции и т. д. Вы можете получить доступ к результату последней выполненной команды в переменной с именем $result.
В приемочных или функциональных тестах вы можете сохранять снимки экрана страниц или снимков HTML.
<?php // inside PhpBrowser, WebDriver, frameworks // saves current HTML and prints a path to created file $I->makeHtmlSnapshot(); // inside WebDriver // saves screenshot and prints a path to created file $I->makeScreenshot();
Чтобы попробовать команды без запуска ни одного теста, вы можете запустить интерактивную консоль:
$ php vendor/bin/codecept console suitename
Теперь вы можете выполнить все команды соответствующего класса Актера и сразу увидеть результаты.
BDD
Codeception позволяет выполнять пользовательские истории в формате Gherkin аналогично тому, как это делается в Cucumber или Behat. Обратитесь к главе по BDD, чтобы узнать больше.
Конфигурация
Codeception имеет глобальную конфигурацию в codeception.yml и конфигурацию для каждого набора. Мы также поддерживаем .dist файлы конфигурации. Если в проекте несколько разработчиков, поместите общие настройки в codeception.dist.yml, а личные настройки — в codeception.yml. То же самое относится к конфигурациям наборов. Например, конфигурация unit.suite.yml будет объединена с unit.suite.dist.yml.
Запуск тестов
Тесты можно запустить с помощью команды run:
php vendor/bin/codecept run
С первым аргументом вы можете запустить все тесты из одного набора:
php vendor/bin/codecept run acceptance
Чтобы ограничить запуск тестов одним классом, добавьте второй аргумент. Укажите локальный путь к классу теста из каталога набора:
php vendor/bin/codecept run acceptance SigninCest.php
В качестве альтернативы вы можете указать полный путь к файлу теста:
php vendor/bin/codecept run tests/acceptance/SigninCest.php
Вы можете ещё больше фильтровать, какие тесты запускать, добавив имя метода к классу, разделённому двоеточием (для форматов Cest или Test):
php vendor/bin/codecept run tests/acceptance/SigninCest.php:^anonymousLogin$
Вы также можете указать путь к каталогу. Это выполнит все приемочные тесты из каталога backend:
php vendor/bin/codecept run tests/acceptance/backend
Используя регулярные выражения, вы даже можете запустить несколько разных методов тестов из одного каталога или класса. Например, это выполнит все приемочные тесты из каталога backend начинающиеся со слова «login»:
php vendor/bin/codecept run tests/acceptance/backend:^login
Чтобы выполнить группу тестов, которые не хранятся в одном каталоге, вы можете организовать их в группы.
Отчёты
Для генерации XML-вывода JUnit вы можете указать опцию --xml, а для HTML-отчёта — --html.
php vendor/bin/codecept run --steps --xml --html
Эта команда выполнит все тесты для всех наборов, отобразит шаги и создаст HTML- и XML-отчёты. Отчёты будут сохранены в каталоге tests/_output/.
Чтобы увидеть все доступные параметры, выполните следующую команду:
php vendor/bin/codecept help run
Отладка
Чтобы получить подробный вывод, тесты можно выполнить с опцией --debug. Вы можете вывести любую информацию внутри теста с помощью функции codecept_debug.
Генераторы
Существует множество полезных команд Codeception:
-
generate:cestsuite filename — Генерирует пример теста Cest -
generate:testsuite filename — Генерирует пример теста PHPUnit с хуками Codeception -
generate:featuresuite filename — Генерирует файл Gherkin feature -
generate:suitesuite actor — Генерирует новый набор с заданным именем класса Актера -
generate:scenariossuite — Генерирует текстовые файлы, содержащие сценарии из тестов -
generate:helperfilename — Генерирует пример файла Helper -
generate:pageobjectsuite filename — Генерирует пример объекта Page -
generate:stepobjectsuite filename — Генерирует пример объекта Step -
generate:environmentenv — Генерирует пример конфигурации среды -
generate:groupobjectgroup — Генерирует пример расширения группы
Заключение
Мы рассмотрели структуру Codeception. Большая часть необходимых вам элементов уже была сгенерирована командой bootstrap. После изучения основных понятий и конфигураций вы можете начать писать свой первый сценарий.
- Следующая глава: Приемочные тесты >
- Предыдущая глава: < Введение
© 2011 Michael Bodnarchuk and contributors
Licensed under the MIT License.
https://codeception.com/docs/02-GettingStarted