如何为 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 之间的不同语法),具体取决于您查询本身甚至可以工作的环境。