從 2.x 升級到 3.x

預估升級時間:2 分鐘

我們會盡全力記錄所有潛在的重大變更,但有些變更可能存在於框架中較少使用的部分。因此,這些變更中只有部分會影響您的應用程式。

更新依賴關係

影響機率:高

Pest 3 現在需要 PHP 8.2.0 或更高版本。要開始從 Pest 2 遷移到 Pest 3,請在應用程式的 composer.json 檔案中將 pestphp/pest 依賴關係更新為 ^3.0

1- "pestphp/pest": "^2.0",
2+ "pestphp/pest": "^3.0",

此外,如果您使用 Laravel,請將 Collision 升級到版本 8。請注意,此操作需要 Laravel 11。

1- "nunomaduro/collision": "^7.0",
2+ "nunomaduro/collision": "^8.0",

應在應用程式的 composer.json 檔案中將所有其他 Pest 維護的外掛程式更新為版本 ^3.0

1- "pestphp/pest-plugin-laravel": "^2.0",
2+ "pestphp/pest-plugin-laravel": "^3.0",

PHPUnit 11 變更

影響機率:中

Pest 3 是建立在 PHPUnit 11 之上。這表示對 PHPUnit 11 進行的任何顯著變更都可能對您的測試套件產生影響。要檢視 PHPUnit 11 中導入的所有變更,請參閱 PHPUnit 11 變更日誌

toHaveMethodtoHaveMethods 預期

影響機率:低

toHaveMethodtoHaveMethods 預期已改為 toHaveMethodtoHaveMethods 架構預期。如果您使用這些預期,您將不再能夠提供物件,因為架構預期需要命名空間或類別名稱。

1-expect($object)->toHaveMethod('method');
2+expect($object::class)->toHaveMethod('method');

pest()

Pest 2 不推薦使用

在 Pest 2 發行期間,有些功能已不推薦使用,並已在 Pest 3 中移除。以下是您應該注意的變更

tap() 方法

影響機率:低

執行高階測試時,你可能利用了 tap() 方法,在執行階段需要延遲評估的物件上呼叫斷言。在 Pest 2 中,tap() 方法已被棄用,在 Pest 3 中,它已移除。取而代之的是,你應該使用 defer() 方法。

1it('creates admins')
2- ->tap(fn () => $this->artisan('user:create --admin'))
3+ ->defer(fn () => $this->artisan('user:create --admin'))
4 ->assertDatabaseHas('users', ['id' => 1]);

從 1.x 升級到 2.x

預估升級時間:2 分鐘

我們會盡全力記錄所有潛在的重大變更,但有些變更可能存在於框架中較少使用的部分。因此,這些變更中只有部分會影響您的應用程式。

更新依賴關係

影響機率:高

Pest 2 現在需要 PHP 8.1.0 或更高版本。若要開始將 Pest 1 移轉到 Pest 2,請在你的應用程式的 composer.json 檔案中將 pestphp/pest 依賴關係更新為 ^2.0

1- "pestphp/pest": "^1.22",
2+ "pestphp/pest": "^2.0",

接下來,如果你包含了 PHPUnit,你可以從你的依賴關係清單中移除它。

1- "phpunit/phpunit": "^9.5.10",

此外,如果你正在使用 Laravel,請將 Collision 升級到版本 7。請注意,Laravel 10 是必要的。

1- "nunomaduro/collision": "^6.0",
2+ "nunomaduro/collision": "^7.0",

如果你正在使用 Parallel Plugin (或 Paratest),你可以從你的依賴關係中移除它,因為它現在預設包含在 Pest 中。

1- "brianium/paratest": "^6.8.1",
2- "pestphp/pest-plugin-parallel": "^1.2.1",

Global Assertions Plugin 已封存,應從你的依賴關係中移除。

1- "pestphp/pest-plugin-global-assertions": "^1.0.0",

如果你依賴 Global Assertions Plugin,你可以使用 $this 變量存取相同的底層斷言。或者,你可以移轉到 Expectation API

1test('sum', function () {
2 $result = sum(1, 2);
3 
4- assertSame(3, $result);
5+ $this->assertSame(3, $result); // or expect($result)->toBe(3)
6});

所有其他由 Pest 維護的 plugin 都應在你的應用程式的 composer.json 檔案中更新為版本 ^2.0

1- "pestphp/pest-plugin-laravel": "^1.4",
2+ "pestphp/pest-plugin-laravel": "^2.0",

如果你正在使用 Faker Plugin,faker() 函數已更名為 fake()。你需要更新所有使用方式。

1- use function Pest\Faker\faker;
2+ use function Pest\Faker\fake;
3 
4test('faker', function () {
5- expect(faker()->name())->toBeString();
6+ expect(fake()->name())->toBeString();
7});

PHPUnit 10 變更

影響機率:中

如果你以前使用的是 PHPUnit 而不是 Pest,你的 phpunit.xml 檔案可能需要更新。如果是這樣,你在第一次執行 Pest 2 時可能會遇到以下訊息。

1WARN Your XML configuration validates against a deprecated schema. Migrate your XML configuration using "--migrate-configuration"!

若要解決此問題,只需使用 --migrate-configuration 選項重新執行 Pest。

1./vendor/bin/pest --migrate-configuration

Pest 2 建構在 PHPUnit 10 之上。這表示對 PHPUnit 10 進行的任何顯著變更都可能對你的測試套件產生影響。若要檢視 PHPUnit 10 中引入的所有變更,請參閱 PHPUnit 10 變更記錄

高階測試

影響機率:低

執行高階測試時,你可能利用了 tap() 方法,在執行階段需要延遲評估的物件上呼叫斷言。在 Pest 2 中,tap() 方法已被棄用。取而代之的是,你應該使用 defer() 方法。

1it('creates admins')
2- ->tap(fn () => $this->artisan('user:create --admin'))
3+ ->defer(fn () => $this->artisan('user:create --admin'))
4 ->assertDatabaseHas('users', ['id' => 1]);

資料集

連結資料集

影響可能性:非常低

如果你正在使用「連結」資料集,並連結單個資料集參數,現在你必須輸入對應的測試參數。

1-it('can generate the full name of a user', function ($user, $fullName) {
2+it('can generate the full name of a user', function (User $user, $fullName) {
3 expect($user->full_name)->toBe($fullName);
4})->with([
5 [fn() => User::factory()->create(['first_name' => 'Nuno', 'last_name' => 'Maduro']), 'Nuno Maduro'],
6 [fn() => User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Downing']), 'Luke Downing'],
7 [fn() => User::factory()->create(['first_name' => 'Freek', 'last_name' => 'Van Der Herten']), 'Freek Van Der Herten'],
8]);

範圍資料集

影響可能性:非常低

雖然我們在 Pest 1 中先前記載資料集應該只使用 tests/Pest.phptests/Datasets.php 檔案中的 `dataset` 函式來宣告,您實際上可以在測試套件內的任何測試檔案中宣告資料集。然而,在 Pest 2 中,隨著 範圍限定資料集 的引入,在測試檔案中宣告的資料集只能在同一個測試檔案中使用。因此,如果您的資料集需要可以從全域存取,請確保將其放置在 tests/Pest.phptests/Datasets.php 檔案中。


這結束了 Pest 2 升級指南。在下一個章節中,我們將介紹您可以如何輕鬆地將測試從 PHPUnit 移轉至 Pest:從 PHPUnit 移轉