本文主要讨论数据库测试。在编写Laravel测试代码(一)中,讲了如何提高Laravel数据库测试的性能。其实简单一句话就是:每次测试用例,只重新播种被污染的表。OK,这里有一个前提问题:如何建立一个临时的测试数据库?本文重点介绍如何搭建临时测试数据库。数据库设计图任何软件都需要数据库设计图,可以使用免费的MySqlWorkbench或付费的NavicatDataModler软件。这里我们使用免费的MySqlWorkbench来设计数据库图纸,类似下图:这里简单设计5个模型作为例子,当然大型程序会有100多个模型。然后使用软件的ExportSQL功能导出数据库的schema。该模式文件用作构建临时测试数据库的原材料。schema文件类似如下:临时数据库构造类获取到schema文件后,可以编写一个临时数据库构造类来创建一个临时数据库。测试数据库。这里暂时表示test数据库用完后会被drop掉,数据库的名字是随机的,保证并发测试。需要先在phpunit.xml中指定数据库配置信息:...然后在config/database.php中写入指定运??行测试时新建的测试数据库:'mysql'=>['driver'=>'mysql','host'=>env('DB_HOST','127.0.0.1'),'port'=>env('DB_PORT','3306'),'database'=>环境('APP_ENV')==='测试'?\Tests\Database::getRandomDBName(env('DB_DATABASE','lx1036'),env('DB_HOST','localhost'),env('DB_USERNAME','root'),env('DB_PASSWORD')):env('DB_DATABASE','forge'),'username'=>env('DB_USERNAME','forge'),'password'=>env('DB_PASSWORD',''),'unix_socket'=>env('DB_SOCKET',''),'charset'=>'utf8mb4','collat??ion'=>'utf8mb4_unicode_ci','prefix'=>'','strict'=>true,'engine'=>null,],然后写一个临时测试数据库构建类:exec('DROPDATABASE`'.static::$db_name.'`');}}publicstaticfunctiongetRandomDBName(string$prefix,string$host,string$username,string$password,string$charset='utf8mb4',string$collat??ion='utf8mb4_unicode_ci'):字符串{if(static::$instance){returnstatic::$instance->getDBName();}$db_name=$prefix。'_'。日期('ymd')。'_'。str_random();$pdo=newPDO('mysql:host='.$host,$username,$password);//删除孤立数据库static::removeOrphans($pdo,$prefix);//创建随机数据库$pdo->exec('CREATEDATABASE`'.$db_name.'`DEFAULTCHARACTERSET'.$charset.'COLL吃'。$整理);$pdo->exec('USE`'.$db_name.'`');//在指定的随机数据库中创建表$schema_file=__DIR__.'/../database/seeds/mysql.sql';if($pdo->exec(file_get_contents($schema_file))===false){thrownew\ErrorException("无法通过sql文件创建表:".$schema_file.'因为'.$pdo->errorInfo()[2]);}/*//检查表是否被插入。$result=$pdo->query("SHOWTABLES")->fetchAll(PDO::FETCH_NUM);dump($result);*/static::$instance=newstatic($db_name);静态::$主机=$主机;静态::$用户名=$用户名;静态::$密码=$密码;转储($db_name);返回$db_name;}/***删除孤立数据库(如果存在)。**@paramPDO$pdo*@paramstring$prefix*/publicstaticfunctionremoveOrphans(PDO$pdo,string$prefix){$databases=$pdo->query('SHOWDATABASESLIKE"'.$prefix.'%"')->fetchAll();foreach($databasesas$database){$database=reset($database);if(starts_with($database,$prefix)&&is_numeric(explode('_',$database)[1])){$pdo->exec('DROPDATABASE`'.$database.'`');echo'删除数据库'。$数据库。PHP_EOL;}}}/***@returnstring*/publicstaticfunctiongetDBName():string{returnstatic::$db_name;}/***@returnstring*/publicstaticfunctiongetHost():string{returnstatic::$host;}/***@returnstring*/publicstaticfunctiongetUsername():string{returnstatic::$username;}/***@returnstring*/publicstaticfunctiongetPassword():string{returnstatic::$password;}}这样运行测试的时候,连接的是临时搭建的测试数据库,测试运行完数据库会掉线,可以同时打开多个窗口(thread)来分组运行测试用例。最后还要在mysqllocalhost中创建testing@testing用户并授权,以root用户登录本地mysql:CREATEUSER'testing'@'localhost'IDENTIFIEDBY'testing';GRANTALLON`lx1036%`.*TO'testing'@'localhost';这样临时测试数据库就准备好了,接下来就是种子测试数据,执行单元/特性测试,执行assert等,可以参考编写Laravel测试代码(一)。这里运行phpunit得到的临时测试数据库是:OK,后面执行单元/特性测试的时候会讲到一些实用的技巧。RightCapital招聘LaravelDevOps