PHPUnit 自動化測試大作戰【CH09】

PHPUnit 自動化測試大作戰【CH09】

更新於 發佈於 閱讀時間約 3 分鐘

在之前的文章中,我們分別演練了 API 測試與資料庫測試,今天則讓我們停下腳步,來介紹一些 Laravel 提供的,與 自動化測試有關的 Trait 吧!

DatabaseMigrations

當我們使用了這個 Trait 後,會在每個測試被執行前,先執行 migrate ,接著在測試被執行後,會再執行 migrate:rollback ,這樣可以達成讓每一個測試被執行時,都有一個全新的空資料庫的效果。

DatabaseTransactions

這個 Trait ,會在每個測試被執行前,啟動資料庫的 Transaction 機制,接著在測試被執行後,會進行 Rollback 的動作,以達到類似重置資料庫的效果。

RefreshDatabase

這個應該是最常用到的自動化測試 Trait 了,它可以說是 DatabaseMigrations 與 DatabaseTransactions 的綜合體。使用它以後,它會判斷目前所使用的測試資料,是否為 In-memory 的形式,如果是,那就會執行 migrate;如果不是,則會在每一次測試執行前,先判斷是否執行過 migrate,如還未執行則執行之,如已執行,啟動資料庫的 Transaction 機制。

與 DatabaseMigrations 比較大的區別是,DatabaseMigrations 會讓 auto-generated ID 歸零,RefreshDatabase則不會。

WithoutMiddleware

有時我們要測試的功能,剛好會經過 Middleware ,而有時要讓測試能正常的通過 Middleware ,可能需要做一些準備,例如手動產製 Bearer Token 放入 Header ,以便過 auth 這個 Middleware 。

然而有時 Middleware 的邏輯,未必是此時我們想要測的目標,此時就可以使用這個 Trait ,讓我們在執行測試時,可以略過 Middleware 層,以便我們專注於我們想要測試的對象及其行為。

WithoutEvents

有時當我們不想在測試執行時,觸發各種 Event 時,便可使用這個 Triat ,不過筆者實務上不曾使用過。

WithFaker

還記得前一天在使用 factory 時,有個神秘的 $faker 嗎?這個 Trait 可以讓我們在測試程式碼中,也可以隨心所欲地產生假資料值。

以上就是今天要為大家介紹的幾個 Trait,建議大家可以自行實作幾個案例來用看看唷!(不過與資料庫相關的 Trait,如果初期還不熟的話,建議拿空的資料庫來做測試喔)

下一篇我們來討論 Auth 測試!

如果您喜歡這篇文章,歡迎加入追蹤以接收新文章通知 😄

參考資料

本系列文章目錄

avatar-img
WilliamP的沙龍
12會員
467內容數
歡迎來到 WilliamP 的沙龍天地,在這裡將與各位讀者探討各種主題,包刮高中數學題庫、PHP開發經驗、LINE聊天機器人開發經驗、書摘筆記等,歡迎交流!
留言
avatar-img
留言分享你的想法!
WilliamP的沙龍 的其他內容
在前一篇文章中,我們探討了多重資料庫連線情境下,Model 及 Database Assertion 的應對方式,不過實際上筆者認為比較有難度的,其實是 Migration 應對方式。 今天就讓我們來探討這部分吧! Migration 應對方式 對於多重資料庫連線這種情境,筆者實務上做過的對應
今天讓我們探討「缺乏 Migration Files 與 Factory Files」的 Legacy 情境吧! 很多時候我們會遇到沒有 Migration Files 或 Factory Files 的 Legacy Codebase,原因大概有以下幾種: 該程式庫原本不是以 Laravel
在實務情境上,常會有在單一專案程式庫中,存取多個不同資料庫的使用情境,在這種情況下,我們通常會設置多個資料庫連線(Database Connection)設定。 在平常開發使用設很方便,但要做測試時就會發現一些問題: 在測試程式碼或 Seeder 中調用 factory() 時,都是在預設連線資
在前一篇文章中,我們探討了多重資料庫連線情境下,Model 及 Database Assertion 的應對方式,不過實際上筆者認為比較有難度的,其實是 Migration 應對方式。 今天就讓我們來探討這部分吧! Migration 應對方式 對於多重資料庫連線這種情境,筆者實務上做過的對應
今天讓我們探討「缺乏 Migration Files 與 Factory Files」的 Legacy 情境吧! 很多時候我們會遇到沒有 Migration Files 或 Factory Files 的 Legacy Codebase,原因大概有以下幾種: 該程式庫原本不是以 Laravel
在實務情境上,常會有在單一專案程式庫中,存取多個不同資料庫的使用情境,在這種情況下,我們通常會設置多個資料庫連線(Database Connection)設定。 在平常開發使用設很方便,但要做測試時就會發現一些問題: 在測試程式碼或 Seeder 中調用 factory() 時,都是在預設連線資