成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel數(shù)據(jù)庫(kù)測(cè)試的另一種方案-SQLite

rottengeek / 1806人閱讀

摘要:數(shù)據(jù)庫(kù)測(cè)試在測(cè)試方面,內(nèi)置使用提供了非常方便的解決方案。方案優(yōu)缺點(diǎn)該方案關(guān)鍵點(diǎn)在于使用內(nèi)置的一個(gè)內(nèi)存數(shù)據(jù)庫(kù),因此速度比較快,有很好的隔離性,也不會(huì)對(duì)我們的開發(fā)數(shù)據(jù)庫(kù)有任何的影響。

Laravel數(shù)據(jù)庫(kù)測(cè)試

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

使用遷移:DatabaseMigrations

使用事務(wù):DatabaseTransactions

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

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

使用示例

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

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

首先在Laravel的數(shù)據(jù)庫(kù)配置文件,即config/database.phpconnections數(shù)組中添加一個(gè)新的數(shù)據(jù)庫(kù)連接

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

這里一個(gè)非常重要的參數(shù)就是"database" => ":memory:",:memory:數(shù)據(jù)庫(kù)是SQLite中內(nèi)置的一個(gè)內(nèi)存數(shù)據(jù)庫(kù),每次運(yùn)行測(cè)試用例的時(shí)候都會(huì)在內(nèi)存中創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù),并在測(cè)試完成關(guān)閉數(shù)據(jù)庫(kù)連接后,自動(dòng)清除掉,具有良好的隔離性,又因?yàn)槭窃趦?nèi)存中的,所以速度也很快,這些特性對(duì)于測(cè)試非常方便,這也是我們選用SQLite數(shù)據(jù)庫(kù)作為測(cè)試庫(kù)的一個(gè)非常重要的原因。有關(guān)詳細(xì)解釋,點(diǎn)擊這里。

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


    
    
    
    
    
    
    

這會(huì)覆蓋.env中定義的數(shù)據(jù)庫(kù)連接DB_CONNECTION=mysql,并告訴框架在運(yùn)行測(cè)試的時(shí)候,用sqlite連接代替mysql連接。

最后需要在運(yùn)行測(cè)試用例之前執(zhí)行數(shù)據(jù)庫(kù)遷移,在測(cè)試類的基類,即TestCase.php中添加setUp方法

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

這樣在每次執(zhí)行測(cè)試用例之前,都會(huì)向SQLite:memory:數(shù)據(jù)庫(kù)中執(zhí)行所有的遷移,生成業(yè)務(wù)邏輯所需的數(shù)據(jù)表。

方案優(yōu)缺點(diǎn)

該方案關(guān)鍵點(diǎn)在于使用SQLite內(nèi)置的一個(gè)內(nèi)存數(shù)據(jù)庫(kù):memory:,因此速度比較快,有很好的隔離性,也不會(huì)對(duì)我們的開發(fā)數(shù)據(jù)庫(kù)有任何的影響。

當(dāng)然該方案也有缺點(diǎn),假如項(xiàng)目的數(shù)據(jù)庫(kù)龐大,有大量的數(shù)據(jù)表或者遷移文件,會(huì)消耗大量?jī)?nèi)存,當(dāng)運(yùn)行測(cè)試的時(shí)候可能會(huì)由于內(nèi)存不足,導(dǎo)致測(cè)試中斷。此時(shí)需要為PHP分配合適的內(nèi)存,在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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29038.html

相關(guān)文章

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

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

    worldligang 評(píng)論0 收藏0
  • PHPUnit 加速技巧分享

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

    weizx 評(píng)論0 收藏0
  • 看吧,這就是現(xiàn)代化 PHP 該有的樣子

    摘要:這大概是我沒有及早使用,或多數(shù)開發(fā)者流連現(xiàn)狀造成的。它就是,一個(gè)的框架。行為驅(qū)動(dòng)開發(fā)是來自測(cè)試驅(qū)動(dòng)開發(fā)的開發(fā)過程。簡(jiǎn)單的說,它就是經(jīng)??赡芤惶鞄状螌⑿K代碼整合進(jìn)基礎(chǔ)代碼當(dāng)中的行為。 showImg(https://segmentfault.com/img/remote/1460000013769815); 這是一篇社區(qū)協(xié)同翻譯的文章,已完成翻譯,更多信息請(qǐng)點(diǎn)擊?協(xié)同翻譯介紹?。 文章...

    Tangpj 評(píng)論0 收藏0
  • 深入淺出 Laravel 的 Facade 外觀系統(tǒng)

    摘要:外觀模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。將使用者與子系統(tǒng)從直接耦合,轉(zhuǎn)變成由外觀類提供統(tǒng)一的接口給使用者使用,以降低客戶端與子系統(tǒng)之間的耦合度。接下來將深入分析外觀服務(wù)的加載過程。引導(dǎo)程序?qū)⒃谔幚碚?qǐng)求是完成引導(dǎo)啟動(dòng)。 本文首發(fā)于 深入淺出 Laravel 的 Facade 外觀系統(tǒng),轉(zhuǎn)載請(qǐng)注明出處。 今天我們將學(xué)習(xí) Laravel 核心架構(gòu)中的另一個(gè)主題「Fac...

    KavenFan 評(píng)論0 收藏0
  • 13 個(gè)快速構(gòu)建 Laravel 后臺(tái)的擴(kuò)展包

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

    MiracleWong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<