ApiTestCase是一个 PHPUnit 测试用例,它将让您作为 Symfony API 开发人员的生活变得更加轻松。它使用一些很酷的功能扩展了基本的 Symfony WebTestCase。
多亏了 PHP-Matcher,根据其自述文件,您可以“像黑帮一样编写预期的 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
内容类型。最后它会检查响应内容是否符合预期。有时您无法预测响应中的某些值,例如数据库中自动生成的日期或 ID。这里不需要魔法,因为 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
集成。感谢这个漂亮的库,您可以在需要时轻松加载您的灯具。您必须定义您的装置并将它们放置在适当的目录中。以下是如何定义固定装置和用例的一些示例。有关如何定义装置的更多信息,请查看 Alice 的文档。
为了将 Alice 与 Doctrine 结合使用,您应该启用两个额外的捆绑包:
交响乐 4.0+
// config/bundles.php
return [
// ...
Nelmio Alice Bridge Symfony NelmioAliceBundle::class => [ ' test ' => true ],
Fidry AliceDataFixtures Bridge Symfony FidryAliceDataFixturesBundle::class => [ ' test ' => true ],
];
现在,假设您的应用程序中有一个名为 Book 的映射 Doctrine 实体:
class Book
{
private $ id ;
private $ title ;
private $ author ;
// ...
}
要加载测试的固定装置,您需要在src/AppBundle/Tests/DataFixtures/ORM/books.yml
中定义一个简单的YAML
文件:
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
是一个打开浏览器窗口中显示错误的标志。默认值为 false。OPEN_BROWSER_COMMAND
是一个用于打开浏览器但出现异常的命令。IS_DOCTRINE_ORM_SUPPORTED
是一个打开学说支持的标志,包括方便的数据固定加载器和数据库清除器。TMP_DIR
变量包含临时文件夹的路径,其中将存储日志文件。ESCAPE_JSON
是一个标志,在将 JSON 输出与预期数据进行比较之前,它会打开 JSON 输出的转义(unicode 字符和斜杠)。默认值为 false。该标志的存在只是为了向后兼容以前版本的 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 存储库下。
请参阅贡献者列表。