如何为 PHPUnit 测试创建内存数据库?
How to create an in-memory database for PHPUnit testing?
我是 PHPUnit(以及一般的单元测试)的新手。我想开发一个开发人员可以在本地 运行,但也可以在我们的集成系统 (Codeship) 中 运行 的测试套件。我知道可以使用内存数据库,但它似乎依赖于我们没有使用的迁移(似乎不能很好地处理视图、存储过程、函数、触发器等?) .
什么是最好的方法(放在 Laravel 中)1) 在内存中创建数据库并使用默认数据(用于所有测试)为数据库播种?
您可以使用 SQLite。
来自文档:
An SQLite database is normally stored in a single ordinary disk file. However, in certain circumstances, the database might be stored in memory.
将此添加到 config/database.php
文件:
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
在 phpunit.xml
文件上,在 <php>
节点下:
<env name="DB_CONNECTION" value="sqlite_testing" />
阅读更多here。
其他解决方案
在您的 storage/
文件夹上创建一个测试数据库,名称为 database.sqlite
,或者如果您想要另一个名称或另一个位置,您必须更改 config/database 上的配置。php 文件,这些是默认配置:
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path('database.sqlite'),
'prefix' => '',
],
使用此命令运行 您的迁移:
php artisan migrate --database=sqlite
或将此行添加到 .env
文件:
DB_CONNECTION=sqlite
您的应用程序正在为 phpunit.
使用 sqlite
现在您可以 运行 进行迁移和测试。之后,只需将 DB_CONNECTION
更改为您用于项目的数据库。
这不是您正在寻找的答案,而是更多可供考虑的替代解决方案。
根据我的经验,我发现阻力最小的方法是实际模拟您的模型(或查询构建器,如果您正在使用它)并让它们 return 得到您需要的结果。
在开发测试时,您应该始终考虑可以从测试中完全删除哪些依赖项,这样您就可以专注于当时要测试的内容。
运行 和 in-memory 数据库与生产数据库的工作方式之间也可能存在细微差别(很可能非常小),这最终会损害测试的完整性和甚至可能最终给你 false-positives。如果您使用的是查询构建器,则尤其如此,并且您可能最终需要实际开发不同的查询(例如 MySQL 和 sqlite 之间的不同语法),具体取决于您查询本身甚至可以工作的环境。
我是 PHPUnit(以及一般的单元测试)的新手。我想开发一个开发人员可以在本地 运行,但也可以在我们的集成系统 (Codeship) 中 运行 的测试套件。我知道可以使用内存数据库,但它似乎依赖于我们没有使用的迁移(似乎不能很好地处理视图、存储过程、函数、触发器等?) .
什么是最好的方法(放在 Laravel 中)1) 在内存中创建数据库并使用默认数据(用于所有测试)为数据库播种?
您可以使用 SQLite。
来自文档:
An SQLite database is normally stored in a single ordinary disk file. However, in certain circumstances, the database might be stored in memory.
将此添加到 config/database.php
文件:
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
在 phpunit.xml
文件上,在 <php>
节点下:
<env name="DB_CONNECTION" value="sqlite_testing" />
阅读更多here。
其他解决方案
在您的 storage/
文件夹上创建一个测试数据库,名称为 database.sqlite
,或者如果您想要另一个名称或另一个位置,您必须更改 config/database 上的配置。php 文件,这些是默认配置:
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path('database.sqlite'),
'prefix' => '',
],
使用此命令运行 您的迁移:
php artisan migrate --database=sqlite
或将此行添加到 .env
文件:
DB_CONNECTION=sqlite
您的应用程序正在为 phpunit.
使用 sqlite现在您可以 运行 进行迁移和测试。之后,只需将 DB_CONNECTION
更改为您用于项目的数据库。
这不是您正在寻找的答案,而是更多可供考虑的替代解决方案。
根据我的经验,我发现阻力最小的方法是实际模拟您的模型(或查询构建器,如果您正在使用它)并让它们 return 得到您需要的结果。
在开发测试时,您应该始终考虑可以从测试中完全删除哪些依赖项,这样您就可以专注于当时要测试的内容。
运行 和 in-memory 数据库与生产数据库的工作方式之间也可能存在细微差别(很可能非常小),这最终会损害测试的完整性和甚至可能最终给你 false-positives。如果您使用的是查询构建器,则尤其如此,并且您可能最终需要实际开发不同的查询(例如 MySQL 和 sqlite 之间的不同语法),具体取决于您查询本身甚至可以工作的环境。