首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5内存测试

Laravel 5内存测试
EN

Stack Overflow用户
提问于 2015-08-14 21:17:19
回答 2查看 3.6K关注 0票数 5

我正在为我的大型Laravel 5项目通过behat编写测试。

我在MySQL中有我的MySQL数据库的测试副本,还有一个用于该数据库的种子器,它共享一些其他环境的种子器。所有这些都如预期的那样起作用。

然而,我尝试使用sqlite内存中的数据库,因为它将大大加快我的自动化测试速度,并且因为我正在运行"artsian迁移:刷新--种子器=TestDatabaseSeeder“,在每个behat场景的开始。

我遇到的问题是,我的一些种子数据会导致sqlite抛出一个非常难以描述的语法错误,但是MySQL完全可以处理种子数据。

我认为,理想情况下,为了性能目的,我希望它使用内存中的MySQL,并保持数据库引擎的一致性。在运行测试时,是否有一种在内存中使用MySQL的简单方法?一种不涉及复制和编辑迁移文件的解决方案,它可以使sqlite高兴吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-08 16:58:20

原来,sqlite不喜欢逃跑的方式。

"\'“需要用‘”代替。并且sqlite不支持枚举,所以我改变了迁移,使用字符串而不是枚举。

票数 -1
EN

Stack Overflow用户

发布于 2019-07-27 06:06:48

从2019年起,这里是让Laravel PHPunit测试使用内存中DB的方法。

为Laravel / Lumen测试设置内存中的SQLite

你必须具备以下条件:

  1. 数据库中所有表和文件的所有数据库迁移(通常用于实际DB ),请参见拉勒维尔移民官方文件
  2. 在您的RefreshDatabase测试类(官方文件)中使用PHPUnit特性(用于Lumen的DatabaseMigrations特性)。
  3. config/database.php文件中的connection setion中设置以下内容:
代码语言:javascript
复制
    'testing' => [
        'driver' => 'sqlite',
        'database' => ':memory:',
    ],
  1. phpunit.xml文件中的<php>部分中设置以下行:
代码语言:javascript
复制
    <env name="DB_CONNECTION" value="testing"/>

因此,一旦运行PHPUnit测试,PHPUnit就会读取phpunit.xml,将.envDB_CONNECTION变量替换为testing,它将触发要使用的DB configuration testing (这是内存中的sqlite )。

内存中的DB与磁盘DB的测试(根据我的经验)要快5-30倍。30倍的差别是对于大约200个CRUD测试的小测试套件,所有运行在6个表上的DB查询都有一些hasManybelongsToMany枢轴关系。

每次测试刷新数据库

要运行数据库迁移,在每次测试前拥有一个干净的数据库添加了测试类(Laravel)顶部的以下特性:

代码语言:javascript
复制
use Illuminate\Foundation\Testing\RefreshDatabase;
// ... then in the class body:
use RefreshDatabase;

对于Lumen 它应该是

代码语言:javascript
复制
use Laravel\Lumen\Testing\DatabaseMigrations;
// ...then
use DatabaseMigrations;

如果需要的话,不要忘记使用模型工厂为DB添加测试数据。

是的,迁移将在每次测试之前和之后运行,因此在测试完成后,您的开始和结束都将使用干净的数据库(如果您用一些数据播撒磁盘上的DB,并偶尔切换测试以在其上运行,而不是在内存中的DB上运行,这将产生影响)。

修正SQLite Cannot add a NOT NULL column with default value NULL错误

现在,您已经成功地为应用程序设置了内存中的DB管理。当您尝试使用外键对一些相关表进行级联更改时,会出现上述错误。

如果您迅速将测试切换到磁盘上的DB (在您的<env name="DB_CONNECTION" value="testing"/>文件中注释掉phpunit.xml ),错误就会消失。切换回内存DB后,检查磁盘上DB是否为空。如果是这样的话,请使用migrate:refreshdb:seed (这里假设您已经提前准备了所需的DB种子)和artisan

默认情况下,SQLite禁用外键。将以下代码段添加到PHPUnit测试类以修复此问题:

代码语言:javascript
复制
// At the file's top to import the DB facade
use Illuminate\Support\Facades\DB;


// In the setUp() method
parent::setUp();
if (DB::connection() instanceof \Illuminate\Database\SQLiteConnection) {
    DB::statement(DB::raw('PRAGMA foreign_keys=on'));
}

这里的解决方案

希望这足以澄清这一主题,使其能够无缝地工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32018781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档