在測(cè)試方面,Laravel內(nèi)置使用PHPUnit提供了非常方便的解決方案。而對(duì)于數(shù)據(jù)庫(kù)增刪改查的測(cè)試,要解決的一個(gè)很重要的問(wèn)題就是如何在測(cè)試完成之后,恢復(fù)數(shù)據(jù)庫(kù)的原貌,例如要測(cè)試一個(gè)用戶注冊(cè)的方法,需要插入一條用戶記錄到數(shù)據(jù)庫(kù),但是測(cè)試完成之后,我們并不想讓這條測(cè)試用例保存在數(shù)據(jù)庫(kù)里。為了解決這個(gè)問(wèn)題,Laravel提供了非常方便的方案:
使用遷移:DatabaseMigrations
使用事務(wù):DatabaseTransactions
參考資料:http://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è)試類(該事例并不具有代表性,僅用于說(shuō)明問(wèn)題,并假設(shè)本機(jī)已經(jīng)安裝SQLite):
html' target='_blank'>class HomePageTest extends TestCase { public function testHomePage() // 創(chuàng)建一個(gè)測(cè)試用戶,并保存 $user = factory(App/User::class)- create(); $this- actingAs($user)- visit( /home )- see( Dashboard }
首先在Laravel的數(shù)據(jù)庫(kù)配置文件,即config/database.php的connections數(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連接
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ù)庫(kù)連接改為剛剛定義的SQLite連接 -- env name= DB_CONNECTION value= sqlite / /php
這會(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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP !
相關(guān)推薦:
如何解決Laravel.log 文件寫入的問(wèn)題
Laravel開發(fā)環(huán)境部署之homestead 安裝配置過(guò)程(windows系統(tǒng))
laravel的路由(router)圖文詳解
以上就是用另一種方法來(lái)進(jìn)行Laravel數(shù)據(jù)庫(kù)測(cè)試(SQLite)的詳細(xì)內(nèi)容,PHP教程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選