我正在为我的大型Laravel 5项目通过behat编写测试。
我在MySQL中有我的MySQL数据库的测试副本,还有一个用于该数据库的种子器,它共享一些其他环境的种子器。所有这些都如预期的那样起作用。
然而,我尝试使用sqlite内存中的数据库,因为它将大大加快我的自动化测试速度,并且因为我正在运行"artsian迁移:刷新--种子器=TestDatabaseSeeder“,在每个behat场景的开始。
我遇到的问题是,我的一些种子数据会导致sqlite抛出一个非常难以描述的语法错误,但是MySQL完全可以处理种子数据。
我认为,理想情况下,为了性能目的,我希望它使用内存中的MySQL,并保持数据库引擎的一致性。在运行测试时,是否有一种在内存中使用MySQL的简单方法?一种不涉及复制和编辑迁移文件的解决方案,它可以使sqlite高兴吗?
发布于 2015-09-08 16:58:20
原来,sqlite不喜欢逃跑的方式。
"\'“需要用‘”代替。并且sqlite不支持枚举,所以我改变了迁移,使用字符串而不是枚举。
发布于 2019-07-27 06:06:48
从2019年起,这里是让Laravel PHPunit测试使用内存中DB的方法。
为Laravel / Lumen测试设置内存中的SQLite
你必须具备以下条件:
RefreshDatabase测试类(官方文件)中使用PHPUnit特性(用于Lumen的DatabaseMigrations特性)。config/database.php文件中的connection setion中设置以下内容: 'testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
],phpunit.xml文件中的<php>部分中设置以下行: <env name="DB_CONNECTION" value="testing"/>因此,一旦运行PHPUnit测试,PHPUnit就会读取phpunit.xml,将.env的DB_CONNECTION变量替换为testing,它将触发要使用的DB configuration testing (这是内存中的sqlite )。
内存中的DB与磁盘DB的测试(根据我的经验)要快5-30倍。30倍的差别是对于大约200个CRUD测试的小测试套件,所有运行在6个表上的DB查询都有一些hasMany和belongsToMany枢轴关系。
每次测试刷新数据库
要运行数据库迁移,在每次测试前拥有一个干净的数据库添加了测试类(Laravel)顶部的以下特性:
use Illuminate\Foundation\Testing\RefreshDatabase;
// ... then in the class body:
use RefreshDatabase;对于Lumen 它应该是
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:refresh和db:seed (这里假设您已经提前准备了所需的DB种子)和artisan。
默认情况下,SQLite禁用外键。将以下代码段添加到PHPUnit测试类以修复此问题:
// 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'));
}见这里的解决方案。
希望这足以澄清这一主题,使其能够无缝地工作。
https://stackoverflow.com/questions/32018781
复制相似问题