【问题标题】:How to create an in-memory database for PHPUnit testing?如何为 PHPUnit 测试创建内存数据库?
【发布时间】:2019-11-02 13:50:24
【问题描述】:

我是 PHPUnit(以及一般的单元测试)的新手。我想开发一个测试套件,开发人员可以在本地运行,但也可以在我们的集成系统(Codeship)中运行。我知道可以使用内存数据库,但这似乎依赖于我们没有使用的迁移(似乎不能很好地处理视图、存储过程、函数、触发器等?) .

1)在内存中创建数据库并使用默认数据(用于所有测试)为数据库播种的最佳方法是什么(放置在 Laravel 中)?

【问题讨论】:

标签: mysql laravel phpunit laravel-5.5


【解决方案1】:

您可以使用 SQLite。

来自文档:

SQLite 数据库通常存储在单个普通磁盘文件中。但是,在某些情况下,数据库可能存储在内存中。

将此添加到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 更改为您用于项目的数据库。

【讨论】:

  • 谢谢!看起来我会在这里遇到问题,因为我们的数据库使用了大量不同的数据类型,并且显然是 sqllite 不支持的其他结构。所以看来我实际上必须有一个可用的 mysql 数据库..
  • 您也可以使用travis ci 进行测试。如果您不想使用 sqlite,travis ci 允许您为测试配置像 mysql 和 pgsql(我通常使用的)这样的数据库。对于本地机器上的测试,我认为你可以毫无问题地使用 mysql。
【解决方案2】:

这不是您可能正在寻找的答案,而是更多需要考虑的替代解决方案。

根据我的经验,我发现阻力最小的途径是实际模拟您的模型(或查询构建器,如果您正在使用它)并让它们返回您需要的结果。

在开发测试时,您应该始终考虑可以从测试中完全删除哪些依赖项,这样您就可以只专注于您当时尝试测试的内容。

运行内存数据库与生产数据库的工作方式之间也可能存在细微差别(很可能非常轻微),这最终会损害测试的完整性,甚至可能最终给您带来错误 -积极的一面。如果您使用查询构建器,则尤其如此,并且您最终可能需要实际开发不同的查询(例如 MySQL 和 sqlite 之间的不同语法),具体取决于查询本身甚至可以工作的环境。

【讨论】:

  • 所以在这种情况下数据库交互根本没有经过测试?
  • 这真的取决于。如果您使用查询构建器编写自己的查询,那么您可能确实想以某种方式对其进行测试并继续使用实际的数据库(我建议设置一个您可以播种和测试的登台数据库服务器)。但是,如果你使用 Eloquent 方法和关系,则不需要测试这些交互,因为这些交互的测试已经由 Laravel 开发人员处理。模拟这些类型的依赖项以返回对您的测试有用的特定数据就足够了。
猜你喜欢
  • 1970-01-01
  • 2011-05-08
  • 2017-01-16
  • 2012-08-28
  • 2016-07-28
  • 1970-01-01
  • 2012-03-20
  • 2012-08-22
  • 2015-09-16
相关资源
最近更新 更多