Pull to refresh

Codeception — тестирование по-новому

Reading time4 min
Views88K
PHP очень популярный язык программирования, но тестирование в нем, это скорее прерогатива экспертов, а не жизненная необходимость. Неужели это от того, что PHP-разработчики поголовно быдло-кодеры? Я считаю, что нет. Скорее всё от того, что системы тестирования порой излишне усложнены. А тесты, наоборот, должны были предельно просты: легко читаться, писаться, отлаживаться, и конечно же, быстро выполняться. Мое виденье того как это можно воплотить в PHP вылилось в проект под названием Codeception.

С ним тесты для ваших веб-приложений могут выглядеть так:
<?php
$I = new TestGuy($scenario);
$I->wantTo('create new blog post');
$I->amOnPage('/blog/posts');
$I->click('Create new post');
$I->fillField('Title','Codeception, a new way of testing!');
$I->fillField('Text','Codeception is new PHP full-stack testing framework.');
$I->click('Send');
$I->see('Congratulations, your post is successfully created!');


Согласитесь, такой тест понятен без дополнительных комментариев.
А теперь самое интересное: этот код без всяких изменений может быть выполнен как функциональный тест в фреймворках symfony, Symfony2,Zend Framework, а также в браузерном эмуляторе Goutte и даже через Selenium. Таким образом, вам предлагается единый интерфейс для написания функциональных тестов практически для любого сайта.

В Codeception в максимально простой форме вы описываете весь тест в виде сценария. Вы повторяете действия пользователя, который использует ваше веб-приложение: кликает по ссылкам, заполняет формы и ожидает увидеть некоторый результат. Логично было бы написать тест, который бы в точности отражал его действия. При этом сам процесс написания теста крайне прост, если в своей IDE вы используете автодополнение:



Codeception работает на трех китах:
— как тестовая среда используется PHPUnit.
— для приемочных тестов — Mink. За него огромная благодарность Константину Кудряшову everzet.
— и конечно же, Symfony Components. Они используются практически для всего. Особо стоит отметить BrowserKit, который используется для функциональных тестов.

Чтобы начать, установите Codeception через PEAR:

$ pear channel-discover codeception.com/pear
$ pear install codeception/Codeception


Теперь установите необходимые зависимости.
$ codecept install


Выберите проект, который вы хотите тестировать и выполните в его корне команды

$ codecept bootstrap
$ codecept build


Команда «bootstrap» создаст конфигурационный файл и папку tests для трех категорий тестов:

— unit
— functional
— acceptance

Тут важно отметить, что мы различаем функциональные и приемочные тесты. Последние требуют наличие веб-сервера, на котором и будет проходить тестирование посредством того же Goutte или Selenium. Функциональные запускают приложение внутри самого теста, как это, например, происходит при тестирвоании в Symfony или Zend Framework.

Проще всего начать с написания приемочного теста. В каталоге tests/acceptance создадим новый файл StartPageCept.php:

<?php
$I = new WebGuy($scenario);
$I->wantToTest('front page of my site');
$I->amOnPage('/');
$I->see('A sample text on my site');


Он проверяет, что на главной странице вашего сайта есть текст: 'A sample text on my site'. Впишите в see текст, который там действительно есть, и ваш тест готов к прогонке.
Но прежде чем запустить его, вспомним, что приемочные тесты требуют, чтобы сайт выполнялся внутри веб-сервера. А значит необходимо сообщить url через который можно получить доступ к нашему сайту. Откроем файл: tests/acceptance.suite.yml

    config:
        PhpBrowser:
            url: 'тут мы впишем url к главке'


Теперь выполните.

$ codecept run acceptance


И увидите что-то типа такого:

Suite acceptance started
Trying to see front page of my site (StartPageCept) - Ok

Time: 1 second, Memory: 21.00Mb

OK (1 test, 1 assertions)


Теперь можно приступить к написанию более сложных тестов для своего приложения. Например, вот так может выглядеть тест для авторизации на сайте:

<?php
$I = new WebGuy($scenario);
$I->wantTo('log in as regular user');
$I->amOnPage('/login');
$I->fillField('Username','davert');
$I->fillField('Password','qwerty');
$I->click('Login');
$I->see('Hello, davert');
?>


Больше о написании тестов читайте в документации.

Чтобы выполнить один из этих тестов внутри фреймворка, следует скопировать тест в 'tests/functional', и отредактировать файл test/functional.suite.yml.
Приведу пример для Symfony2, но абсолютно аналогично вы можете подключить Zend Framework или symfony, а также Doctrine1 или Doctrine2.

class_name: TestGuy
modules:
    enabled: [Symfony2, TestHelper] 


Так мы указали модуль Symfony2 для использования в функциональных тестах. Если ваш AppKernel находится стандартно, в папке 'app', тест будет выполнен без дополнительной конфигурации.

Для запуска функциональных тестов следует использовать:
$ codecept run functional


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

Codeception не только выполняет тесты, но так же старается с нуля создать необходимую среду для тестирования. Важной частью тестирования является приготовление базы данных и её очистка.
Реализуется она посредством модуля Db. Создайте тестовую базу данных и заполните её данными, необходимыми для тестирования. Можно делать это вручную или используя фикстуры. Создайте дамп базы и поместите его в папку tests/_data. Затем откройте конфигурационный файл codeception.yml в корне вашего проекта и впишите для модуля Db параметры доступа к базе данных и путь к дампу. Теперь, если вы добавите модуль Db к списку модулей в файле tests/acceptance.suite.yml или functional.suite.yml, база данных будет обновляться автоматически после каждого теста.

Впрочем, это не единственный способ очистки. Если вы используете Doctrine или Doctrine2, то соответствующие модули помещают все ваши запросы в транзакцию и выполняют rollback в конце.
Таким образом база данных не засоряется, а значит и постоянная очистка ей не нужна. Такие тесты будут работать очень быстро, но транзакции доступны только в функциональных и юнит-тестах.

Более полную документацию вы найдете на официальном сайте. Там доступны как обзорные материалы, так и описания конкретных модулей.

Codeception сейчас находится в стадии бета-тестирования и ваши отзывы будут крайне желательны.
Следите за проектом на GitHub.
Tags:
Hubs:
Total votes 75: ↑70 and ↓5+65
Comments68

Articles