#  Начнем!

# Начнем!

Давайте посмотрим на архитектуру Codeception. Будем считать, что Codeception уже [установлен](/codeception/00-Install.html) и наборы тестов инициализированы. Codeception генерирует три стандартных набора для следующих категорий тестов: модульных (unit), функциональных (functional), и приемочных (acceptance). Все они были описаны в [предыдущей статье](/codeception/01-Introduction.html). Внутри каталога `/tests` мы имеем три конфигурационных файла и три каталога с названиями, соответствующими наборам. "Наборы тестов" (suites) - это независимые группы тестов, объединенные общей целью.

## "Актеры"/Actors ( или Парни/Guys до версии 2.0)

Основной концепцией Codeception является представление тестов как действий человека. По умолчанию мы называем этого человека "**парнем**" (Guy), но можно дать ему любое название при инициализации проекта. У нас есть **CodeGuy**, который выполняет функции/методы и тестирует код. Также у нас есть **TestGuy** - опытный тестировщик, который тестирует приложение целиком и знает кое-что о его внутреннем устройстве. Еще есть **WebGuy**, пользователь, который работает с нашим приложением через web-интерфейс, который мы ему предоставляем.

Каждый из этих "парней" имеет различные способности и представляет из себя PHP класс с набором действий, которые он может совершать. Способности "парней" не постоянны и Вы можете расширять их, а также, можете создавать новых "парней", но запомните: один "парень" на один набор тестов.


Классы "парней" не нужно писать с нуля, так как их можно просто сгенерировать следующей командой:

~~~
$ php codecept.phar build
~~~

Классы "парней" генерируются на основании файла конфигурации для набора тестов (suite). Когда Вы меняете конфигурацию - файлы перегенерируются автоматически.

## Напишем простой сценарий

По умолчанию тесты пишутся в виде последовательных сценариев. Чтобы PHP-файл стал корректным сценарием, его имя должно содержать суффикс "Cept". 

Предположим, что мы хотим создать файл `tests/acceptance/SigninCept.php`

Это можно сделать следующей командой:

```
$ php codecept.phar generate:cept acceptance Signin
```

```php
<?php
$I = new WebGuy($scenario);
?>
```

Сценарий всегда начинается с инициализации класса нашего "парня". После этого написание сценария сводится к написанию `$I->` и выбору соответствующего действия из списка авто-дополнения.

Давайте авторизуемся на нашем сайте. Мы предполагаем, что у нас есть страница "login", на которой для авторизации необходимо ввести логин и пароль. После авторизации мы перекидываем пользователя на страницу, где он видит текст `Hello, %username%`. Давайте разберемся как написать этот сценарий, используя Codeception.

```php
<?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/acceptance.suite.yml` и замените URL на URL Вашего приложения:

``` yaml
config:
    PhpBrowser:
        url: 'http://myappurl.local'
```

Если у Вас нет запущенного веб-сервера Вы можете использовать [PHP Built-in Web Server](http://php.net/manual/en/features.commandline.webserver.php) который доступен, начиная с версии PHP 5.4 

После того как Вы установили корректный URL, можно запустить тест, используя следующую команду:

``` bash
$ php codecept.phar run
```

Вот, что мы должны увидеть на выходе: 

``` bash
Suite acceptance started
Trying log in as regular user (SigninCept.php) - Ok

Suite functional started

Suite unit started


Time: 1 second, Memory: 21.00Mb

OK (1 test, 1 assertions)
```

Давайте посмотрим более детальный вывод:

```bash
$ php codecept.phar run acceptance --steps
```

Мы должны увидеть шаг за шагом последовательность выполняемых действий:

```bash
Suite acceptance started
Trying to log in as regular user (SigninCept.php)
Scenario:
* I am on page "/login"
* I fill field "Username" "davert"
* I fill field "Password" "qwerty"
* I click "Login"
* I see "Hello, davert"
  OK


Time: 0 seconds, Memory: 21.00Mb

OK (1 test, 1 assertions)
```

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

Просто попробуйте!

## Модули и хелперы

Все действия в Guy-классе берутся из модулей. Команда "build", описанная выше, позволяет Codeception эмулировать множественное наследование. Модули спроектированы так, чтобы выполнять только одно действие на каждый метод. В соответствии с [DRY principle](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself), если Вы используете одни и те же компоненты в различных модулях - их можно объединить и поместить в свой собственный модуль. По умолчанию каждый набор тестов содержит пустой модуль, который может быть использован для расширения Guy-класса. Они расположены в директории "_helpers".

## Bootstrap

Каждый набор тестов имеет свой собственный стартовый (bootstrap) файл. Он расположен в директории, содержащей набор тестов и называется`_bootstrap.php`. Этот файл исполняется перед каждым тестом из соответствующего набора. Любые подготовительные операции для набора тестов следует писать именно в этом файле.

## Форматы тестов
Codeception поддерживает три формата тестов. Помимо уже описанных тестов в Cept формате, Codeception также может выполнять PHPUnit-тесты для модульного тестирования и смешанные (scenario-unit) тесты в формате "Cest". Они будут описаны в следующих статьях. Нет никакой разницы в том, какой формат теста будет запущен в наборе (suite).

## Конфигурация

Codeception имеет глобальный файл конфигурации `codeception.yml` и отдельный конфигурационный файл для каждого набора тестов. Также поддерживаются конфигурационные файлы `.dist`. Если у Вас в проекте несколько разработчиков - разместите общие параметры конфигрурации в файле `codeception.dist.yml`, а индивидуальные настройки каждого разработчика в файле `codeception.yml`. Такой подход справедлив и для конфигураций наборов тестов. Например, файл `unit.suite.yml` будет объединен с файлом `unit.suite.dist.yml`. 

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

Тесты могут быть запущены командой 'run':

```bash
$ php codecept.phar run
```

Если передать один аргумент - можно запустить тесты только из указанного набора:

```bash
$ php codecept.phar run acceptance
```

Чтобы запустить только один тест - передайте второй аргумент. Указывайте локальный путь, начиная от директории с набором тестов:

```bash
$ php codecept.phar run acceptance SigninCept.php
```

Вы также можете указать полный путь до теста:

```bash
$ php codecept.phar run tests/acceptance/SigninCept.php
```
Можно указать путь до каталога с тестами:

```bash
php codecept.phar run tests/acceptance/backend
```
Эта команда запустит все тесты из каталога backend

Для запуска группы тестов, которые хранятся в разных каталогах можно организовать их в группы.

## Отчеты

Для генерации отчета в формате JUnit XML - запустите тесты с опцией --xml или с опцией --html для генерации HTML отчета

Пример:

```bash
$ php codecept.phar run --steps --xml --html
```

Эта команда запустит все тесты из всех тестовых наборов, все шаги будут выводиться в консоль, результаты тестов будут сохранены в HTML и XML файлах-отчетах в директории `tests/_log/`

Чтобы увидеть все доступные опции - запустите команду help:

```bash
$ php codecept.phar help run
```

## Отладка

Для получения более детальной информации запустите тесты с опцией `--debug` 
В тестах можно выводить любую отладочную информацию с помощью функции `codecept_debug`

### Генераторы

Codeception имеет множество полезных команд для генерации всего и вся:

* `generate:cept` *suite* *filename* - Генерировать  Cept сценарий.
* `generate:cest` *suite* *filename* - Генерировать  Cest тест.
* `generate:test` *suite* *filename* - Генерировать  PHPUnit Test c Codeception хуками.
* `generate:phpunit` *suite* *filename* - Генерировать классический PHPUnit Test.
* `generate:suite` *suite* *guy* - Генерировать новый набор тестов с указанным Guy-классом.
* `generate:scenarios` *suite* - Генерировать текстовый файл, содержащий сценарии из тестов.


## Заключение

Мы рассмотрели структуру Codeception. Б&oacute;льшая часть вещей, которые Вам понадобятся, уже сгенерированы командой `bootstrap`. После того, как Вы рассмотрели базовые понятия и конфигурацию, Вы можете приступить к написанию своего первого сценария.



Трудились и переводили ребята из [amyLabs](http://amylabs.ru/)
