Laravel數據庫測試的另一種方案-SQLite


Laravel數據庫測試

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

  • 使用遷移:DatabaseMigrations
  • 使用事務:DatabaseTransactions
參考資料: https://laravel.com/docs/5.3/database-testing#resetting-the-database-after-each-test

另外一種解決方案:使用SQLite的內存數據庫:memory:

Laravel提供的兩種解決方案,仍然對數據庫進行了讀寫操作,某些時候你可能並不想這樣(例如多人共享一個線上開發數據庫),此時,還可以用一種更為優雅的方式:SQLlite,邏輯其實也非常簡單:就是在跑測試用例的時候,將數據庫的連接替換為SQLite

使用示例

例如我們有以下測試類(該事例並不具有代表性,僅用於說明問題,並假設本機已經安裝SQLite):


class HomePageTest extends TestCase {
    
    public function testHomePage() 
    {
        // 創建一個測試用戶,並保存
        $user = factory(App\User::class)->create();
        $this->actingAs($user)->visit('/home')->see('Dashboard');
    }
}
  • 首先在Laravel的數據庫配置文件,即config/database.phpconnections數組中添加一個新的數據庫連接

'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

參考資料

原文地址:https://segmentfault.com/a/1190000015623700


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM