博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
写Laravel测试代码(2)
阅读量:7236 次
发布时间:2019-06-29

本文共 4288 字,大约阅读时间需要 14 分钟。

hot3.png

本文主要探讨数据库测试。

在 中聊了关于如何提高 laravel 数据库测试性能,其实简单一句就是:每一个test case, 只重新 seed 被污染的表。 OK,这里有一个前提问题:那如何构建临时测试数据库呢?本文主要探讨如何构建临时测试数据库。

数据库设计图纸

任何一个软件都需要数据库设计图纸,可以使用免费的MySqlWorkbench或者收费的Navicat Data Modler软件。这里使用免费的MySqlWorkbench来设计数据库图纸,类似下图:

bVRNMa?w=2360&h=2152

这里作为范例简单设计了5个model,当然大型程序都会有100个以上model。再利用软件的Export SQL功能导出数据库的schema,这个schema文件就作为构建临时测试数据库的原料,schema文件类似如下:

bVRNNh?w=2514&h=2518

临时数据库构建类

在得到 schema 文件后,就可以写一个临时数据库构建类来创建临时测试数据库。这里临时表示该测试数据库使用完后即drop掉,且数据库名字是随机的,这样可以保证同时并发进行测试。需要先在phpunit.xml中指定数据库配置信息:

...    

然后在config/database.php中写上当运行测试时指定新构建的测试数据库:

'mysql' => [            'driver' => 'mysql',            'host' => env('DB_HOST', '127.0.0.1'),            'port' => env('DB_PORT', '3306'),            'database' => env('APP_ENV') === 'testing' ? \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',            'collation' => 'utf8mb4_unicode_ci',            'prefix' => '',            'strict' => true,            'engine' => null,        ],

然后写一个临时测试数据库构建类:

exec('DROP DATABASE `' . static::$db_name . '`'); } } public static function getRandomDBName(string $prefix, string $host, string $username, string $password, string $charset = 'utf8mb4', string $collation = 'utf8mb4_unicode_ci'): string { if (static::$instance) { return static::$instance->getDBName(); } $db_name = $prefix . '_' . date('ymd') . '_' . str_random(); $pdo = new PDO('mysql:host=' . $host, $username, $password); // Remove orphan database static::removeOrphans($pdo, $prefix); // Create random database $pdo->exec('CREATE DATABASE `' . $db_name . '` DEFAULT CHARACTER SET ' . $charset . ' COLLATE ' . $collation); $pdo->exec('USE `' . $db_name . '`'); // Create tables in specified random database $schema_file = __DIR__ . '/../database/seeds/mysql.sql'; if ($pdo->exec(file_get_contents($schema_file)) === false) { throw new \ErrorException("Cannot create tables by sql file: " . $schema_file . ' because of ' . $pdo->errorInfo()[2]); } /* // Check if tables are inserted. $result = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_NUM); dump($result);*/ static::$instance = new static($db_name); static::$host = $host; static::$username = $username; static::$password = $password; dump($db_name); return $db_name; } /** * Remove orphan database if exists. * * @param PDO $pdo * @param string $prefix */ public static function removeOrphans(PDO $pdo, string $prefix) { $databases = $pdo->query('SHOW DATABASES LIKE "' . $prefix . '%"')->fetchAll(); foreach ($databases as $database) { $database = reset($database); if (starts_with($database, $prefix) && is_numeric(explode('_', $database)[1])) { $pdo->exec('DROP DATABASE `' . $database . '`'); echo 'Drop database ' . $database . PHP_EOL; } } } /** * @return string */ public static function getDBName(): string { return static::$db_name; } /** * @return string */ public static function getHost(): string { return static::$host; } /** * @return string */ public static function getUsername(): string { return static::$username; } /** * @return string */ public static function getPassword(): string { return static::$password; }}

这样,当运行测试时连接的就是临时构建的测试数据库,测试运行完毕就drop掉数据库,并且可以同时开多个窗口(线程)来分组运行test cases。最后还得在mysql localhost中创建testing用户并授权,以root用户登录local mysql

CREATE USER 'testing'@'localhost' IDENTIFIED BY 'testing';GRANT ALL ON `lx1036%`.* TO 'testing'@'localhost';

这样就临时测试数据库就准备完毕了,然后就是seed 测试数据,执行unit/feature tests, 执行assert等等,可以参考。这里运行phpunit时得到的临时测试数据库是:

bVRSkT?w=1738&h=628

OK,后续再聊执行unit/feature tests时一些实践技巧。

转载于:https://my.oschina.net/botkenni/blog/1528321

你可能感兴趣的文章
Linux echo命令
查看>>
用C#一步步创建Window Service (转)
查看>>
javascript library
查看>>
Mono 3.0.12 支持可移植类库
查看>>
js操作label,给label赋值,和取label的值
查看>>
MySQL主从复制与读写分离
查看>>
BZOJ 2049: [Sdoi2008]Cave 洞穴勘测 (动态树入门)
查看>>
解决/dev/fb0无法打开的问题
查看>>
勤快的程序猿都没啥前途的,赶紧改掉你的坏毛病吧!
查看>>
OpenCV学习(9) 分水岭算法(3)
查看>>
Android WebView漏洞(转)
查看>>
ExtJS4.2:自定义主题 入门
查看>>
【Android】事件输入系统-代码层次解读
查看>>
js 对文件操作
查看>>
MySQL 5.6学习笔记(数据表基本操作)
查看>>
复制控制---复制构造函数
查看>>
bash把所有屏幕输出重定向到文件并保持屏幕输出的方法
查看>>
HBase 压缩算法设置及修改
查看>>
深入了解jquery中的键盘事件
查看>>
windows常用命令行整理
查看>>