Тестирование Symfony 2 приложений с помощью codeception

Какие преимущества вы получаете, используя 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 является хорошим выбором для этого.