{{tag>php test codeception}}

====== Codeception - Тестирование ======

  * https://github.com/Codeception/Codeception
  * http://allframeworks.ru/codeception :!:

===== Установка =====

  * http://codeception.com/pear/

===== Описание =====

Фреймворк для автоматического тестирования веб-приложений на PHP — Codeception живет и развивается. Но в этот раз вместо скупой порции новостей я бы хотел представить вам первый скринкаст в котором показаны азы работы с Codeception. Если вы только читали про Codeception, то вам обязательно стоит взглянуть на него в действии. Ну а если не читали, но у вас есть веб-сайт, который бы вы хотели протестировать — тоже взгляните.

==== Создание ====

<code bash>
$ ./vendor/bin/codecept bootstrap ./frontend
$ ./vendor/bin/codecept bootstrap ./vendor/mirocow/yii2-notification
</code>

Создает папку tests с конфигурационными файлами

<code bash>
$ ls -la ./vendor/mirocow/yii2-notification/tests
total 12
drwxr-xr-x 1 vagrant vagrant 374 Jul  7 22:34 .
drwxr-xr-x 1 vagrant vagrant 476 Jul  7 22:34 ..
drwxr-xr-x 1 vagrant vagrant  68 Jul  7 22:34 acceptance
-rw-r--r-- 1 vagrant vagrant 347 Jul  7 22:34 acceptance.suite.yml
drwxr-xr-x 1 vagrant vagrant 102 Jul  7 22:34 _data
drwxr-xr-x 1 vagrant vagrant  68 Jul  7 22:34 functional
-rw-r--r-- 1 vagrant vagrant 360 Jul  7 22:34 functional.suite.yml
drwxr-xr-x 1 vagrant vagrant 102 Jul  7 22:34 _output
drwxr-xr-x 1 vagrant vagrant 238 Jul  7 22:34 _support
drwxr-xr-x 1 vagrant vagrant 102 Jul  7 22:43 unit
-rw-r--r-- 1 vagrant vagrant 161 Jul  7 22:34 unit.suite.yml
</code>

В которой будут создыны 3 кипа конфигураций: **unit**, **functional**, **acceptance**

=== Описание ===

  * acceptance.suite.yml - Настройки для приемочного тестирования
  * functional.suite.yml - Настройки для функционального тестирования
  * unit.suite.yml - Настройки для юнит/модульного тестирования
  * _support - Методы доступные через интерфейс <text>$I-></text>
  * _output - В этой папке содержатся сгенерированные тестом файлы
  * _data - В этойпапке содержатся загружаемые тестом файлы (Пример: <text>$I->attachFile('input[@type="file"]', 'prices.xls');</text>)

==== Проверка и настройка тестовго окружения ====

Проверка конфигурации
<code bash>
$ ./vendor/bin/codecept -c ./vendor/mirocow/yii2-queue config:validate
</code>

<code bash>
$ cd /app
$ ls -la ./tests/codeception/common/
total 16
drwxr-xr-x 1 vagrant vagrant 340 Jul  7 21:39 .
drwxr-xr-x 1 vagrant vagrant 340 Jul  7 21:39 ..
-rwxr-xr-x 1 vagrant vagrant 548 Jul  5 13:53 _bootstrap.php
-rwxr-xr-x 1 vagrant vagrant 266 Jul  5 13:53 codeception.yml
drwxr-xr-x 1 vagrant vagrant 102 Jul  7 21:39 _data
-rwxr-xr-x 1 vagrant vagrant 141 Jul  5 13:53 .gitignore
drwxr-xr-x 1 vagrant vagrant 102 Jul  5 13:53 _output
drwxr-xr-x 1 vagrant vagrant 136 Jul  7 22:09 _support
drwxr-xr-x 1 vagrant vagrant 136 Jul  7 22:11 unit
-rwxr-xr-x 1 vagrant vagrant 152 Jul  5 13:53 unit.suite.yml
</code>

  * Где /app - папка проекта на vagrant виртуальной машине
  * codeception.yml - Базовый конфигурационный файл
  * unit.suite.yml - Настройки запускаемой конфигурации

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

<note>
Обязательно после run уазать **конфигурацию/Sute** запускаемого теста
Базовые конфигурации: **unit**, **functional**, **acceptance**
Конфигурация/Sute берется из корня папки с запускаемыми скриптами и носит название ***.suite.yml**.
В этой же папке должен находится базовый конфигурационный файл
</note>

<note tip>Если указан полный путь до тесового файла, то не надо указывать suite<code bash>$ codecept run ./tests/acceptance/MyCept.php</code></note>

[[https://codeception.com/docs/reference/Commands#Run|Подробнее...]]
==== Параметры ====

  * ''-с'' - Папка с тестами конфигационным файлом или файл конфигурации
  * ''-g'' slow - Запуск теста из укзанной группы
  * ''-o'' "settings: shuffle: true" - Переопределение конфигурационных настроек
  * ''-v'' -
  * ''-vv'' - 
  * ''-vvv'' - 
  * ''--steps'' - 
===== Наборы тестов / Suite =====

==== Юнит тесты / unit ====

проверяет что отдельный модуль кода работает верно

  * frontend/tests/unit
  * backend/tests/unit
  * common/tests/unit

Предварительная сборка тестов

<code bash>
$ ./vendor/bin/codecept build
</code>

=== Создание ===

<code bash>
$ ./tests/codeception/common generate:test unit UserTest -vvv
</code>

=== Запуск ===

Запуск всех тестов из выбранной апликации

<code bash>
$ ./vendor/bin/codecept -c ./common run unit -vvv
$ ./vendor/bin/codecept -c ./frontend run unit -vvv
$ ./vendor/bin/codecept -c ./backend run unit -vvv
</code>

  * Где -с - папка с конфигурационным файлом codeception.yml (относительно текущей папки ./tests )
  * -v - Минимальный уровень логирования
  * -vv - Средний уровень логирования
  * -vvv - Маскимальный уовень логирования

Запуск указанных тестов

<code bash>
$ cd /app
$ ./vendor/bin/codecept -c ./common run unit models/LoginFormTest.php
</code>

  * Где /app - папка с нашим проектом
  * Где тест models/LoginFormTest.php лежит в common/tests/unit (Так-как используется Sute из common/tests/unit.suite.yml)

Аналогично запускаются тесты из frontend и backend


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

проверяет пользовательские сценарии через эмуляцию браузера

  * frontend/tests/functional
  * backend/tests/functional

Предварительная сборка тестов

<code bash>
$ ./vendor/bin/codecept build
</code>

=== Создание ===

<code bash>
$ ./vendor/bin/codecept -c ./frontend generate:cept functional UserFormCept
$ ./vendor/bin/codecept -c ./frontend generate:cest functional UserFormCept
</code>

<note tip>Cept - Записывается в виде сценария</note>

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

<note tip>Cest - Записывается в виде PHP класса</note>

<code php>
<?php
class UserCest
{
    public function loginAsRegularUser(\AcceptanceTester $I) 
    {
        $I->wantTo('log in as regular user');
        $I->amOnPage('/login');
        $I->fillField('Username','john');
        $I->fillField('Password','secret');
        $I->click('Login');
        $I->see('Hello john');            
    }
}
</code>
=== Запуск ===

Запуск всех тестов из выбранной апликации

<code bash>
$ ./vendor/bin/codecept -c ./frontend run functional -vvv
$ ./vendor/bin/codecept -c ./backend run functional -vvv
</code>

Запуск указанных тестов

<code bash>
$ cd /app
$ ./vendor/bin/codecept -c ./backend run functional LoginCest
</code>

  * Где /app - папка с нашим проектом
  * Где тест LoginCest.php лежит в ./backend/tests/functional (Так-как используется Sute из ./common/tests/functional.suite.yml)
  * Имя теста 2-я разными способами (LoginCest, LoginCest.php | LoginCept, LoginCept.php)


==== Приёмочное тестирование / acceptance ====

проверяет пользовательские сценарии в браузере

  * frontend/tests/acceptance

Предварительная сборка тестов

<code bash>
$ ./vendor/bin/codecept build
</code>

=== Запуск ===

<code bash>
$ 
</code>

===== Модули =====

Модули codeception распологаются в папке **[[https://github.com/marcovtwout/Codeception/tree/2.3/src/Codeception/Module|./vendor/codeception/base/src/Codeception/Module]]**

===== Компоненты =====

<code bash>
$ composer require "codeception/base": "^2.2.3",
$ composer require "codeception/codeception=2.1.*"
$ composer require "codeception/specify=*"
$ composer require "codeception/verify=*"
</code>

  * codeception/base - Codeception distribution with minimal set of dependencies
  * codeception/codeception - Full-stack testing PHP framework
  * codeception/specify - BDD style code blocks for PHPUnit / Codeception
  * codeception/verify - BDD Assertions for PHPUnit and Codeception

===== Статьи / Документация =====

  * https://github.com/yupe/codeception-guide-ru :!:
  * http://allframeworks.ru/codeception :!:
  * https://p0vidl0.info/yii2-api-guides/guide-ru-test-overview.html
  * https://russianpenguin.ru/%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE/
  * http://www.jetsource.ru/scripts/stats_and_tutorials/codeception_tests
  * http://habrahabr.ru/post/136477/
  * [[http://www.jetsource.ru/scripts/stats_and_tutorials/codeception_tests|ТЕСТИРОВАНИЕ ПРОЕКТА С CODECEPTION]]
  * http://itfap.s2z.ru/read/Modulqnoe_testirovanie_povedeniya_Yii2_s_pomoschqyu_Codeception

===== Сервисы для тестирования =====

==== Travis ====

nano .travis.yml
<code>
</code>
===== Видео =====

  * http://habrahabr.ru/post/146662/
  * http://code.tutsplus.com/courses/modern-testing-in-php-with-codeception
  * http://www.youtube.com/watch?v=nuzEJzuJJJ4 :!:
  * https://www.youtube.com/watch?v=XGNoiPqa6PI
