Тестирование API : Установка и использование Codeception

Установка

Существует несколько методов установки codeception. Мы воспользуемся composer для этой цели, вы, конечно, можете выбрать любой удобный для вам метод.

Для начала перейдем в каталог куда вы хотите установить codeception и где будут храниться ваши тесты. В моем случае - app1.

composer require "codeception/codeception:*"

или

php composer.phar require "codeception/codeception:*"

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

vendor/bin/codeception --version

Настройка codeception:

Следует выполнить предварительную настройку codeception. Выполните следующую команду из корневого каталога приложения (app1).

vendor/bin/codeception bootstrap

Будет создан каталог tests. В нем вы будете хранить свои тесты. Так же в нем будут подкаталоги acceptance, functional, unit. Как вы понимаете, в них будут разные типы тестов. Нам понадобится тип тестирования API, создадим его:

vendor/bin/codecept generate:suite api

Итак, мы видим каталог api, в нем мы, соответственно, будем держать API тесты. Прежде чем продолжить, давайте избавимся от длинного пути vendor/bin/codeception и заменим его просто на codeception.

При работе на Линукс лучше установить codeception глобально, чтобы можно было использовать команду без полного пути к исполняемому файлу. Можно это следать следующим образом: …..какая-то сылка….

На windows просто добавьте путь к файлу в системную переменную PATH. Итак, теперь вы можете просто вызывать codeception. Попробуйте выполнить следующую команду где угодно в вашей системе:

codecept --version

Теперь давайте взглянем на структуру каталогов codeception.

Структура каталогов codeception

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

  • _data - может содержать файлы DB при необходимости.
  • _output - содержит вывод тестов и их результат.
  • _support - содержит файлы помощи к тестам.
  • acceptance - содержит приёмные тесты.
  • api - содержит API тесты. По-умолчанию отсутствует, для её создания воспользуйтесь командой generate:suite.
  • functional - содержит функциональные тесты.
  • unit - содержит юнит тесты
  • _bootstrap.php - файл для автоматической подгрузки стороних библиотек.
  • acceptance.suite.yml - настройка приёмочных тестов.
  • api.suite.yml - настройка api тестов.
  • functional.suite.yml - настройка функциональных тестов.
  • unit.suite.yml - настройка юнит тестов.

Так же в каталоге api вы найдете файл _bootstrap.php. Он используется для загрузки библиотек в пределах api тестирования.

Настройка API тестов:

Добавьте параметр PhpBrowser и Url в файл api.suite.yml:

class_name: ApiTester
modules:
    enabled: [ApiHelper, PhpBrowser, REST]
    config:
        PhpBrowser:
            url: http://localhost/app

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

Laravel или PhpBrowser

При работе с Laravel добавляйте модуль Laravel вместо PhpBrowser. При возникновении ошибки, описание исключения (exception) будет более понятно, что нельзя сказать о PhpBrowser, где вы увидите просто ошибку 500. Раньше я работал с Laravel, но из-за того, что PhpBrowser более быстр, я переключился на него. Если на вашей машине достаточно оперативной памяти, скорость их исполнения вас не сильно волнует, а всего их до 50ти штук, то тогда можно использовать Laravel. В целом, выбор за вами.

Написание теста:

Существует два способа написания тестов, основываясь на два типа файлов. Cept и Cest. Cept строится по сценарию, а Cest на базе классов. Выбор зависит от того, как вы привыкли писать код - структурный подход или классовый. Я предпочитаю и советую использовать классовый подход, так как он дает все преимущества ООП.

Создадим первый Cest файл с помощью следующей команды:

codecept generate:cest api CreateUser

Откройте его и добавьте код:

<?php

use \ApiTester;

class CreateUserCest 
{
    public function _before(ApiTester $I) 
    {
    }

    public function _after(ApiTester $I) 
    {
    }

    // tests
    public function createNewUser(ApiTester $I) 
    {
        $I->wantTo('create a user via API');
        $I->amHttpAuthenticated('service_user', '123456');
        $I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
        $I->sendPOST('users', ['name' => 'davert', 'email' => 'davert@codeception.com']);
        $I->seeResponseCodeIs(200);
        $I->seeResponseIsJson();
        $I->seeResponseContains('{"result":"ok"}');
    }
}

Переменная $I содержит ссылку на объект типа ApiTester - представление пользователя, исполняющего сценарий теста.

Выполнение теста:

До первого выполнения API теста, файл api tester отсутствует в каталоге api. Его следует создать командой:

codecept build

Затем:

codecept run api

Вы увидите ошибку если по указанному URL нет обработчика. Для более подробного вывода информации используйте ключи -vv или -vvv при выполнении теста.

codecept run api -vv

Более подробную информацию о codeception вы найдете в официальной документации.

Если вас интересуют автоматическое тестирование, лучшие способы тестирования, как и зачем писать тесты я советую прочитать Тестирование в Laravel Jeffrey Way. Если вы работает с PHP, то я еще больше рекомендую прочитать эту книгу, вы, наверняка, найдете в ней много полезного.

Вы скорее всего знакомы с книгой Jeffrey Laracast, в ней описаны лучшие методы тестировании и подходы к разработке с применением тестирования.

Статьи из серии

Комментарии

2
Макаренко Сергей, 2 года назад
1

Добрый день! Заметил в листинге класса CreateUser опечатку в последней строке ($I->;seeResponseContains('{"result":"ok"}');), лишняя точка с запятой в середине. Должно быть так: $I->seeResponseContains('{"result":"ok"}'); Также, возможно это только у меня, столкнулся с проблемой парсинга конфига из файла api.suite.yml. Методом проб и ошибок понял, что количество отступов в каждой строке имеет значение. В моем случае при форматировании с отступом в 4 пробела парсер вываливался с исключением: [Symfony\Component\Yaml\Exception\ParseException]
Unable to parse at line 4 (near " config:"). Ну и на протяжении чтения этой статьи мой конфиг api.suite.yml превратился вот в такой: class_name: ApiTester modules: enabled:

  • REST: depends: PhpBrowser url: http://localhost/app только после этого все стало корректно отрабатывать.
devacademy, 2 года назад
0

исправлено