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

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

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

今天讓我們來看看播種器吧!

什麼是播種器

播種器 (Seeder) 是 Laravel 提供的一個批次建立測試資料的功能,可以讓我們將建立測試資料的邏輯,統一寫在一個播種器類別中,方便我們重複調用以建立否些特定資料。

播種器實例

  • 建立播種器指令
php artisan make:seeder UserSeeder
  • database/seeders/UserSeeder.php
<?php

namespace Database\Seeders;

use App\Models\User;

use App\Models\UserLog;

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder{

/** * Run the database seeds. * * @return void */

public function run() {

$users = User::factory()

->count(10)

->create();

foreach ($users as $user) {

UserLog::factory()

->count(5)

->create([

'user_id' => $user->id

]); } }}

在以上播種器程式碼中,run() 這個函數便是播種器主要執行的邏輯區塊。我們在這個播種器內,實作了一個使用 Model Factory 批次建立10筆使用者資料的邏輯,同時會對每個使用者資料,各別建立5筆Log資料。

  • tests/Feature/UserTest.php
<?php

namespace Tests\Feature;

use Database\Seeders\UserSeeder;

use Illuminate\Foundation\Testing\RefreshDatabase;

use Tests\TestCase;

class UserTest extends TestCase{

use RefreshDatabase;

public function testUserSeeder() {

$this->seed(UserSeeder::class);

// 下略

} public function testUserSeeder2() {

$this->seed(UserSeeder::class);

// 下略

}}

在以上的測試程式碼中,我們調用了 UserSeeder 這個播種器來建立資料,當有多個測試案例函數都需要某一群特定資料時,用播種器來建立測試資料,可以避免實作重複的建立測試資料邏輯四散在不同的測試案例函數中。

除了在測試程式碼中調用播種器,也可以用指令的方式進行資料播種:

php artisan db:seed --class=UserSeeder

另外,其實也可以在A播種器調用其他播種器:

<?php

namespace Database\Seeders;

use App\Models\User;

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder{

/** * Run the database seeds. * * @return void */

public function run() {

User::factory()

->count(10)

->create();

foreach ($users as $user) {

UserLog::factory()

->count(5)

->create([

'user_id' => $user->id

]); } // 假設有實作另一組播種器 PostSeeder

$this->call([

PostSeeder::class,

]); }}

以上就是今天關於播種器的介紹,大家可以多加利用!

下一篇讓我們來看一下 Mocking 技巧吧!

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

參考資料

本系列文章目錄

avatar-img
WilliamP的沙龍
12會員
463內容數
歡迎來到 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() 時,都是在預設連線資