首頁  >  文章  >  後端開發  >  用另一種方​​法來進行Laravel資料庫測試(SQLite)

用另一種方​​法來進行Laravel資料庫測試(SQLite)

不言
不言原創
2018-07-13 15:21:322983瀏覽

這篇文章主要介紹了用另一種方​​法來進行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

##以上就是本文的全部內容,希望對大家的學習有幫助,更多相關內容請關注PHP中文網!

相關推薦:

如何解決Laravel.log 檔案寫入的問題<a title="如何解决Laravel.log 文件写入的问题" href="http://www.php.cn/php-weizijiaocheng-406465.html" target="_blank"></a>

Laravel開發環境部署之homestead 安裝設定流程(windows系統)

laravel的路由(router)圖文詳解#

以上是用另一種方​​法來進行Laravel資料庫測試(SQLite)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn