Spec-Zone.ru › Codeception

Начало работы

Давайте рассмотрим архитектуру Codeception. Мы предполагаем, что вы уже установили её и запустили свои первые наборы тестов. Codeception сгенерировал три из них: unit, functional и acceptance. Они подробно описаны в предыдущей главе. Внутри папки /tests у вас будут три .yml файла конфигурации и три директории с названиями, соответствующими этим наборам: unit, functional, acceptance. Наборы — это независимые группы тестов с общей целью.

Синтаксис Codeception

Codeception использует простые правила именования, чтобы сделать названия методов лёгкими для запоминания (и понимания).

  • Действия начинаются с глагола на английском языке, например, «click» или «fill». Примеры:
    <?php
    $I->click('Login');
    $I->fillField('#input-username', 'John Dough');
    $I->pressKey('#input-remarks', 'foo');
    
  • Ассершены всегда начинаются с «see» или «dontSee». Примеры:
    <?php
    $I->see('Welcome');
    $I->seeInTitle('My Company');
    $I->seeElement('nav');
    $I->dontSeeElement('#error-message');
    $I->dontSeeInPageSource('<section class="foo">');
    
  • Сборщики данных извлекают информацию. Возвращаемое значение этих методов предназначено для сохранения в переменных и последующего использования. Пример:
    <?php
    $method = $I->grabAttributeFrom('#login-form', 'method');
    $I->assertEquals('post', $method);
    

Актеры

Одним из основных понятий Codeception является представление тестов как действий человека. У нас есть UnitTester, который выполняет функции и тестирует код. У нас также есть FunctionalTester, квалифицированный тестировщик, который тестирует приложение в целом, зная его внутренности. Наконец, у нас есть AcceptanceTester, пользователь, который взаимодействует с нашим приложением через предоставленный нами интерфейс.

Методы классов актеров обычно берутся из модулей Codeception. Каждый модуль предоставляет предварительно определённые действия для различных целей тестирования, и их можно комбинировать, чтобы они соответствовали среде тестирования. Codeception пытается решить 90% возможных проблем тестирования в своих модулях, поэтому вам не нужно изобретать велосипед. Мы считаем, что вы можете тратить больше времени на написание тестов и меньше на написание вспомогательного кода для их выполнения. По умолчанию AcceptanceTester полагается на модуль PhpBrowser, который задан в файле конфигурации tests/acceptance.suite.yml:

actor: AcceptanceTester
modules:
    enabled:
        - PhpBrowser:
            url: http://localhost/myapp/
        - \Helper\Acceptance

В этом файле конфигурации вы можете включать/отключать и перенастраивать модули для своих нужд. При изменении конфигурации классы актеров автоматически перестраиваются. Если классы актеров не создаются или не обновляются так, как вы ожидаете, попробуйте сгенерировать их вручную с помощью команды build:

php vendor/bin/codecept build

Написание образцового теста

Codeception имеет собственный формат тестирования под названием Cest (Codecept + Test). Чтобы начать написание теста, нам нужно создать новый файл Cest. Мы можем сделать это, выполнив следующую команду:

php vendor/bin/codecept generate:cest acceptance Signin

Это сгенерирует SigninCest.php файл внутри tests/acceptance директории. Давайте откроем его:

<?php
class SigninCest
{
    function _before(AcceptanceTester $I)
    {
    }
    
    public function _after(AcceptanceTester $I)
    {        
    }

    public function tryToTest(AcceptanceTester $I)
    {
       // todo: write test
    }
}

У нас есть _before и _after методы для выполнения некоторых общих действий до и после теста. И у нас есть заполнитель действия tryToTest, который нам нужно реализовать. Если мы пытаемся протестировать процесс входа в систему, неплохо начать с тестирования успешного входа. Давайте переименуем этот метод в signInSuccessfully.

Предположим, у нас есть страница «login», где мы авторизуемся, указав имя пользователя и пароль. Затем нас отправляют на страницу пользователя, где мы видим текст Hello, %username%. Давайте посмотрим, как этот сценарий записывается в Codeception:

<?php
class SigninCest
{
    public function signInSuccessfully(AcceptanceTester $I)
    {
        $I->amOnPage('/login');
        $I->fillField('Username','davert');
        $I->fillField('Password','qwerty');
        $I->click('Login');
        $I->see('Hello, davert');
    }
}

Этот сценарий, вероятно, может быть понятен и нетехническим пользователям. Если вы просто удалите все специальные символы, такие как фигурные скобки, стрелки и $, этот тест преобразуется в обычный текст на английском языке:

I amOnPage '/login'
I fillField 'Username','davert'
I fillField 'Password','qwerty'
I click 'Login'
I see 'Hello, davert'

Codeception генерирует это текстовое представление из PHP-кода, выполняя:

php vendor/bin/codecept generate:scenarios

Эти сгенерированные сценарии будут храниться в вашей папке _data в текстовых файлах.

Прежде чем выполнить этот тест, мы должны убедиться, что веб-сайт работает на локальном веб-сервере. Давайте откроем файл tests/acceptance.suite.yml и заменим URL на URL вашего веб-приложения:

actor: AcceptanceTester
modules:
    enabled:
        - PhpBrowser:
            url: 'http://myappurl.local'
        - \Helper\Acceptance

После настройки URL мы можем запустить этот тест с помощью команды run:

php vendor/bin/codecept run

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

Acceptance Tests (1) -------------------------------
✔ SigninCest: sign in successfully
----------------------------------------------------

Time: 1 second, Memory: 21.00Mb

OK (1 test, 1 assertions)

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

php vendor/bin/codecept run acceptance --steps

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

Acceptance Tests (1) -------------------------------
SigninCest: Login to website
Signature: SigninCest.php:signInSuccessfully
Test: tests/acceptance/SigninCest.php:signInSuccessfully
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)

Этот простой тест можно расширить до полного сценария использования сайта, поэтому, имитируя действия пользователя, вы можете протестировать любой из ваших веб-сайтов.

Чтобы запустить больше тестов, создайте для каждого из них публичный метод. Включите объект AcceptanceTester как $I в качестве параметра метода и используйте ту же API $I->, что и раньше. Если тесты имеют общие действия настройки, поместите их в метод _before.

Например, чтобы протестировать CRUD, нам нужно реализовать 4 метода, и все последующие тесты должны начинаться на странице /task:

<?php
class TaskCrudCest
{
    function _before(AcceptanceTester $I)
    {
        // will be executed at the beginning of each test
        $I->amOnPage('/task');
    }

    function createTask(AcceptanceTester $I)
    {
       // todo: write test
    }

    function viewTask(AcceptanceTester $I)
    {
       // todo: write test
    }

    function updateTask(AcceptanceTester $I)
    {
        // todo: write test
    }

    function deleteTask(AcceptanceTester $I)
    {
       // todo: write test
    }
}

Узнайте больше о формате Cest в разделе «Расширенное тестирование».

Интерактивная пауза

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

С Codeception 3.0 вы можете приостановить выполнение в любой момент и войти в интерактивную оболочку, где сможете попробовать различные команды в действии. Всё, что вам нужно сделать, это вызвать $I->pause() где-нибудь в вашем тесте, а затем запустить тест в режиме отладки.

Интерактивная пауза требует hoa/console, которая не устанавливается по умолчанию. Чтобы установить её, выполните:

php composer.phar require --dev hoa/console
<?php
// use pause inside a test:
$I->pause(); 

Выполнение теста останавливается на этом этапе, и отображается консоль, где вы можете попробовать все доступные команды «в реальном времени». Это может быть очень полезно при написании функциональных, приемочных или API-тестов.

Внутри интерактивной паузы вы можете использовать весь потенциал PHP-интерпретатора: переменные, функции и т. д. Вы можете получить доступ к результату последней выполненной команды в переменной с именем $result.

В приемочных или функциональных тестах вы можете сохранять снимки экрана страниц или снимков HTML.

<?php
// inside PhpBrowser, WebDriver, frameworks
// saves current HTML and prints a path to created file 
$I->makeHtmlSnapshot();

// inside WebDriver
// saves screenshot and prints a path to created file
$I->makeScreenshot();

Чтобы попробовать команды без запуска ни одного теста, вы можете запустить интерактивную консоль:

$ php vendor/bin/codecept console suitename

Теперь вы можете выполнить все команды соответствующего класса Актера и сразу увидеть результаты.

BDD

Codeception позволяет выполнять пользовательские истории в формате Gherkin аналогично тому, как это делается в Cucumber или Behat. Обратитесь к главе по BDD, чтобы узнать больше.

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

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

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

Тесты можно запустить с помощью команды run:

php vendor/bin/codecept run

С первым аргументом вы можете запустить все тесты из одного набора:

php vendor/bin/codecept run acceptance

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

php vendor/bin/codecept run acceptance SigninCest.php

В качестве альтернативы вы можете указать полный путь к файлу теста:

php vendor/bin/codecept run tests/acceptance/SigninCest.php

Вы можете ещё больше фильтровать, какие тесты запускать, добавив имя метода к классу, разделённому двоеточием (для форматов Cest или Test):

php vendor/bin/codecept run tests/acceptance/SigninCest.php:^anonymousLogin$

Вы также можете указать путь к каталогу. Это выполнит все приемочные тесты из каталога backend:

php vendor/bin/codecept run tests/acceptance/backend

Используя регулярные выражения, вы даже можете запустить несколько разных методов тестов из одного каталога или класса. Например, это выполнит все приемочные тесты из каталога backend начинающиеся со слова «login»:

php vendor/bin/codecept run tests/acceptance/backend:^login

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

Отчёты

Для генерации XML-вывода JUnit вы можете указать опцию --xml, а для HTML-отчёта — --html.

php vendor/bin/codecept run --steps --xml --html

Эта команда выполнит все тесты для всех наборов, отобразит шаги и создаст HTML- и XML-отчёты. Отчёты будут сохранены в каталоге tests/_output/.

Чтобы увидеть все доступные параметры, выполните следующую команду:

php vendor/bin/codecept help run

Отладка

Чтобы получить подробный вывод, тесты можно выполнить с опцией --debug. Вы можете вывести любую информацию внутри теста с помощью функции codecept_debug.

Генераторы

Существует множество полезных команд Codeception:

  • generate:cest suite filename — Генерирует пример теста Cest
  • generate:test suite filename — Генерирует пример теста PHPUnit с хуками Codeception
  • generate:feature suite filename — Генерирует файл Gherkin feature
  • generate:suite suite actor — Генерирует новый набор с заданным именем класса Актера
  • generate:scenarios suite — Генерирует текстовые файлы, содержащие сценарии из тестов
  • generate:helper filename — Генерирует пример файла Helper
  • generate:pageobject suite filename — Генерирует пример объекта Page
  • generate:stepobject suite filename — Генерирует пример объекта Step
  • generate:environment env — Генерирует пример конфигурации среды
  • generate:groupobject group — Генерирует пример расширения группы

Заключение

Мы рассмотрели структуру Codeception. Большая часть необходимых вам элементов уже была сгенерирована командой bootstrap. После изучения основных понятий и конфигураций вы можете начать писать свой первый сценарий.

  • Следующая глава: Приемочные тесты >
  • Предыдущая глава: < Введение

© 2011 Michael Bodnarchuk and contributors
Licensed under the MIT License.
https://codeception.com/docs/02-GettingStarted

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API