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

資訊專欄INFORMATION COLUMN

Laravel數據庫測試的另一種方案-SQLite

rottengeek / 1774人閱讀

摘要:數據庫測試在測試方面,內置使用提供了非常方便的解決方案。方案優缺點該方案關鍵點在于使用內置的一個內存數據庫,因此速度比較快,有很好的隔離性,也不會對我們的開發數據庫有任何的影響。

Laravel數據庫測試

在測試方面,Laravel內置使用PHPUnit提供了非常方便的解決方案。而對于數據庫增刪改查的測試,要解決的一個很重要的問題就是如何在測試完成之后,恢復數據庫的原貌,例如要測試一個用戶注冊的方法,需要插入一條用戶記錄到數據庫,但是測試完成之后,我們并不想讓這條測試用例保存在數據庫里。為了解決這個問題,Laravel提供了非常方便的方案:

使用遷移:DatabaseMigrations

使用事務:DatabaseTransactions

參考資料:https://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-test
另外一種解決方案:使用SQLite的內存數據庫:memory:

Laravel提供的兩種解決方案,仍然對數據庫進行了讀寫操作,某些時候你可能并不想這樣(例如多人共享一個線上開發數據庫),此時,還可以用一種更為優雅的方式:SQLlite,邏輯其實也非常簡單:就是在跑測試用例的時候,將數據庫的連接替換為SQLite

使用示例

例如我們有以下測試類(該事例并不具有代表性,僅用于說明問題,并假設本機已經安裝SQLite):

class HomePageTest extends TestCase {
    
    public function testHomePage() 
    {
        // 創建一個測試用戶,并保存
        $user = factory(AppUser::class)->create();
        $this->actingAs($user)->visit("/home")->see("Dashboard");
    }
}

首先在Laravel的數據庫配置文件,即config/database.phpconnections數組中添加一個新的數據庫連接

"sqlite" => [
    "driver" => "sqlite",
    "database" => ":memory:",
    "prefix" => "",
],

這里一個非常重要的參數就是"database" => ":memory:":memory:數據庫是SQLite中內置的一個內存數據庫,每次運行測試用例的時候都會在內存中創建一個新的數據庫,并在測試完成關閉數據庫連接后,自動清除掉,具有良好的隔離性,又因為是在內存中的,所以速度也很快,這些特性對于測試非常方便,這也是我們選用SQLite數據庫作為測試庫的一個非常重要的原因。有關詳細解釋,點擊這里。

然后需要修改PHPUnit的配置文件,在phpunit.xml中,將數據庫連接改為剛剛定義的SQLite連接


    
    
    
    
    
    
    

這會覆蓋.env中定義的數據庫連接DB_CONNECTION=mysql,并告訴框架在運行測試的時候,用sqlite連接代替mysql連接。

最后需要在運行測試用例之前執行數據庫遷移,在測試類的基類,即TestCase.php中添加setUp方法

public function setUp()
{
    parent::setUp();
    // 執行數據庫遷移 
    $this->artisan("migrate");
}

這樣在每次執行測試用例之前,都會向SQLite:memory:數據庫中執行所有的遷移,生成業務邏輯所需的數據表。

方案優缺點

該方案關鍵點在于使用SQLite內置的一個內存數據庫:memory:,因此速度比較快,有很好的隔離性,也不會對我們的開發數據庫有任何的影響。

當然該方案也有缺點,假如項目的數據庫龐大,有大量的數據表或者遷移文件,會消耗大量內存,當運行測試的時候可能會由于內存不足,導致測試中斷。此時需要為PHP分配合適的內存,在php.ini中修改配置memory_limit = 128M

參考資料

https://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-test

http://blog.mauriziobonani.com/laravel-sql-memory-database-for-unit-tests/

https://www.sqlite.org/inmemorydb.html

https://laracasts.com/discuss/channels/testing/how-to-specify-a-testing-database-in-laravel-5

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29038.html

相關文章

  • Laravel5.5新特性--郵件模板可以在瀏覽器中渲染

    摘要:正在開發的另一種測試方法是將電子郵件呈現給瀏覽器,以便您可以進行快速更改并獲得幾乎即時的反饋。 這個是即將在Laravel5.5中發布的新特性 當您構建自定義HTML電子郵件模板時,通常會對所有電子郵件客戶端進行測試,并一并測試通常是一件麻煩事。有幾個像Litmus這樣的工具可以幫助解決這個問題,但服務是昂貴的。 正在開發的另一種測試方法是將電子郵件呈現給瀏覽器,以便您可以進行快速更改...

    worldligang 評論0 收藏0
  • PHPUnit 加速技巧分享

    摘要:接下來我們將會介紹一些可以快速實現的小技巧,讓你的代碼測試變得更快。該示例測試套件有意地模擬更廣泛的測試集合,并突出改進的可行性。真實情況下,效率的提升可能有所差異。我認為相比通過提升一點速度帶來的好處,保持生產環境一致更重要。 showImg(https://segmentfault.com/img/remote/1460000017962057?w=1440&h=736); 具備高...

    weizx 評論0 收藏0
  • 看吧,這就是現代化 PHP 該有的樣子

    摘要:這大概是我沒有及早使用,或多數開發者流連現狀造成的。它就是,一個的框架。行為驅動開發是來自測試驅動開發的開發過程。簡單的說,它就是經常可能一天幾次將小塊代碼整合進基礎代碼當中的行為。 showImg(https://segmentfault.com/img/remote/1460000013769815); 這是一篇社區協同翻譯的文章,已完成翻譯,更多信息請點擊?協同翻譯介紹?。 文章...

    Tangpj 評論0 收藏0
  • 深入淺出 Laravel 的 Facade 外觀系統

    摘要:外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。將使用者與子系統從直接耦合,轉變成由外觀類提供統一的接口給使用者使用,以降低客戶端與子系統之間的耦合度。接下來將深入分析外觀服務的加載過程。引導程序將在處理請求是完成引導啟動。 本文首發于 深入淺出 Laravel 的 Facade 外觀系統,轉載請注明出處。 今天我們將學習 Laravel 核心架構中的另一個主題「Fac...

    KavenFan 評論0 收藏0
  • 13 個快速構建 Laravel 后臺的擴展包

    摘要:值得一提的是擴展包不免費用于商業用途,作者用一種人類友好的方式說你使用這個擴展包就是應該去掙錢的,而不是免費的去工作這個擴展包收費美元。除了這些,還有五個沒有全面的審查的擴展包。最后,還有三個優質的包選擇于。 showImg(https://segmentfault.com/img/remote/1460000012312105?w=2200&h=1125); 開發者們都是懶惰的,不,...

    MiracleWong 評論0 收藏0

發表評論

0條評論

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