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

來源:互聯網
上載者:User
這篇文章主要介紹了關於用另一種方法來進行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

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.