无名商城论坛

搜索
查看: 221|回复: 0

[其他技术] 【LSP】Laravel数据库测试的另一种方案-SQLite

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 17:04:12 | 显示全部楼层 |阅读模式


Laravel数据库测试
在测试方面,Laravel内置使用PHPUnit提供了非常方便的解决方案。而对于数据库增删改查的测试,要解决的一个很重要的问题就是如何在测试完成之后,恢复数据库的原貌,例如要测试一个用户注册的方法,需要插入一条用户记录到数据库,但是测试完成之后,我们并不想让这条测试用例保存在数据库里。为了解决这个问题,Laravel提供了非常方便的方案:

使用迁移:DatabaseMigrations
使用事务:DatabaseTransactions
参考资料:https://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-test
另外一种解决方案:使用SQLite的内存数据库:memory:
Laravel提供的两种解决方案,仍然对数据库进行了读写操作,某些时候你可能并不想这样(例如多人共享一个线上开发数据库),此时,还可以用一种更为优雅的方式:SQLlite,逻辑其实也非常简单:就是在跑测试用例的时候,将数据库的连接替换为SQLite。

使用示例
例如我们有以下测试类(该事例并不具有代表性,仅用于说明问题,并假设本机已经安装SQLite):

class HomePageTest extends TestCase {
   
    public function testHomePage()
    {
        // 创建一个测试用户,并保存
        $user = factory(App\User::class)->create();
        $this->actingAs($user)->visit('/home')->see('Dashboard');
    }
}
首先在Laravel的数据库配置文件,即config/database.php的connections数组中添加一个新的数据库连接

'sqlite' => [
    'driver' => 'sqlite',
    'database' => ':memory:',
    'prefix' => '',
],
这里一个非常重要的参数就是'database' => ':memory:',:memory:数据库是SQLite中内置的一个内存数据库,每次运行测试用例的时候都会在内存中创建一个新的数据库,并在测试完成关闭数据库连接后,自动清除掉,具有良好的隔离性,又因为是在内存中的,所以速度也很快,这些特性对于测试非常方便,这也是我们选用SQLite数据库作为测试库的一个非常重要的原因。有关详细解释,点击这里。

然后需要修改PHPUnit的配置文件,在phpunit.xml中,将数据库连接改为刚刚定义的SQLite连接
方案优缺点
该方案关键点在于使用SQLite内置的一个内存数据库:memory:,因此速度比较快,有很好的隔离性,也不会对我们的开发数据库有任何的影响。
当然该方案也有缺点,假如项目的数据库庞大,有大量的数据表或者迁移文件,会消耗大量内存,当运行测试的时候可能会由于内存不足,导致测试中断。此时需要为PHP分配合适的内存,在php.ini中修改配置memory_limit = 128M
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表