Spec-Zone.ru › Codeception

Введение

Идея тестирования не нова. Вы не сможете хорошо спать, если не уверены, что ваше последнее изменение не повлияло на всю программу. Наличие тестов, покрывающих ваше приложение, даёт вам больше уверенности в стабильности вашего приложения. Вот и всё.

В большинстве случаев тесты не гарантируют, что приложение работает на 100% так, как ожидается. Вы не можете предсказать все возможные сценарии и исключительные ситуации для сложных приложений, но с помощью тестов вы можете охватить наиболее важные части вашего приложения и, по крайней мере, быть уверены, что они работают так, как ожидается.

Существует множество способов тестирования вашего приложения. Наиболее популярной парадигмой является Модульное тестирование. Для веб-приложений тестирование только контроллера и/или модели не доказывает, что ваше приложение работает. Чтобы проверить поведение вашего приложения в целом, вы должны написать функциональные или приемочные тесты.

Codeception поддерживает все три типа тестирования. Из коробки у вас есть инструменты для написания модульных, функциональных и приемочных тестов в единой структуре.

Модульные тесты Функциональные тесты Приемочные тесты
Область действия теста Один PHP-класс PHP-фреймворк (маршрутизация, контроллеры и т. д.) Страница в браузере (Chrome, Firefox или PhpBrowser)
Тестирующий компьютер должен иметь доступ к PHP-файлам проекта Да Да Нет
Требуется веб-сервер Нет Нет Да
JavaScript Нет Нет Да
Необходимое дополнительное программное обеспечение Отсутствует Отсутствует Selenium для тестирования браузера
Скорость Быстро Быстро Медленно
Файл конфигурации unit.suite.yml functional.suite.yml acceptance.suite.yml

Одним из основных преимуществ Codeception является то, что вам не нужно выбирать только один тип тестирования. Вам нужны все три! И скорее всего, вам (рано или поздно) понадобятся все три. Именно поэтому Codeception состоит из трёх так называемых «наборов»: «модульный набор» для всех модульных тестов, «функциональный набор» для всех функциональных тестов и «приемочный набор» для всех приемочных тестов.

Давайте рассмотрим эти три типа тестирования в обратном порядке.

Приемочные тесты

Как ваш клиент, менеджер, тестировщик или любой другой нетехнический человек узнаёт, что ваш веб-сайт работает? Открыв браузер, зайдя на сайт, кликнув по ссылкам, заполнив формы и фактически увидев содержимое веб-страницы. Они не имеют представления о языке программирования, фреймворке, базе данных, веб-сервере или о том, почему приложение работало (или не работало) так, как ожидалось.

Вот что делают приемочные тесты. Они охватывают сценарии с точки зрения пользователя. С помощью приемочных тестов вы можете быть уверены, что пользователи, следуя всем определённым сценариям, не получат ошибок.

Любой веб-сайт может быть охвачен приемочными тестами, даже если вы используете очень экзотичную CMS или фреймворк.

Пример приемочного теста

<?php
$I->amOnPage('/');
$I->click('Sign Up');
$I->submitForm('#signup', [
  'username' => 'MilesDavis', 
  'email' => 'miles@davis.com'
]);
$I->see('Thank you for Signing Up!');

Функциональные тесты

Что если вы могли проверить наше приложение, не запуская его на сервере? Таким образом, вы могли бы увидеть подробные исключения при ошибках, наши тесты работали бы быстрее и проверяли бы базу данных по предсказуемым и ожидаемым результатам. Для этого предназначены функциональные тесты.

Для функциональных тестов вы эмулируете веб-запрос ($_GET и $_POST переменные), который возвращает HTML-ответ. Внутри теста вы можете делать утверждения относительно ответа и проверять, были ли данные успешно сохранены в базе данных.

Для функциональных тестов ваше приложение должно быть структурировано для работы в тестовой среде. Codeception предоставляет коннекторы ко всем популярным PHP-фреймворкам.

Пример функционального теста

<?php
$I->amOnPage('/');
$I->click('Sign Up');
$I->submitForm('#signup', ['username' => 'MilesDavis', 'email' => 'miles@davis.com']);
$I->see('Thank you for Signing Up!');
$I->seeEmailSent('miles@davis.com', 'Thank you for registration');
$I->seeInDatabase('users', ['email' => 'miles@davis.com']);

Это очень похоже на приемочные тесты. Поведение одинаково, однако тест выполняется внутри PHP без запуска браузера.

Модульные тесты

Тестирование фрагментов кода до их объединения также очень важно. Таким образом, вы можете быть уверены, что какая-то глубоко скрытая функция всё ещё работает, даже если она не была охвачена функциональными или приемочными тестами. Это также демонстрирует внимательность к созданию стабильного и тестируемого кода.

Codeception создан на базе PHPUnit. Если у вас есть опыт написания модульных тестов с PHPUnit, вы можете продолжать это делать. Codeception без проблем выполняет стандартные тесты PHPUnit, но, кроме того, Codeception предоставляет хорошо разработанные инструменты для упрощения и очистки ваших модульных тестов.

Требования и код могут быстро меняться, и модульные тесты должны обновляться каждый раз, чтобы соответствовать требованиям. Чем лучше вы понимаете сценарий тестирования, тем быстрее вы можете обновить его для нового поведения.

Пример интеграционного теста

<?php
public function testSavingUser()
{
    $user = new User();
    $user->setName('Miles');
    $user->setSurname('Davis');
    $user->save();
    $this->assertEquals('Miles Davis', $user->getFullName());
    $this->tester->seeInDatabase('users', [
      'name' => 'Miles', 
      'surname' => 'Davis'
    ]);
}

Заключение

Фреймворк Codeception был разработан, чтобы сделать тестирование действительно увлекательным. Он позволяет писать модульные, функциональные, интеграционные и приемочные тесты в едином, согласованном стиле.

Все тесты Codeception написаны описательно. Просто взглянув на тело теста, вы можете чётко понять, что тестируется и как это выполняется.

  • Следующая глава: Начало работы >

© 2011 Michael Bodnarchuk and contributors
Licensed under the MIT License.
https://codeception.com/docs/01-Introduction

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API