Какие преимущества вы получаете, используя Codeception с Symfony2? Давайте перечислим все из них:
- удобный синтаксис для функциональных тестов
- доступ к контейнеру в юнит-тестах
- тестирования REST и SOAP сервисов, созданных с помощью Symfony
- быстрая очистка данных при использовании Doctrine2
Установка очень проста. Вы можете использовать Composer (как вы обычно это делаете), но мы рекомендуем попробовать phar package. В этом случае вы можете избежать ненужных зависимостей. Но оба варианта равнозначны. Чтобы установить codeception через composer необходимо добавить в composer.json
следующий код, а затем обновить:
"behat/mink": "1.5.*",
"phpunit/phpunit": "3.7.*",
"codeception/codeception": "1.8.*@dev",
"codeception/phpbuiltinserver": "dev-master"
Затем в консоли выполните команды:
php composer.phar update
php bin/codecept bootstrap
php bin/codecept build
Файлы Codeception создадутся в корне проекта, но вы можете создать в любой другой директории. Когда вы установите Codeception и выполните команду bootstrap
, ещё вы должны настроить функциональный набор тестов. Для этого в файле tests/functional.suite.yml
добавьте Symfony2, Doctrine2:
class_name: TestGuy
modules:
enabled:[Symfony2, Doctrine2, TestHelper]
И ничего больше. Вам просто нужно объявить, что вы будете использовать Symfony2 и Doctrine2. Модуль Symfony2 будет искать AppKrenel
при инициализации (в директории app
) и использует её для функциональных тестов. Модуль Doctrine2 увидит, что объявлен модуль Symfony2 и попытается создать соединение с базой данных по умолчанию из контейнера. Конечно, если вы используете нестандартные настройки такое поведение может быть изменено.
Функциональное тестирование
Давайте создадим первый функциональный тест. Мы используем команду php bin/codecept generate:cept functional TestName
.
<?php
$I = new TestGuy($scenario);
$I->wantTo('log in to site');
$I->amOnPage('/');
$I->click('Login');
$I->fillField('username', 'admin');
// ....
И так далее. В отличие от стандартных тестов Symfony2 вам не нужно иметь дело с фильтрами, CSS и XPaths. Конечно, вы можете использовать CSS или XPath в любом селекторе, если вам нужно. Но на старте вы можете хранить ваши тесты простыми и компактными. Команды, которые мы используем здесь, являются общими для большинства модулей, выполняющих тестирование веб-приложений. Это значит, что как только вы обнаружите необходимость для использования Selenium, этот тест может быть выполнен в веб-браузере, используя модуль Selenium2. Но некоторые команды являются уникальными для модуля Symfony2. Например, вы можете использовать команду seeEmailIsSent, которая проверяет было ли отправлено письмо в последнем запросе. Посетите ссылку на модуль Symfony2 , чтобы увидеть все предоставляемые команды.
Модульное тестирование
Модульные тесты Codeception являются немного улучшенными тестами PHPUnit. Внутри модульных тестов у вас есть доступ к инициализированным модулям и Guy классам.
<?php
class PaginateTest extends \Codeception\TestCase\Test
{
private $serviceContainer;
protected $codeGuy;
protected function _before()
{
// доступ к контейнеру
$this->serviceContainer = $this->getModule('Symfony2')->container;
$this->serviceContainer->enterScope('request');
}
public function testDefaults()
{
// использование контейнера
$this->serviceContainer->set('request', new Request(), 'request');
$paginate = new Paginate($this->getModule('Symfony2')->container);
$this->assertEquals(1, $paginate->getCurrentPage());
$this->assertEquals(0, $paginate->getCount());
$this->assertEquals(20, $paginate->getLimit());
// проверка данных в репозитории
$this->codeGuy->seeInRepository('SettingsBundle:Settings', ['pager_limit' => 20]);
}
}
Заключение
И так, вы, вероятно, спросите: почему этот подход лучше, чем Behat. У нас есть ответ на этот вопрос. Вкратце: Codeception для тестирования, Behat для Behavior Driven Development (разработке, основанной на функционировании). Если вам нужен профессиональный инструмент для тестирования который поддерживает PageObject паттерн, сложные Locators, возможности рефакторинга и CodeCoverage — Codeception является хорошим выбором для этого.