Тестирование PHP-приложений с помощью Codeception
Обычно, новые возможности веб-приложений тестируются путем открытия соответствующей страницы в браузере, на которой, возможно, нужно заполнить некоторые поля и отправить форму, после чего разработчики или тестеры могут увидеть, каким получается результат.
Это вполне логичный способ тестирования, применяемый многими веб-разработчиками. Однако, можно так же естественно оптимизировать и улучшить этот процесс, используя инструмент под названием Codeception.
Что такое Codeception?
Codeception это многофункциональный фреймворк для тестирования PHP-приложений. Он может выполнять комплексное тестирование, а также тестирование отдельных элементов веб-приложений.
Рассматриваемый инструмент создан на основе уже известного фреймворка для тестирования - PHPUnit.
Codeception позволяет тестировать различные варианты поведения посетителя сайта. Таким образом, можно симулировать поведение реального посетителя, который взаимодействует с элементами интерфейса, чтобы убедиться в правильной работе приложения в различных случаях.
Установка и настройка
Начнем с создания папки для хранения приложения, которое будет тестироваться с помощью Codeception:
cd Sites
mkdir codeceptionЯ уже создал небольшой пример в HTML- и PHP-файлах, которые мы можем использовать для тестирования.
Вы можете просто скопировать и вставить код, представленный ниже. Начнем с файла toupper.html:
# codeception/toupper.html
<!DOCTYPE html>
<html>
<head>
<title> Конвертируй меня!</title>
</head>
<body>
<h1>Конвертируй меня!</h1>
<form action="toupper.php" method="post">
<label for="string">Конвертируй меня в верхний регистр:</label>
<input type="text" name="string" id="string">
<input type="submit" value="Конвертировать">
</form>
</body>
</html>Эта HTML-страница отображает форму, позволяющую пользователю ввести строку текста и конвертировать ее в строчные буквы с помощью PHP.
Далее, создадим PHP-файл, который будет обрабатывать данные формы:
# codeception/toupper.php
<?php
$message = "Ничего не введено";
if (!empty($_POST['string'])) {
$message = "Строка сконвертирована: " . strtoupper($_POST['string']);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>В верхний регистр!</title>
</head>
<body>
<h1> В верхний регистр!</h1>
<p><?php echo $message; ?></p>
<p><a href="toupper.html">Назад к форме</a>.</p>
</body>
</html>Эта страница создает переменную $message для хранения стандартного сообщения. Затем, мы можем проверить, отправлена ли форма. Если да, то заменяем стандартное сообщение строкой, сконвертированной в заглавные буквы.
Далее, мы выводим сообщение, а также ссылку для возврата к форме, внизу страницы.
Это очень простое PHP-приложение, но оно позволит нам ознакомиться с возможностями Codeception.
Теперь, давайте скачаем и установим Codeception. К счастью, это очень просто. Для этого, можно пойти разными путями: использовать Composer, Git или Phar.
Я предпочитаю Composer, так что давайте создадим файл composer.json в корне папки с примером нашего веб-приложения:
cd codeception
touch composer.jsonДалее, откроем файл composer.json в текстовом редакторе и добавим следующие строки:
{
"require": {
"codeception/codeception": "*"
}
}Затем, запустим composer в терминале:
composer updateПосле этого, выполните команду:
./vendor/bin/codecept bootstrapВ результате её выполнения в директории нашего тестового приложения создадутся папки tests и vendor.
Далее, нужно сделать наши URL-адреса локальными в файле tests/acceptance.suite.yml:
class_name: WebGuy
modules:
enabled:
- PhpBrowser
- WebHelper
config:
PhpBrowser:
url: 'http://localhost/codeception/'Наконец, все установлено и готово к тестированию.
Тестирование приложения
Обычное тестирование позволяет проверить поведение приложения через обычный просмотр страниц сайта. Нужно просто заполнить форму и отослать ее, а затем проанализировать полученный результат.
В случае с Codeception, разница в том, что нам не нужно тратить время на эти действия для каждого нового функционального элемента, а вместо этого, мы можем просто запустить автоматический тест и увидеть, пройден он или нет.
Генерация тестов
Итак, нам нужен файл, в который мы будем записывать тесты. Codeception дает возможность сделать это очень просто, используя генератор скриптов codecept.
Давайте создадим тест для нашего приложения Toupper:
./vendor/bin/codecept generate:cept acceptance ToupperС помощью вышеприведенной команды, мы сгенерировали тест с именем Toupper (на самом деле, после генерации, файл будет называться ToupperCept.php).
Написание теста
При использовании Codeception вы, фактически, имеете в своем распоряжении энное количество виртуальных посетителей с различным поведением, которые называются «Guys»: CodeGuy, TestGuy и WebGuy.
Для тестирования мы будем использовать WebGuy. Давайте откроем файл ToupperCept.php и начнем создание нового WebGuy, который будет использовать наши тесты:
$I = new WebGuy($scenario);Мы создали новый объект WebGuy, хранящийся в переменной $I. Теперь, мы можем использовать этот объект для тестирования различных частей нашей страницы, чтобы убедиться, что все работает корректно.
Далее, нам нужно убедиться, что наша страница Toupper загружается первой, а затем запускается сам тест:
$I = new WebGuy($scenario);
$I->wantTo('Хочу убедиться, что форма скрипта Toupper работает корректно');
$I->amOnPage('toupper.html');
$I->see('Конвертируй меня!');В примере выше, мы используем объект $I, чтобы вызвать несколько методов для запуска теста. Мы начинаем с алгоритма. В нашем случае, мы хотим проверить работоспособность формы скрипта Toupper, используя метод wantTo.
Затем, мы используем метод amOnPage, чтобы удостовериться, что находимся на нужной странице - toupper.html. Наконец, мы вызываем метод see, чтобы убедиться, что текст: «Конвертируй меня!» отображен на странице.
Запуск теста
Теперь, имея рабочий тест, выполним следующую команду:
./vendor/bin/codecept runЭта команда запустит все тесты. В консоли вы увидите вывод, показывающий, что тест пройден успешно:

Если вы хотите запустить только тест типа acceptance, то следует использовать команду:
./vendor/bin/codecept run acceptanceВ дополнение, вы можете просмотреть полный список выполняемых действий, используя флаг --steps:
./vendor/bin/codecept run acceptance --stepsВот так будет выглядеть ваша консоль после выполнения данной команды:

Тестирование форм
Давайте посмотрим, как мы можем использовать Codeception для тестирования функциональности нашей формы.
Добавим следующие строки к нашему файлу ToupperCept.php:
$I = new WebGuy($scenario);
$I->wantTo('Хочу убедиться, что форма скрипта Toupper работает корректно');
$I->amOnPage('toupper.html');
$I->see('Конвертируй меня!');
$I->fillField('string', "Конвертируй меня в верхний регистр");
$I->click('Конвертировать');
$I->amOnPage('toupper.php');
$I->see('В верхний регистр!');В данном коде, мы просто продолжаем с места, где остановились. После того, как мы удостоверились, что находимся на нужной странице, заполняем форму, используя метод fillField, передавая ему значения name и value этой формы, и затем нажимаем кнопку «Конвертировать».
Затем, проверяем, находимся ли мы на странице toupper.php, для чего проверяем содержимое заголовка.
Теперь запустим наш тест снова:
./vendor/bin/codecept runВаша консоль будет выглядеть так, как показано на изображении ниже, подтверждая, что тест пройден успешно:

Тестирование ссылок
Наконец, давайте протестируем ссылку на странице toupper.php, чтобы убедиться, что она ведет нас назад на главную страницу:
$I = new WebGuy($scenario);
$I->wantTo('Хочу убедиться, что форма скрипта Toupper работает корректно');
$I->amOnPage('toupper.html');
$I->see('Конвертируй меня!');
$I->fillField('string', "Конвертируй меня в верхний регистр ");
$I->click('Конвертировать');
$I->amOnPage('toupper.php');
$I->see('В верхний регистр!');
$I->amOnPage('toupper.php');
$I->see('В верхний регистр!');
$I->click('Назад к форме');
$I->see('Конвертируй меня!');Здесь мы вновь, вызываем метод click, чтобы кликнуть на ссылку и убедиться, что возврат происходит на нужную страницу:

Заключение
Теперь вы знакомы с основами работы с Codeception и можете работать с ним самостоятельно. Попробуйте модифицировать тест самостоятельно, чтобы он проверял, что форма отображает сообщение об ошибке: «Ничего не введено», когда отсылается пустая форма.
Вот финальная версия кода:
$I = new WebGuy($scenario);
$I->wantTo('Хочу убедиться, что форма скрипта Toupper работает корректно');
$I->amOnPage('toupper.html');
$I->see('Конвертируй меня!');
$I->fillField('string', "Конвертируй меня в верхний регистр ");
$I->click('Конвертировать');
$I->amOnPage('toupper.php');
$I->see('В верхний регистр!');
$I->amOnPage('toupper.php');
$I->see('В верхний регистр!');
$I->click('Назад к форме');
$I->see('Конвертируй меня!');
$I->fillField('string', '');
$I->click('Конвертировать');
$I->amOnPage('toupper.php');
$I->see('Ничего не введено');
В заключение, хотелось бы сказать, что Codeception это прекрасный фреймворк для тестирования, который позволяет вам легко писать собственные тесты.
Читайте документацию для получения детальных примеров и информации о других парадигмах тестирования.
Комментарии