在測試方面,Laravel內置使用PHPUnit提供了非常方便的解決方案。而對于數據庫增刪改查的測試,要解決的一個很重要的問題就是如何在測試完成之后,恢復數據庫的原貌,例如要測試一個用戶注冊的方法,需要插入一條用戶記錄到數據庫,但是測試完成之后,我們并不想讓這條測試用例保存在數據庫里。為了解決這個問題,Laravel提供了非常方便的方案:
使用遷移:DatabaseMigrations
使用事務:DatabaseTransactions
參考資料:http://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-test另外一種解決方案:使用SQLite的內存數據庫:memory:Laravel提供的兩種解決方案,仍然對數據庫進行了讀寫操作,某些時候你可能并不想這樣(例如多人共享一個線上開發數據庫),此時,還可以用一種更為優雅的方式:SQLlite,邏輯其實也非常簡單:就是在跑測試用例的時候,將數據庫的連接替換為SQLite。
使用示例例如我們有以下測試類(該事例并不具有代表性,僅用于說明問題,并假設本機已經安裝SQLite):
html' target='_blank'>class HomePageTest extends TestCase { public function testHomePage() // 創建一個測試用戶,并保存 $user = factory(App/User::class)- create(); $this- actingAs($user)- visit( /home )- see( Dashboard }
首先在Laravel的數據庫配置文件,即config/database.php的connections數組中添加一個新的數據庫連接
sqlite = [ driver = sqlite , database = :memory: , prefix = ,],
這里一個非常重要的參數就是 database = :memory: ,:memory:數據庫是SQLite中內置的一個內存數據庫,每次運行測試用例的時候都會在內存中創建一個新的數據庫,并在測試完成關閉數據庫連接后,自動清除掉,具有良好的隔離性,又因為是在內存中的,所以速度也很快,這些特性對于測試非常方便,這也是我們選用SQLite數據庫作為測試庫的一個非常重要的原因。有關詳細解釋,點擊這里。
然后需要修改PHPUnit的配置文件,在phpunit.xml中,將數據庫連接改為剛剛定義的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 / !-- 將數據庫連接改為剛剛定義的SQLite連接 -- env name= DB_CONNECTION value= sqlite / /php
這會覆蓋.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
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
如何解決Laravel.log 文件寫入的問題
Laravel開發環境部署之homestead 安裝配置過程(windows系統)
laravel的路由(router)圖文詳解
以上就是用另一種方法來進行Laravel數據庫測試(SQLite)的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答