如何为PHPUnit测试创建内存数据库?

时间:2019-06-19 18:53:59

标签: mysql laravel phpunit laravel-5.5

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

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

2 个答案:

答案 0 :(得分: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

您的应用程序将sqlite用于 phpunit

现在,您可以运行迁移并进行测试。之后,只需将DB_CONNECTION更改为用于项目的数据库即可。

答案 1 :(得分:1)

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

根据我的经验,我发现阻力最小的路径是实际模拟模型(如果正在使用,则模拟查询生成器),并让它们返回所需的结果。

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

在运行内存数据库与生产数据库的工作方式之间可能也会存在细微差别(很可能很小),这最终会损害测试的完整性,甚至可能导致错误的测试结果,积极的。如果您正在使用查询生成器,并且您可能最终需要根据查询本身甚至可以工作的环境来开发不同的查询(例如,MySQL和sqlite之间的语法不同),则尤其如此。