当前位置: 首页 > 后端技术 > PHP

Laravel数据库测试的另一种解决方案——SQLite

时间:2023-03-29 20:44:13 PHP

Laravel数据库测试在测试方面,Laravel内置的PHPUnit提供了非常方便的解决方案。对于数据库的增删改查测试,需要解决的一个很重要的问题就是测试完成后如何恢复数据库的原貌。比如测试一个用户注册的方法,需要往数据库中插入一条用户记录,但是测试完成后,我们不想把这个测试用例保存在数据库中。为了解决这个问题,Laravel提供了一个非常方便的解决方案:使用迁移:DatabaseMigrations使用事务:DatabaseTransactions参考:https://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-测试另一种方案:使用SQLite的内存数据库:memory:Laravel提供的两种方案,依然是对数据库进行读写操作。有时候你可能不想这样(比如多人共享一个在线开发数据库。),这时候,你也可以使用更优雅的方式:SQLlite,逻辑其实很简单:在运行测试用例的时候,将与SQLite的数据库连接。使用示例例如我们有如下测试类(此示例不具有代表性,仅用于说明问题,假设机器上已经安装了SQLite):classHomePageTestextendsTestCase{publicfunctiontestHomePage(){//创建一个测试用户,并保存$user=factory(App\User::class)->create();$this->actingAs($user)->visit('/home')->see('Dashboard');}}首先在Laravel的数据库配置文件中添加一个新的数据库连接'sqlite'=>['driver'=>'sqlite','database'=>':memory:','即config/的connections数组database.phpprefix'=>'',],这里一个很重要的参数是'database'=>':memory:',:memory:database是SQLite中内置的内存数据库,会存放在内存中每次运行测试用例时在中新建一个数据库,测试完成后自动清除并关闭数据库连接。隔离性好,而且因为是在内存中,所以速度也很快。这些特性对于测试来说非常方便。这也是为什么我们选择SQLite数据库作为测试库的一个很重要的原因。点击这里获得详细说明。然后需要修改PHPUnit的配置文件。在phpunit.xml中,将数据库连接改为刚才定义的SQLite连接这会覆盖.env中定义的数据库连接DB_CONNECTION=mysql并告诉框架在运行测试时使用sqlite连接而不是mysql连接。最后,您需要在运行测试用例之前执行数据库迁移。在测试类的基类即TestCase.php中添加setUp方法publicfunctionsetUp(){parent::setUp();//进行数据库迁移$this->artisan('migrate');}这样,在每个测试用例执行之前,都会对SQLite:memory:数据库进行迁移,生成业务逻辑需要的数据表.方案的优缺点方案的重点是使用SQLite内置的一个内存数据库:memory:,所以速度比较快,隔离性好,不会对我们开发的数据库有任何影响。当然,这种解决方案也有缺点。如果项目的数据库很大,有大量的数据表或迁移文件,会消耗大量内存。运行测试时,可能会因为内存不足导致测试中断。这时候需要给PHP分配合适的内存,修改php.ini中的配置memory_limit=128M参考https://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-测试http://blog.mauriziobonani.com/laravel-sql-memory-database-for-unit-tests/https://www.sqlite.org/inmemorydb.htmlhttps://laracasts.com/discuss/channels/testing/如何在laravel-5中指定测试数据库