在測試方面,Laravel
內置使用PHPUnit
提供了很是方便的解決方案。而對於數據庫增刪改查的測試,要解決的一個很重要的問題就是如何在測試完成以後,恢復數據庫的原貌,例如要測試一個用戶註冊的方法,須要插入一條用戶記錄到數據庫,可是測試完成以後,咱們並不想讓這條測試用例保存在數據庫裏。爲了解決這個問題,Laravel
提供了很是方便的方案:php
DatabaseMigrations
DatabaseTransactions
參考資料: https://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-test
SQLite
的內存數據庫:memory:
Laravel
提供的兩種解決方案,仍然對數據庫進行了讀寫操做,某些時候你可能並不想這樣(例如多人共享一個線上開發數據庫),此時,還能夠用一種更爲優雅的方式:SQLlite
,邏輯其實也很是簡單:就是在跑測試用例的時候,將數據庫的鏈接替換爲SQLite
。html
例如咱們有如下測試類(該事例並不具備表明性,僅用於說明問題,並假設本機已經安裝SQLite
):mysql
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
數據庫做爲測試庫的一個很是重要的緣由。有關詳細解釋,點擊這裏。laravel
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
鏈接。sql
TestCase.php
中添加setUp
方法public function setUp() { parent::setUp(); // 執行數據庫遷移 $this->artisan('migrate'); }
這樣在每次執行測試用例以前,都會向SQLite
的:memory:
數據庫中執行全部的遷移,生成業務邏輯所需的數據表。數據庫
SQLite
內置的一個內存數據庫:memory:
,所以速度比較快,有很好的隔離性,也不會對咱們的開發數據庫有任何的影響。php.ini
中修改配置memory_limit = 128M