摘要:本文主要探討數(shù)據(jù)庫測試。在寫測試代碼一中聊了關(guān)于如何提高數(shù)據(jù)庫測試性能,其實簡單一句就是每一個只重新被污染的表。最后還得在中創(chuàng)建用戶并授權(quán),以用戶登錄這樣就臨時測試數(shù)據(jù)庫就準(zhǔn)備完畢了,然后就是測試數(shù)據(jù),執(zhí)行,執(zhí)行等等,可以參考寫測試代碼一。
本文主要探討數(shù)據(jù)庫測試。
在寫Laravel測試代碼(一) 中聊了關(guān)于如何提高 laravel 數(shù)據(jù)庫測試性能,其實簡單一句就是:每一個test case, 只重新 seed 被污染的表。 OK,這里有一個前提問題:那如何構(gòu)建臨時測試數(shù)據(jù)庫呢?本文主要探討如何構(gòu)建臨時測試數(shù)據(jù)庫。
數(shù)據(jù)庫設(shè)計圖紙任何一個軟件都需要數(shù)據(jù)庫設(shè)計圖紙,可以使用免費(fèi)的MySqlWorkbench或者收費(fèi)的Navicat Data Modler軟件。這里使用免費(fèi)的MySqlWorkbench來設(shè)計數(shù)據(jù)庫圖紙,類似下圖:
這里作為范例簡單設(shè)計了5個model,當(dāng)然大型程序都會有100個以上model。再利用軟件的Export SQL功能導(dǎo)出數(shù)據(jù)庫的schema,這個schema文件就作為構(gòu)建臨時測試數(shù)據(jù)庫的原料,schema文件類似如下:
臨時數(shù)據(jù)庫構(gòu)建類在得到 schema 文件后,就可以寫一個臨時數(shù)據(jù)庫構(gòu)建類來創(chuàng)建臨時測試數(shù)據(jù)庫。這里臨時表示該測試數(shù)據(jù)庫使用完后即drop掉,且數(shù)據(jù)庫名字是隨機(jī)的,這樣可以保證同時并發(fā)進(jìn)行測試。需要先在phpunit.xml中指定數(shù)據(jù)庫配置信息:
...
然后在config/database.php中寫上當(dāng)運(yùn)行測試時指定新構(gòu)建的測試數(shù)據(jù)庫:
"mysql" => [ "driver" => "mysql", "host" => env("DB_HOST", "127.0.0.1"), "port" => env("DB_PORT", "3306"), "database" => env("APP_ENV") === "testing" ? TestsDatabase::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, ],
然后寫一個臨時測試數(shù)據(jù)庫構(gòu)建類:
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; } }
這樣,當(dāng)運(yùn)行測試時連接的就是臨時構(gòu)建的測試數(shù)據(jù)庫,測試運(yùn)行完畢就drop掉數(shù)據(jù)庫,并且可以同時開多個窗口(線程)來分組運(yùn)行test cases。最后還得在mysql localhost中創(chuàng)建testing@testing用戶并授權(quán),以root用戶登錄local mysql:
CREATE USER "testing"@"localhost" IDENTIFIED BY "testing"; GRANT ALL ON `lx1036%`.* TO "testing"@"localhost";
這樣就臨時測試數(shù)據(jù)庫就準(zhǔn)備完畢了,然后就是seed 測試數(shù)據(jù),執(zhí)行unit/feature tests, 執(zhí)行assert等等,可以參考寫Laravel測試代碼(一)。這里運(yùn)行phpunit時得到的臨時測試數(shù)據(jù)庫是:
OK,后續(xù)再聊執(zhí)行unit/feature tests時一些實踐技巧。
RightCapital招聘Laravel DevOps
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/23340.html
摘要:用也有三四個月了,雖然是兼職開發(fā),但是使用的頻率非常之高,畢竟是產(chǎn)品化的一個項目。第二階段數(shù)據(jù)庫和開發(fā)了比較多的功能之后,會發(fā)現(xiàn)需要大量的測試數(shù)據(jù),這時候和就該大顯身手了。 用Laravel也有三四個月了,雖然是兼職開發(fā),但是使用的頻率非常之高,畢竟是產(chǎn)品化的一個項目。在這期間,也踩了無數(shù)的坑,走了很多彎路,所以準(zhǔn)備把最近的感悟記錄下來,方便后來者。 第一階段:簡單的增刪改查 這是最...
摘要:之前簡單的做了的傳遞參數(shù),可能只是大多數(shù)中的一種吧,這里做一個請求的實例默認(rèn)開啟了防護(hù)功能當(dāng)然也可以關(guān)閉這個功能,設(shè)置的文件路徑如下注釋掉的就關(guān)閉了全局的防護(hù),但是一般不會這么做。 之前簡單的做了url的get 傳遞參數(shù),可能只是 大多數(shù)中的一種吧,這里做一個 post 請求的實例,laravel默認(rèn)開啟了csrf 防護(hù)功能,當(dāng)然也可以關(guān)閉這個功能,設(shè)置的文件路徑 app/Http/K...
摘要:打造你的即時應(yīng)用二消息推送與監(jiān)聽年月日接于上篇博客打造你的即時應(yīng)用一項目初始化構(gòu)建在上一篇博客中介紹了項目的基本構(gòu)建現(xiàn)在進(jìn)入實戰(zhàn)操作一消息推送創(chuàng)建事件類的廣播推送通過來實現(xiàn)下面通過命令來創(chuàng)建一個事件類為了配合我們的廣播系統(tǒng)使用需要實現(xiàn)接 打造你的Laravel即時應(yīng)用(二)-消息推送與監(jiān)聽 2019年08月04日20:16:21 XXM 接于上篇博客: 打造你的Laravel即時應(yīng)用(...
摘要:框架關(guān)鍵技術(shù)解析讀書筆記二第五章框架應(yīng)用程序根目錄版本默認(rèn)的框架應(yīng)用程序是符合規(guī)范的,所以相應(yīng)的目錄結(jié)構(gòu)也是基本固定的,不同的目錄加載了功能文件,如果添加了新的目錄,需要在文件中添加規(guī)范的自動加載部分并執(zhí)行命令。 Laravel 框架關(guān)鍵技術(shù)解析·讀書筆記(二) 第五章 框架應(yīng)用程序根目錄(5.1版本) 默認(rèn)的Laravel框架應(yīng)用程序是符合PSR規(guī)范的,所以相應(yīng)的目錄結(jié)構(gòu)也是基本...
摘要:一發(fā)送郵箱其實不難,不如說挺簡單的,首先還是現(xiàn)在注冊一個賬號并且設(shè)置如下圖授權(quán)碼很重要的,請好好記住,待會在的中要配置到的二如果以上你都做完了,那接下來就是配置了你的賬號你的客戶端授權(quán)密碼你的賬號賬號名三然后接下來就是配置路由以及在控制器上 一、發(fā)送郵箱其實不難,不如說挺簡單的,首先還是現(xiàn)在163注冊一個賬號并且設(shè)置如下圖 showImg(https://segmentfault.c...
閱讀 1849·2021-09-29 09:35
閱讀 2710·2021-09-22 15:25
閱讀 1972·2021-08-23 09:43
閱讀 2049·2019-08-30 15:54
閱讀 3349·2019-08-30 15:53
閱讀 2387·2019-08-30 13:50
閱讀 2398·2019-08-30 11:24
閱讀 2269·2019-08-29 15:37