在測試方面,Laravel內(nèi)置使用PHPUnit提供了非常方便的解決方案。而對于數(shù)據(jù)庫增刪改查的測試,要解決的一個很重要的問題就是如何在測試完成之后,恢復(fù)數(shù)據(jù)庫的原貌,例如要測試一個用戶注冊的方法,需要插入一條用戶記錄到數(shù)據(jù)庫,但是測試完成之后,我們并不想讓這條測試用例保存在數(shù)據(jù)庫里。為了解決這個問題,Laravel提供了非常方便的方案:
使用遷移:DatabaseMigrations
使用事務(wù):DatabaseTransactions
參考資料:http://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-test另外一種解決方案:使用SQLite的內(nèi)存數(shù)據(jù)庫:memory:Laravel提供的兩種解決方案,仍然對數(shù)據(jù)庫進(jìn)行了讀寫操作,某些時候你可能并不想這樣(例如多人共享一個線上開發(fā)數(shù)據(jù)庫),此時,還可以用一種更為優(yōu)雅的方式:SQLlite,邏輯其實也非常簡單:就是在跑測試用例的時候,將數(shù)據(jù)庫的連接替換為SQLite。
使用示例例如我們有以下測試類(該事例并不具有代表性,僅用于說明問題,并假設(shè)本機(jī)已經(jīng)安裝SQLite):
html' target='_blank'>class HomePageTest extends TestCase { public function testHomePage() // 創(chuàng)建一個測試用戶,并保存 $user = factory(App/User::class)- create(); $this- actingAs($user)- visit( /home )- see( Dashboard }
首先在Laravel的數(shù)據(jù)庫配置文件,即config/database.php的connections數(shù)組中添加一個新的數(shù)據(jù)庫連接
sqlite = [ driver = sqlite , database = :memory: , prefix = ,],
這里一個非常重要的參數(shù)就是 database = :memory: ,:memory:數(shù)據(jù)庫是SQLite中內(nèi)置的一個內(nèi)存數(shù)據(jù)庫,每次運行測試用例的時候都會在內(nèi)存中創(chuàng)建一個新的數(shù)據(jù)庫,并在測試完成關(guān)閉數(shù)據(jù)庫連接后,自動清除掉,具有良好的隔離性,又因為是在內(nèi)存中的,所以速度也很快,這些特性對于測試非常方便,這也是我們選用SQLite數(shù)據(jù)庫作為測試庫的一個非常重要的原因。有關(guān)詳細(xì)解釋,點擊這里。
然后需要修改PHPUnit的配置文件,在phpunit.xml中,將數(shù)據(jù)庫連接改為剛剛定義的SQLite連接
php env name= APP_ENV value= testing / env name= CACHE_DRIVER value= array / env name= SESSION_DRIVER value= array / env name= QUEUE_DRIVER value= sync / !-- 將數(shù)據(jù)庫連接改為剛剛定義的SQLite連接 -- env name= DB_CONNECTION value= sqlite / /php
這會覆蓋.env中定義的數(shù)據(jù)庫連接DB_CONNECTION=mysql,并告訴框架在運行測試的時候,用sqlite連接代替mysql連接。
最后需要在運行測試用例之前執(zhí)行數(shù)據(jù)庫遷移,在測試類的基類,即TestCase.php中添加setUp方法
public function setUp() parent::setUp(); // 執(zhí)行數(shù)據(jù)庫遷移 $this- artisan( migrate }
這樣在每次執(zhí)行測試用例之前,都會向SQLite的:memory:數(shù)據(jù)庫中執(zhí)行所有的遷移,生成業(yè)務(wù)邏輯所需的數(shù)據(jù)表。
方案優(yōu)缺點該方案關(guān)鍵點在于使用SQLite內(nèi)置的一個內(nèi)存數(shù)據(jù)庫:memory:,因此速度比較快,有很好的隔離性,也不會對我們的開發(fā)數(shù)據(jù)庫有任何的影響。
當(dāng)然該方案也有缺點,假如項目的數(shù)據(jù)庫龐大,有大量的數(shù)據(jù)表或者遷移文件,會消耗大量內(nèi)存,當(dāng)運行測試的時候可能會由于內(nèi)存不足,導(dǎo)致測試中斷。此時需要為PHP分配合適的內(nèi)存,在php.ini中修改配置memory_limit = 128M
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,更多相關(guān)內(nèi)容請關(guān)注PHP !
相關(guān)推薦:
如何解決Laravel.log 文件寫入的問題
Laravel開發(fā)環(huán)境部署之homestead 安裝配置過程(windows系統(tǒng))
laravel的路由(router)圖文詳解
以上就是用另一種方法來進(jìn)行Laravel數(shù)據(jù)庫測試(SQLite)的詳細(xì)內(nèi)容,PHP教程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答
圖片精選