hotel-quickly / nette-phpunit
Nette + PHPunit + 多数据库 + fixtures
Requires
- phpunit/dbunit: ^2.0
- phpunit/phpunit: ^5.1
Requires (Dev)
- nette/di: ^2.3
This package is not auto-updated.
Last update: 2024-09-14 18:26:12 UTC
README
- 支持多数据库连接
- 支持加载多种 fixtures 格式(每个连接)
入门指南
安装
运行以下命令以安装此软件包
composer require --dev hotel-quickly/nette-phpunit
用法
为了使用数据库测试用例,您必须从 HQ\Test\AbstractDbTestCase 扩展您的基类并实现以下 3 个方法
getContainer- 此方法将返回Nette\Di\Container实例。getConnections- 返回一个HQ\Test\Connection\AbstractConnection(connectionName, baseSchema, ...)连接对象的数组。
- connectionName - 数据库连接名称,将用作 fixtures 文件的前缀。
- baseSchema - 包含
CREATE TABLE ...SQL 语句的数据库模式。
getBaseFixtureDir- 返回搜索基本 fixtures 文件的基目录(参见
use HQ\Test\AbstractDbTestCase; use HQ\Test\Connection\NetteConnection; class YourBaseDbTestCase extends AbstractDbTestCase { protected function getContainer() { return require dirname(__DIR__) . '/app/bootstrap.php'; } protected function getConnections() { return [ new NetteConnection('default', __DIR__ . '/../tests/skeleton.sql', $this->container->getService('database.default.context')) ]; } public function getBaseFixtureDir() { return __DIR__; } }
处理 fixtures
加载 fixtures
默认情况下,fixtures 将自动从以下 3 个位置按顺序加载
基本 fixtures类 fixtures实例 fixtures
1. 基本 fixtures
这是所有测试用例都将加载的基本 fixtures(将其视为整个应用程序的初始数据)
test
+- YourBaseDbTestCase.php
+- <connection-name>-fixtures.{yaml, json, php} e.g. default-fixtures.json
2. 类 fixtures
每次调用测试用例时都会加载。
test
+- User
+- UserTest.php
+- <connection-name>-fixtures.{yaml, json, php} e.g. default-fixtures.json
3. 实例 fixtures
这与 class fixtures 几乎相同,只不过我们在 TestCase 本身内部定义了 fixtures(因此只支持 php array)。
class MyTest extends MyBaseDbTestCase { public function getFixtures() { return [ '<connection-name>' => [ ... ] ] } }
####Fixtures 格式 + 结构 此库目前支持 3 种 fixtures 格式,例如 json、yaml 和 php。所有格式都具有相同的 fixtures 结构,即
[
"<table-name>": [
[
"<field-name1>": "<value1>",
"<field-name2>": "<value2>"
],
...
]
]
json 示例
{ "user": [ {"username": "john"}, {"username": "jane"} ] }
yaml 示例
user: - username: john - username: jane
php 示例 - 注意 - 不要忘记放置 return 语句
return [ 'user' => [ ['username' => 'john'], ['username' => 'jane'], ] ]
提高测试速度
由于在测试开始时创建数据库模式的开销(仅一次),这可能会降低您的测试套件的运行速度。您可以通过导出 UNITTEST_CREATE_SCHEMA=false 环境变量,然后像平常一样运行单元测试来避免这个问题。这将使其跳过数据库模式创建开销。
常见问题
- InvalidArgumentException: 已存在名称为 account 的表,但表定义不同。
此错误表示您的 fixtures 对于相同的数据集(例如 table,例如 user)具有不同的列结构。例如,您有一个包含 user 表的 default-fixtures.yaml,它具有以下字段
user: - username: john
但在其他 fixtures 中,您有相同名称的用户表,但具有不同的字段,例如
user: - email: john
这将导致上述错误。要修复此问题,只需确保在每个 fixtures 上定义相同的字段。
- ErrorException: ini_set(): 无法更改 zlib.output_compression - headers already sent
当 Nette 在容器中启用了 php ini zlib.output_compression 时,会出现这种情况。在测试期间删除此配置将修复此错误