REST
Установка
Если вы используете Codeception, установленный с помощью Composer, установите этот модуль с помощью следующей команды:
composer require --dev codeception/module-rest
В качестве альтернативы, вы можете включить REST модуль в файле конфигурации набора и запустить
codecept init upgrade4
Этот модуль был включён в Codeception 2 и 3, но начиная с версии 4 его необходимо устанавливать отдельно.
Некоторые модули поставляются с файлами PHAR.
Предупреждение. Использование файла PHAR и Composer в одном проекте может привести к непредвиденным ошибкам.
Описание
Модуль для тестирования REST WebService.
Этот модуль требует либо PhpBrowser, либо модуль фреймворка (например, Symfony, Laravel) для отправки фактического HTTP запроса.
Настройка
-
urlнеобязательно - URL API -
shortDebugResponseнеобязательно - количество символов для ограничения длины ответа API
Пример
modules:
enabled:
- REST:
depends: PhpBrowser
url: 'https://example.com/api/v1/'
shortDebugResponse: 300 # only the first 300 characters of the response В случае необходимости конфигурации HTTP-заголовков низкого уровня, это делается на уровне PhpBrowser следующим образом:
modules:
enabled:
- REST:
depends: PhpBrowser
url: &url 'https://example.com/api/v1/'
config:
PhpBrowser:
url: *url
headers:
Content-Type: application/json JSONPath
JSONPath эквивалентен XPath для запроса данных JSON-структур. Вот онлайн-тестер выражений JSONPath
Публичные свойства
- headers - массив заголовков, которые будут отправлены.
- params - массив отправленных данных
- response - последний ответ (строка)
Части
- Json - действия для проверки ответов Json (без ответов Xml)
- Xml - действия для проверки ответов XML (без ответов Json)
Конфликты
Конфликтует с модулем SOAP
Действия
amAWSAuthenticated
Позволяет отправлять REST-запросы с использованием авторизации AWS
Работает только с PhpBrowser Пример конфигурации:
yml
modules:
enabled:
- REST:
aws:
key: accessKey
secret: accessSecret
service: awsService
region: awsRegion Код:
<?php $I->amAWSAuthenticated(); ?>
-
param array$additionalAWSConfig @throws ConfigurationException
amBearerAuthenticated
Добавляет авторизацию Bearer через токен доступа.
-
param$accessToken -
[Part]json -
[Part]xml
amDigestAuthenticated
Добавляет авторизацию Digest через имя пользователя/пароль.
-
param$username -
param$password -
[Part]json -
[Part]xml
amHttpAuthenticated
Добавляет HTTP-аутентификацию через имя пользователя/пароль.
-
param$username -
param$password -
[Part]json -
[Part]xml
amNTLMAuthenticated
Добавляет аутентификацию NTLM через имя пользователя/пароль. Требует, чтобы клиент был Guzzle >=6.3.0. Не входит в функциональные модули.
Пример:
<?php
$I->amNTLMAuthenticated('jon_snow', 'targaryen');
?> -
param$username -
param$password @throws ModuleException -
[Part]json -
[Part]xml
deleteHeader
Удаляет HTTP-заголовок (который был первоначально добавлен методом haveHttpHeader()), чтобы последующие запросы больше его не отправляли.
Пример:
<?php
$I->haveHttpHeader('X-Requested-With', 'Codeception');
$I->sendGet('test-headers.php');
// ...
$I->deleteHeader('X-Requested-With');
$I->sendPost('some-other-page.php');
?> -
param string$name имя заголовка для удаления. -
[Part]json -
[Part]xml
dontSeeBinaryResponseEquals
Проверяет, что хэш двоичного ответа не совпадает с предоставленным.
<?php
$I->dontSeeBinaryResponseEquals("8c90748342f19b195b9c6b4eff742ded");
?> Противоположность seeBinaryResponseEquals
-
param string$hash ожидаемый хэшированный ответ -
param string$algo алгоритм хэширования. По умолчанию md5. -
[Part]json -
[Part]xml
dontSeeHttpHeader
Проверяет, что данный HTTP-заголовок (и его значение, если указано) отсутствует.
-
param$name -
param$value -
[Part]json -
[Part]xml
dontSeeResponseCodeIs
Проверяет, что код ответа не равен указанному значению.
<?php $I->dontSeeResponseCodeIs(200); // preferred to use \Codeception\Util\HttpCode $I->dontSeeResponseCodeIs(\Codeception\Util\HttpCode::OK);
-
[Part]json -
[Part]xml -
param$code
dontSeeResponseContains
Проверяет, что последний ответ не содержит указанный текст.
-
param$text -
[Part]json -
[Part]xml
dontSeeResponseContainsJson
Противоположно seeResponseContainsJson
-
[Part]json -
param array$json
dontSeeResponseJsonMatchesJsonPath
См. #jsonpath для общей информации о JSONPath. Противоположно seeResponseJsonMatchesJsonPath()
-
param string$jsonPath -
[Part]json
dontSeeResponseJsonMatchesXpath
Противоположно seeResponseJsonMatchesXpath
-
param string$xpath -
[Part]json
dontSeeResponseMatchesJsonType
Противоположно seeResponseMatchesJsonType.
-
[Part]json -
param array$jsonType Структура JsonType -
param string$jsonPath @see seeResponseMatchesJsonType
dontSeeXmlResponseEquals
Проверяет, что ответ XML не равен предоставленному XML. Сравнение выполняется путём канонизации обоих XML.
Параметр может быть передан в виде XmlBuilder, DOMDocument, DOMNode, XML-строки или массива (если нет атрибутов).
-
param$xml -
[Part]xml
dontSeeXmlResponseIncludes
Проверяет, что ответ XML не включает предоставленный XML. Сравнение выполняется путём канонизации обоих XML. Параметр может быть передан в виде XmlBuilder, DOMDocument, DOMNode, XML-строки или массива (если нет атрибутов).
-
param$xml -
[Part]xml
dontSeeXmlResponseMatchesXpath
Проверяет, что ответ XML не соответствует XPath
<?php
$I->dontSeeXmlResponseMatchesXpath('//root/user[@id=1]'); -
[Part]xml -
param$xpath
grabAttributeFromXmlElement
Находит и возвращает атрибут элемента. Элемент соответствует либо CSS, либо XPath.
-
param$cssOrXPath -
param$attribute return string-
[Part]xml
grabDataFromResponseByJsonPath
См. #jsonpath для общей информации о JSONPath. Даже для одного значения возвращается массив. Пример:
<?php
// match the first `user.id` in json
$firstUserId = $I->grabDataFromResponseByJsonPath('$..users[0].id');
$I->sendPut('/user', array('id' => $firstUserId[0], 'name' => 'davert'));
?> -
param string$jsonPath -
return arrayМассив соответствующих элементов @throws \Exception -
[Part]json
grabHttpHeader
Возвращает значение указанного имени заголовка.
-
param$name -
param Boolean$first Возвращать ли первое значение или все значения заголовка -
return string|array The first header value if$first, если true, массив значений, иначе одно значение -
[Part]json -
[Part]xml
grabResponse
Возвращает текущий ответ, чтобы он мог быть использован в следующих шагах сценария.
Пример:
<?php
$user_id = $I->grabResponse();
$I->sendPut('/user', array('id' => $user_id, 'name' => 'davert'));
?> return string-
[Part]json -
[Part]xml
grabTextContentFromXmlElement
Находит и возвращает текстовое содержимое элемента. Элемент соответствует либо CSS, либо XPath.
-
param$cssOrXPath return string-
[Part]xml
haveHttpHeader
Устанавливает HTTP-заголовок, который будет использоваться во всех последующих запросах. Используйте deleteHeader, чтобы его удалить.
<?php
$I->haveHttpHeader('Content-Type', 'application/json');
// all next requests will contain this header
?> -
param$name -
param$value -
[Part]json -
[Part]xml
haveServerParameter
Устанавливает параметр SERVER, действительный для всех последующих запросов.
$I->haveServerParameter('name', 'value'); seeBinaryResponseEquals
Проверяет, что хэш двоичного ответа точно такой же, как предоставленный. Параметр может быть передан как любая строка хэша, поддерживаемая функцией hash(), с необязательным вторым параметром для указания типа хэша, который по умолчанию равен md5.
Пример: Использование ключа хэша md5
<?php
$I->seeBinaryResponseEquals("8c90748342f19b195b9c6b4eff742ded");
?> Пример: Использование md5 для содержимого файла
<?php
$fileData = file_get_contents("test_file.jpg");
$I->seeBinaryResponseEquals(md5($fileData));
?> Пример: Использование хэша sha256
<?php
$fileData = '/9j/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/yQALCAABAAEBAREA/8wABgAQEAX/2gAIAQEAAD8A0s8g/9k='; // very small jpeg
$I->seeBinaryResponseEquals(hash("sha256", base64_decode($fileData)), 'sha256');
?> -
param string$hash ожидаемый хэшированный ответ -
param string$algo алгоритм хэширования. По умолчанию md5. -
[Part]json -
[Part]xml
seeHttpHeader
Проверяет наличие заданного HTTP-заголовка (и его значения, если указано).
-
param$name -
param$value -
[Part]json -
[Part]xml
seeHttpHeaderOnce
Проверяет, что HTTP-заголовок ответа получен только один раз. HTTP RFC2616 допускает несколько заголовков ответа с одинаковым именем. Вы можете проверить, что вы случайно не отправили один и тот же заголовок дважды.
<?php
$I->seeHttpHeaderOnce('Cache-Control');
?>> -
param$name -
[Part]json -
[Part]xml
seeResponseCodeIs
Проверяет, что код ответа равен предоставленному значению.
<?php $I->seeResponseCodeIs(200); // preferred to use \Codeception\Util\HttpCode $I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK);
-
[Part]json -
[Part]xml -
param$code
seeResponseCodeIsClientError
Проверяет, что код ответа — 4xx
-
[Part]json -
[Part]xml
seeResponseCodeIsRedirection
Проверяет, что код ответа — 3xx
-
[Part]json -
[Part]xml
seeResponseCodeIsServerError
Проверяет, что код ответа — 5xx
-
[Part]json -
[Part]xml
ПроверкаКодаОтветаНаУспех
Проверяет, что код ответа равен 2xx
-
[Part]json -
[Part]xml
ПроверкаНаличиеТекстаВОтвете
Проверяет, содержит ли последний ответ текст.
-
param$text -
[Part]json -
[Part]xml
ПроверкаНаличияJSONМассиваВОтвете
Проверяет, содержит ли последний JSON-ответ предоставленный массив. Ответ преобразуется в массив с помощью json_decode($response, true). Таким образом, JSON представлен ассоциативным массивом. Этот метод проверяет, что массив ответа содержит предоставленный массив.
Примеры:
<?php
// response: {name: john, email: john@gmail.com}
$I->seeResponseContainsJson(array('name' => 'john'));
// response {user: john, profile: { email: john@gmail.com }}
$I->seeResponseContainsJson(array('email' => 'john@gmail.com'));
?> Этот метод рекурсивно проверяет, можно ли найти один массив внутри другого.
-
param array$json -
[Part]json
ПроверкаРавенстваОтвета
Проверяет, является ли ответ точно таким же, как предоставленный.
-
[Part]json -
[Part]xml -
param$response
ПроверкаВадидностиJSONОтвета
Проверяет, был ли последний ответ валидным JSON. Это делается с помощью функции json_last_error.
-
[Part]json
ПроверкаСоответствияОтветаJSONСхеме
Проверяет, соответствует ли последний ответ предоставленной JSON-схеме (https://json-schema.org/). Укажите путь к схеме относительно корня проекта или абсолютный путь.
@see codecept_absolute_path()
-
param string$schemaFilename -
[Part]json
ПроверкаСоответствияОтветаJSONСхеме(строка)
Проверяет, соответствует ли последний ответ предоставленной JSON-схеме (https://json-schema.org/). Укажите схему в виде JSON-строки.
Примеры:
<?php
// response: {"name": "john", "age": 20}
$I->seeResponseIsValidOnJsonSchemaString('{"type": "object"}');
// response {"name": "john", "age": 20}
$schema = [
"properties" => [
"age" => [
"type" => "integer",
"minimum" => 18
]
]
];
$I->seeResponseIsValidOnJsonSchemaString(json_encode($schema));
?> -
param string$schema -
[Part]json
ПроверкаВадидностиXMLОтвета
Проверяет, был ли последний ответ валидным XML. Это делается с помощью функции libxml_get_last_error.
-
[Part]xml
ПроверкаСоответствияJSONОтветаJSONPath
См. #jsonpath для общей информации о JSONPath. Проверяет, соответствует ли структура JSON в ответе JSONPath.
{ "store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
} <?php
// at least one book in store has author
$I->seeResponseJsonMatchesJsonPath('$.store.book[*].author');
// first book in store has author
$I->seeResponseJsonMatchesJsonPath('$.store.book[0].author');
// at least one item in store has price
$I->seeResponseJsonMatchesJsonPath('$.store..price');
?> -
param string$jsonPath -
[Part]json
ПроверкаСоответствияJSONОтветаXPath
Проверяет, соответствует ли структура JSON в ответе предоставленному XPath. JSON не должен проверяться по XPath, но его можно преобразовать в xml и использовать с XPath. Это утверждение позволяет проверить структуру ответа json. *
{ "store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
} <?php
// at least one book in store has author
$I->seeResponseJsonMatchesXpath('//store/book/author');
// first book in store has author
$I->seeResponseJsonMatchesXpath('//store/book[1]/author');
// at least one item in store has price
$I->seeResponseJsonMatchesXpath('/store//price');
?> -
param string$xpath -
[Part]json
ПроверкаСоответствияJSONТипу
Проверяет, что JSON соответствует предоставленным типам. В случае, если вы не знаете фактических значений возвращенных данных JSON, вы можете сопоставить их по типу. Проверка начинается с корневого элемента. Если данные JSON представляют собой массив, он проверит все элементы массива. Вы можете указать путь в JSON, который нужно проверить с помощью JsonPath
Базовый пример:
<?php
// {'user_id': 1, 'name': 'davert', 'is_active': false}
$I->seeResponseMatchesJsonType([
'user_id' => 'integer',
'name' => 'string|null',
'is_active' => 'boolean'
]);
// narrow down matching with JsonPath:
// {"users": [{ "name": "davert"}, {"id": 1}]}
$I->seeResponseMatchesJsonType(['name' => 'string'], '$.users[0]');
?> Вы можете проверить, содержит ли запись поля с ожидаемыми типами данных. Список возможных типов данных:
- строка
- целое число
- вещественное число
- массив (объект json тоже массив)
- булево значение
- null
Вы также можете использовать вложенные структуры типов данных и определять несколько типов для одного поля:
<?php
// {'user_id': 1, 'name': 'davert', 'company': {'name': 'Codegyre'}}
$I->seeResponseMatchesJsonType([
'user_id' => 'integer|string', // multiple types
'company' => ['name' => 'string']
]);
?> Вы также можете применять фильтры для проверки значений. Фильтр может быть применен с символом : после объявления типа или после другого фильтра, если вам нужно больше одного.
Вот список возможных фильтров:
-
integer:>{val}- проверяет, что целое число больше {val} (работает и с вещественными числами и строками). -
integer:<{val}- проверяет, что целое число меньше {val} (работает и с вещественными числами и строками). -
string:url- проверяет, является ли значение допустимым URL. -
string:date- проверяет, является ли значение датой в формате JavaScript: https://weblog.west-wind.com/posts/2014/Jan/06/JavaScript-JSON-Date-Parsing-and-real-Dates -
string:email- проверяет, является ли значение допустимым адресом электронной почты в соответствии с http://emailregex.com/ -
string:regex({val})- проверяет, соответствует ли строка предоставленному регулярному выражению с {val}
Вот как можно использовать фильтры:
<?php
// {'user_id': 1, 'email' => 'davert@codeception.com'}
$I->seeResponseMatchesJsonType([
'user_id' => 'string:>0:<1000', // multiple filters can be used
'email' => 'string:regex(~\@~)' // we just check that @ char is included
]);
// {'user_id': '1'}
$I->seeResponseMatchesJsonType([
'user_id' => 'string:>0', // works with strings as well
]);
?> Вы также можете добавить пользовательские фильтры, используя {@link JsonType::addCustomFilter()}. См. Справочник по JsonType.
-
[Part]json -
param array$jsonType -
param string$jsonPath @see JsonType
ПроверкаРавенстваXMLОтвета
Проверяет, равен ли ответ XML предоставленному XML. Сравнение выполняется путем канонизации обоих XML.
Параметры могут быть переданы в виде DOMDocument, DOMNode, XML-строки или массива (если нет атрибутов).
-
param$xml -
[Part]xml
ПроверкаВключенияXMLОтвета
Проверяет, содержит ли ответ XML предоставленный XML. Сравнение выполняется путем канонизации обоих XML. Параметр может быть передан либо как XmlBuilder, DOMDocument, DOMNode, XML-строка или массив (если нет атрибутов).
Пример:
<?php
$I->seeXmlResponseIncludes("<result>1</result>");
?> -
param$xml -
[Part]xml
ПроверкаСоответствияXMLОтветаXPath
Проверяет, соответствует ли ответ XML предоставленному XPath
<?php
$I->seeXmlResponseMatchesXpath('//root/user[@id=1]'); -
[Part]xml -
param$xpath
ОтправкаHTTPЗапроса
Отправляет HTTP-запрос.
-
param$method -
param$url -
param array|string|\JsonSerializable$params -
param array$files -
[Part]json -
[Part]xml
ОтправкаЗапросаDELETE
Отправляет запрос DELETE на указанный URI.
-
param$url -
param array$params -
param array$files -
[Part]json -
[Part]xml
ОтправкаЗапросаGET
Отправляет запрос GET на указанный URI.
-
param$url -
param array$params -
[Part]json -
[Part]xml
ОтправкаЗапросаHEAD
Отправляет запрос HEAD на указанный URI.
-
param$url -
param array$params -
[Part]json -
[Part]xml
ОтправкаЗапросаLINK
Отправляет запрос LINK на указанный URI.
-
param$url -
param array$linkEntries (элемент — массив с ключами “uri” и “link-param”)
@link http://tools.ietf.org/html/rfc2068#section-19.6.2.4
@author samva.ua@gmail.com
-
[Part]json -
[Part]xml
ОтправкаЗапросаOPTIONS
Отправляет запрос OPTIONS на указанный URI.
-
param$url -
param array$params -
[Part]json -
[Part]xml
ОтправкаЗапросаPATCH
Отправляет запрос PATCH на указанный URI.
-
param$url -
param array|string|\JsonSerializable$params -
param array$files -
[Part]json -
[Part]xml
ОтправкаЗапросаPOST
Отправляет запрос POST на указанный URI. Параметры и файлы могут быть предоставлены отдельно.
Пример:
<?php
//simple POST call
$I->sendPost('/message', ['subject' => 'Read this!', 'to' => 'johndoe@example.com']);
//simple upload method
$I->sendPost('/message/24', ['inline' => 0], ['attachmentFile' => codecept_data_dir('sample_file.pdf')]);
//uploading a file with a custom name and mime-type. This is also useful to simulate upload errors.
$I->sendPost('/message/24', ['inline' => 0], [
'attachmentFile' => [
'name' => 'document.pdf',
'type' => 'application/pdf',
'error' => UPLOAD_ERR_OK,
'size' => filesize(codecept_data_dir('sample_file.pdf')),
'tmp_name' => codecept_data_dir('sample_file.pdf')
]
]);
// If your field names contain square brackets (e.g. `<input type="text" name="form[task]">`),
// PHP parses them into an array. In this case you need to pass the fields like this:
$I->sendPost('/add-task', ['form' => [
'task' => 'lorem ipsum',
'category' => 'miscellaneous',
]]); -
param$url -
param array|string|\JsonSerializable$params -
param array$files Список имен файлов или «моков» $_FILES (каждый элемент — массив со следующими ключами: name, type, error, size, tmp_name (указывает на реальный путь к файлу). Каждый ключ работает как атрибут «name» поля ввода файла.
@see http://php.net/manual/en/features.file-upload.post-method.php @see codecept_data_dir()
-
[Part]json -
[Part]xml
ОтправкаЗапросаPUT
Отправляет запрос PUT на указанный URI.
-
param$url -
param array|string|\JsonSerializable$params -
param array$files -
[Part]json -
[Part]xml
ОтправкаЗапросаUNLINK
Отправляет запрос UNLINK на указанный URI.
-
param$url -
param array$linkEntries (элемент — массив с ключами “uri” и “link-param”) @link http://tools.ietf.org/html/rfc2068#section-19.6.2.4 @author samva.ua@gmail.com -
[Part]json -
[Part]xml
УстановитьПараметрыСервера
Устанавливает параметры SERVER, действующие для всех последующих запросов. Это удалит старые.
$I->setServerParameters([]);
НачатьОтслеживаниеПеренаправлений
Включает автоматическое отслеживание перенаправлений клиентом
<?php $I->startFollowingRedirects();
-
[Part]xml -
[Part]json
ОстановитьОтслеживаниеПеренаправлений
Запрещает автоматическое отслеживание перенаправлений клиентом
<?php $I->stopFollowingRedirects();
-
[Part]xml -
[Part]json
© 2011 Michael Bodnarchuk and contributors
Licensed under the MIT License.
https://codeception.com/docs/modules/REST