Codeception - это фреймворк для тестирования php-проектов. Написан он на базе PHP Unit, про который я писал не так давно, и который использует концепцию BDD. Ну а BDD (behaviour-driven development) - это разработка, основанная на описании поведения, что облегчает написание и чтение кода тестов. Codeception значительно расширяет возможности phpUnit и используется во многих современных фреймворках.
Т.к. мир php уже давно захватил Composer, основной способ установки именно с его помощью.

Глобальная установка.
Если вы планируете использовать фреймворк Codeception для нескольких проектов, то лучше установить его глобально (не в каталог vendor текущего проекта, а в каталог vendor пользователя, откуда Composer так же подключает пакеты):
composer global require codeception/codeception --dev
Исполняемый файл codecept.bat при этом автоматически запишется в папку vendor\bin пользователя (для Win), которая должна быть указана в системной переменной PATH (как и папка с интерпретатором php) и таким образом вы сможете обращаться к фреймворку только по названию исполняемого файла:
codecept
Если в PATH не указан путь к bin, обязательно укажите. Чтобы проверить наберите в консоли:
echo %PATH%
Если планируете использовать кирилические символы (русский) в тестах, то чтобы они выводились корректно в консоли, можно добавить строку
@chcp 65001
в файл codecept.bat находящийся в папке пользователя, например: C:\Users\имя_вашего_пользователя\AppData\Roaming\Composer\vendor\bin\codecept.bat


Установка в текущий проект.
Осуществляется командой:
composer require codeception/codeception --dev
Запускающий файл будет находиться в папке vendor\bin проекта. Чтобы не набирать для тестирования «vendor\bin\codecept»:
1) для Linux создаем алиас:
alias codecept="./vendor/bin/codecept"
2) для Win
создать в корне проекта файл codecept.bat или любое удобное название с содержимым:
@echo off
@setlocal
@chcp 65001
set CODECEPT_PATH=vendor/bin/
"%CODECEPT_PATH%codecept.bat" %*
@endlocal
строкой @chcp 65001 я указал кодировку чтобы кирилические символы отображались корректно.
Далее я буду описывать процесс исходя из того, что установлен Windows.

Теперь для запуска из корня проекта достаточно писать просто
codecept

Если вы не планируете проводить приемочное тестирование, то можете установить базовую версию Codeception без загрузки библиотек Webdriver и Guzzle:
composer require codeception/base --dev

Для ознакомления с консольными командами Codeception можно воспользоваться справкой:
  • вывести описание доступных консольных команд
codecept
  • вывести справку по нужной команде
codecept название команды –h


Инициализация.

После первой установки Codeception нужно выполнить команду инициализации которая создаст в корне проекта конфигурационный файл codeception.yml и папку tests с различными папками и файлами:
codecept bootstrap
Возможно указание дополнительных параметров запуска этой команды, которые можно посмотреть в файле \codeception\codeception\src\Codeception\Command\Bootstrap.php

Например указываем каталог для размещения тестов – testsCodeception, если не хотим чтобы они разместились в корне:
codecept bootstrap testsCodeception



Структура каталогов codeception
В каталоге tests, который был создан в результате команды codecept bootstrap, вы увидите следующий набор директорий:

  • _data — может содержать файлы базы данных (php файлы возвращающие массив данных для использования в fixtures), дамп базы.
  • _output — содержит вывод тестов и их результат.
  • _support — содержит сгенерированные модули, которые нужны для запуска тестов. Они создаются с помощью команды (codecept build). Так же содержит помощники к тестам.
  • acceptance — содержит приёмные тесты.
  • functional — содержит функциональные тесты.
  • unit — содержит модульные тесты

Так же в корне проекта (по-умолчанию) появится файл codeception.yml. Файлы с расширением .yml существуют для настройки тестирования (подключение модулей, их настройки. В каталогах отдельных типов тестов так же будут конфигурационные файлы для настройки конкретно соответствующего типа тестирования).


Настройка.

При инициализации Codeception в корне приложения появится главный конфигурационный файл codeception.yml. В нем указаны общие настройки для тестирования и можно дополнительно указать глобальные модули и их параметры, которые нужны для разных типов тестов, например:
modules:
    config:
        Db:
            dsn: ''
            user: ''
            password: ''

Для каждого типа тестов (приемочные, функциональные, модульные) существует дополнительный, специализированный конфигурационный файл. Например для проведения приемочного тестирования нужно настроить общий конфигурационный файл - tests\acceptance.suite.yml указать домен сайта для PhpBrowser:
actor: AcceptanceTester
modules:
    enabled:
        - PhpBrowser:
            url: http://test.loc
        - \Helper\Acceptance
        - Db:
             dump: 'tests/_data/test.sql'
             populate: true
             cleanup: true
             reconnect: true

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

Можно вывести в консоль массив текущей конфигурации (какие указаны настройки, какие можно указать)
codecept config:validate

После внесения правок в конфигурационные файлы нужно выполнить команду:
codecept build
это сгенерирует трейты с методами для тестирования из модулей Codeception которые появится в папке tests\_support\_generated.
При этом в информации, которая будет выведена в консоль после выполнения команды, можно увидеть кол-во добавленных методов и подключенных модулей для каждого типа теста:


Сам класс конфигурации находится в файле vendor\codeception\codeception\src\Codeception\Configuration.php


Пример.

Существует два способа написания тестов в Codeception, которым соответствуют два типа наименования файлов: Cept и Cest. Cept строится по сценарию (функциональное программирование), а Cest на базе объектов (ООП). Кроме того, Codeception может выполнять PHPUnit-тесты для модульного тестирования т.к. наследуется от данной библиотеки.
В качестве примера создам простой приемочный тест по типу Cept для проверки главной страницы сайта.

Файл теста можно сгенерировать автоматически. Создадим файл HomeCept.php командой:
codecept generate:cept acceptance Home
Файл появится в папке tests/acceptance и сразу будет содержать строки:
<?php 
$I = new AcceptanceTester($scenario);
$I->wantTo('perform actions and see result');
При желании, создать файл теста можно и вручную, главное указать в названии файла окончание «Cept».

Дополним тест на проверку доступа к главной странице которая также должна вернуть указанный текст (фразу).
<?php 
$I = new AcceptanceTester($scenario);
$I->wantTo('Проверить работу главной страницы.');

$I->amOnPage('/');
$I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK);
$I->see('Главная страница'); // Фраза или ее часть с главной страницы

В обязательном методе wantTo() указывается действие которое осуществляет данный тестовый метод.
В методе amOnPage() указывается на какой странице начинается тестирование (далее возможен переход по ссылкам и тд.).
Метод seeResponseCodeIs() сравнивает код который возвращает сервер на запрос страницы, с указанным в качестве аргумента. В данном случае, я использовал константу "OK" из класса HttpCode, которая имеет значение 200, но можно указывать аргумент и непосредственно в цифровом варианте. Это тестовый метод и он возвращает true если код равен указанному.
Ну и часто употребляемый метод see() возвращает true если на странице присутствует указанная фраза.

Так же можно создавать тестовый файл сразу в определенной папке. Это удобно, т.к. путь к тесту должен повторять файловую структуру проекта. Например создадим модульный тест, файл SaveTest.php в папке articles (папка создастся автоматически):
codecept generate:test unit articles/Save
Кроме того, тестам, которые созданы на базе классов (cest и test), автоматически будет присвоено пространство имен, в данном случае:
namespace articles;

Подробнее ознакомиться с существующими методами можно в справочных файлах из папки vendor\codeception\codeception\docs и в моих следующих статьях.


Запуск тестов.

Для простого запуска тестов нужно перейти в консоли в корень проекта или в каталог куда были установлены тесты (если установка была не в корень) и выполнить:
codecept run
будут выполнены все тесты (модульные, функциональные и приемочные).

Для запуска тестирования из любого каталога (без перехода в корень проекта) – дополнительно нужно указать путь к проекту, например:
codecept run -c "E:\OpenServer 5.2.5\domains\test.loc"

Для запуска конкретного типа тестов используется так же команда с указанием типа теста, например для приемочных тестов:
codecept run acceptance

Можно запустить тестирование одного конкретного класса теста, например:
codecept run acceptance HomeCept

Опции команды run :
 --config (-c)         Путь к проекту с тестами тестам
 --report              Show output in compact style
 --html                Generate html with results
 --xml                 Generate JUnit XML Log
 --tap                 Generate Tap Log
 --json                Generate Json Log
 --colors              Use colors in output
 --no-colors           Force no colors in output (useful to override config file)
 --silent              Only outputs suite names and final results
 --steps               Show steps in output
 --debug (-d)          Show debug and scenario output
 --coverage            Run with code coverage
 --no-exit             Don't finish with exit code
 --group (-g)          Groups of tests to be executed (multiple values allowed)
 --skip (-s)           Skip selected suites (multiple values allowed)
 --skip-group          Skip selected groups (multiple values allowed)
 --env                 Run tests in selected environments. (multiple values allowed)
 --verbose (-v|vv|vvv) Уровень отладки

Например:
codecept run --steps --html
эта команда запустит все тесты из всех тестовых наборов, все шаги будут выводиться на консоль, результаты тестов буду сохранены в HTML файл (в папку tests/_output).


Согласно примера, главная страница сайта должна вернуть заголовок со статусом 200 и контент должен содержать фразу 'Главная страница'. При успешном прохождении теста, в консоли будет выведено:




Помощники.


В помощниках можно определять недостающие утверждения (assertion). Файлы помощников находятся в папке tests\_support\Helper.
Вы можете использовать методы PHPUnit:
<?php
function seeCanCheckEverything($thing)
{
    $this->assertTrue(isset($thing), "this thing is set");
    $this->assertFalse(empty($any), "this thing is not empty");
}
?>

Так же можно получить доступ к методам и свойствам других модулей используя метод getModule(), например:
public function dbDriver(){
    return $this->getModule('Db')->driver;
}
Ко всем публичным методом помощников можно обращаться в файлах тестов:
$I->dbDriver()
Дополнительную информацию можно получить на официальном сайте Codeception http://codeception.com


Данная статья является одной из серии статей про фреймворк для тестирования Codeception. Читайте так же: