国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

寫Laravel測試代碼(二)

Jackwoo / 1330人閱讀

摘要:本文主要探討數(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

相關(guān)文章

  • Laravel 菜鳥晉級之路

    摘要:用也有三四個月了,雖然是兼職開發(fā),但是使用的頻率非常之高,畢竟是產(chǎn)品化的一個項目。第二階段數(shù)據(jù)庫和開發(fā)了比較多的功能之后,會發(fā)現(xiàn)需要大量的測試數(shù)據(jù),這時候和就該大顯身手了。 用Laravel也有三四個月了,雖然是兼職開發(fā),但是使用的頻率非常之高,畢竟是產(chǎn)品化的一個項目。在這期間,也踩了無數(shù)的坑,走了很多彎路,所以準(zhǔn)備把最近的感悟記錄下來,方便后來者。 第一階段:簡單的增刪改查 這是最...

    YacaToy 評論0 收藏0
  • laravel認(rèn)識之 路由控制() csrf 白名單設(shè)置

    摘要:之前簡單的做了的傳遞參數(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...

    springDevBird 評論0 收藏0
  • 打造你的Laravel即時應(yīng)用()-消息推送與監(jiān)聽

    摘要:打造你的即時應(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)用(...

    omgdog 評論0 收藏0
  • LaravelLaravel 框架關(guān)鍵技術(shù)解析·讀書筆記(

    摘要:框架關(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)也是基本...

    TIGERB 評論0 收藏0
  • laravel5.4發(fā)送郵箱

    摘要:一發(fā)送郵箱其實不難,不如說挺簡單的,首先還是現(xiàn)在注冊一個賬號并且設(shè)置如下圖授權(quán)碼很重要的,請好好記住,待會在的中要配置到的二如果以上你都做完了,那接下來就是配置了你的賬號你的客戶端授權(quán)密碼你的賬號賬號名三然后接下來就是配置路由以及在控制器上 一、發(fā)送郵箱其實不難,不如說挺簡單的,首先還是現(xiàn)在163注冊一個賬號并且設(shè)置如下圖 showImg(https://segmentfault.c...

    ZHAO_ 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<