ApiTestCase — это PHPUnit TestCase, который значительно облегчит вашу жизнь как разработчика API Symfony. Он расширяет базовый Symfony WebTestCase некоторыми интересными функциями.
Благодаря PHP-Matcher вы можете, согласно его readme, «писать ожидаемые ответы в формате JSON, как гангстер». Мы определенно согласны.
Он также использует Alice для легкой загрузки фикстур Doctrine.
Функции:
Предполагая, что у вас уже установлен Composer глобально:
composer require --dev lchrusciel/api-test-case
И дело сделано! ApiTestCase работает с конфигурацией по умолчанию.
Мы предоставляем два базовых класса для ваших тестовых случаев: JsonApiTestCase и XmlApiTestCase. Выберите один в зависимости от формата API, который вы хотите создать.
Основной рабочий процесс TDD следующий:
assertResponse
чтобы проверить, соответствует ли содержимое ответа вашим ожиданиям. Вам нужно имя файла ответов;src/AppBundle/Tests/Responses/Expected/hello_world.json
.Давайте посмотрим простой пример! Напишите следующий тест:
namespace AppBundle Tests Controller HelloWorldTest ;
use ApiTestCase JsonApiTestCase ;
class HelloWorldTest extends JsonApiTestCase
{
public function testGetHelloWorldResponse ()
{
$ this -> client -> request ( ' GET ' , ' / ' );
$ response = $ this -> client -> getResponse ();
$ this -> assertResponse ( $ response , ' hello_world ' );
}
}
Теперь определите ожидаемый файл ответов:
{
"message" : " Hello ApiTestCase World! "
}
Запустите тесты:
vendor/bin/phpunit
Ваш тест должен завершиться неудачей с некоторыми ошибками. Вероятно, вам не хватает контроллера и маршрутизации, поэтому определите их! Как только вы реализуете свой контроллер и настроите соответствующую маршрутизацию, вы сможете снова запустить тесты:
Если содержимое ответа будет соответствовать нашим ожиданиям, консоль выдаст простое сообщение:
OK (1 tests, 2 assertions)
В противном случае он представит разницу полученных сообщений:
" Hello ApiTestCase World " does not match " Hello ApiTestCase World! " .
@@ -1,4 +1,3 @@
{
- " message " : " Hello ApiTestCase World! "
+ " message " : " Hello ApiTestCase World "
}
-
Во-первых, функция assertResponse
проверит код ответа (200 — код ответа по умолчанию), затем она проверит, содержит ли заголовок ответа тип контента application/json
. В конце он проверит, соответствует ли содержимое ответа ожиданиям. Иногда вы не можете предсказать некоторые значения в ответе, например автоматически сгенерированную дату или идентификатор из базы данных. Никакой магии здесь не нужно, потому что PHP-Matcher придет вам на помощь. Это лишь несколько примеров доступных шаблонов:
@string@
@integer@
@boolean@
@array@
Дополнительную информацию см. в документации PHP-Matcher.
С этими шаблонами ваш ожидаемый ответ будет выглядеть следующим образом:
{
"message" : " @string@ "
}
При этом любая строка под ключевым message
будет соответствовать шаблону. Более сложный ожидаемый ответ может выглядеть так:
[
{
"id" : " @integer@ " ,
"name" : " Star-Wars T-shirt " ,
"sku" : " SWTS " ,
"price" : 5500 ,
"sizes" : " @array@ " ,
"created_at" : " @[email protected]() "
},
{
"id" : " @integer@ " ,
"name" : " Han Solo Mug " ,
"sku" : " HSM " ,
"price" : 500 ,
"sizes" : " @array@ " ,
"created_at" : " @[email protected]() "
}
]
И будет соответствовать следующему списку продуктов:
array (
array (
' id ' => 1 ,
' name ' => ' Star-Wars T-shirt ' ,
' sku ' => ' SWTS ' ,
' price ' => 5500 ,
' sizes ' => array ( ' S ' , ' M ' , ' L ' ),
' created_at ' => new DateTime (),
),
array (
' id ' => 2 ,
' name ' => ' Han Solo Mug ' ,
' sku ' => ' HSM ' ,
' price ' => 500 ,
' sizes ' => array ( ' S ' , ' L ' ),
' created_at ' => new DateTime (),
),
)
ApiTestCase интегрирован с nelmio/alice
. Благодаря этой замечательной библиотеке вы можете легко загружать свои приборы, когда они вам понадобятся. Вам необходимо определить свои приборы и поместить их в соответствующий каталог. Вот несколько примеров того, как определить ваши светильники и вариант использования. Для получения дополнительной информации о том, как определить ваши приборы, обратитесь к документации Алисы.
Чтобы использовать Алису с Doctrine, вам следует включить два дополнительных пакета:
Симфония 4.0+
// config/bundles.php
return [
// ...
Nelmio Alice Bridge Symfony NelmioAliceBundle::class => [ ' test ' => true ],
Fidry AliceDataFixtures Bridge Symfony FidryAliceDataFixturesBundle::class => [ ' test ' => true ],
];
Теперь предположим, что в вашем приложении есть сопоставленная сущность Doctrine под названием Book:
class Book
{
private $ id ;
private $ title ;
private $ author ;
// ...
}
Чтобы загрузить фикстуры для теста, вам нужно определить простой файл YAML
в src/AppBundle/Tests/DataFixtures/ORM/books.yml
:
ApiTestCaseTestEntityBook :
book1 :
title : " Lord of The Rings "
author : " J. R. R. Tolkien "
book2 :
title : " Game of Thrones "
price : " George R. R. Martin "
Наконец, чтобы использовать эти фикстуры в тесте, просто вызовите подходящий метод:
public function testBooksIndexAction ()
{
// This method require subpath to locate specific fixture file in your DataFixtures/ORM directory.
$ this -> loadFixturesFromFile ( ' books.yml ' );
// There is another method that allows you to load fixtures from directory.
$ this -> loadFixturesFromDirectory ( ' big_library ' );
}
Чтобы настроить конфигурацию вашего набора тестов, вы можете добавить еще несколько параметров в phpunit.xml:
< php >
< server name = " KERNEL_CLASS " value = " AcmeKernel " />
< server name = " EXPECTED_RESPONSE_DIR " value = " /path/to/expected/responses/ " />
< server name = " FIXTURES_DIR " value = " /path/to/DataFixtures/ORM/ " />
< server name = " OPEN_ERROR_IN_BROWSER " value = " true/false " />
< server name = " OPEN_BROWSER_COMMAND " value = " open %s " />
< server name = " IS_DOCTRINE_ORM_SUPPORTED " value = " true/false " />
< server name = " TMP_DIR " value = " /tmp/path/to/temporary/folder/ " />
< server name = " ESCAPE_JSON " value = " true/false " />
</ php >
KERNEL_CLASS
позволяет вам точно указать, какой класс следует использовать для настройки ядра.ERESPONSE_DIR
содержит пути к папке с ожидаемыми ответами. Он используется при сравнении результата API с существующим файлом JSON. Если это значение не установлено, ApiTestCase попытается угадать расположение ответов, ища ответы в папке: «../Responses», расположенной относительно тестового класса вашего контроллера.FIXTURES_DIR
содержит путь к папке с вашими данными. По умолчанию, если эта переменная не установлена, она будет искать ../DataFixtures/ORM/
расположенную относительно вашего тестового класса. ApiTestCase выдает RunTimeException, если папка не существует или не будет файлов для загрузки.OPEN_ERROR_IN_BROWSER
— флаг, который включает отображение ошибки в окне браузера. Значение по умолчанию — ложь.OPEN_BROWSER_COMMAND
— это команда, которая будет использоваться для открытия браузера с исключением.IS_DOCTRINE_ORM_SUPPORTED
— это флаг, который включает поддержку доктрины, включая удобный загрузчик данных и очистку базы данных.TMP_DIR
содержит путь к временной папке, в которой будут храниться файлы журналов.ESCAPE_JSON
— это флаг, который включает экранирование (символы Юникода и косые черты) вашего вывода JSON перед сравнением его с ожидаемыми данными. Значение по умолчанию — ложь. Этот флаг существует только для обратной совместимости с предыдущими версиями ApiTestCase (если он включен) и будет удален в будущей версии. В каталоге test/
вы можете найти пример проекта Symfony с минимальной настройкой, необходимой для использования этой библиотеки.
Чтобы запустить наш набор тестов PHPUnit, выполните следующие команды:
composer install
test/app/console doctrine:database:create
test/app/console doctrine:schema:create
vendor/bin/phpunit
Если вы нашли ошибку или у вас есть отличная идея по улучшению, откройте проблему в этом репозитории.
Релизы будут нумероваться в формате major.minor.patch
.
И построен с учетом следующих рекомендаций.
Для получения дополнительной информации о SemVer посетите веб-сайт semver.org.
Лицензию можно найти здесь.
Первоначально библиотеку создали:
в компании Lakion в репозитории https://github.com/Lakion/ApiTestCase.
Смотрите список участников.