Pest 的夏季辣味版本

「夏季辣味」是指定給 Pest 2.9 的代號。

在 2023 年 3 月 20 日,我們自豪地介紹了 Pest 2.0,標誌著它是迄今為止最重要的版本,在撰寫本文時已下載超過 700 萬次。此版本展示了一個非凡的架構外掛、平行測試中提升 80% 的速度、設定檔選項以及許多其他功能。

隨著夏季的到來,我們很興奮地宣佈即將推出的版本:備受期待的「夏季辣味」版本。此版本帶來了許多令人興奮的功能,會讓它感覺就像是一個重大版本,雖然實際上並非如此 - 它是 Pest v2.9.0 - 因此透過「composer update」就能取得它。話不多說,讓我們來看看我們為今年夏天準備了什麼

  • 內建快照測試,讓您可以輕鬆測試代碼的長輸出
  • 描述區塊,用於群組測試並分享設定和終止邏輯
  • 架構測試++,更強大的架構測試
  • 類型涵蓋率外掛,用於測量由類型宣告涵蓋的程式碼百分比
  • 偏離外掛,自動將您的 PHPUnit 測試轉換成 Pest

內建快照測試

在這裡閱讀完整文件:pestphp.com/docs/snapshot-testing

快照測試是一種測試技術,可用於斷言函數或方法的輸出沒有變更。這是一種測試程式碼庫並確保您的程式碼沒有意外變更的好方法。

現在,我們很自豪地宣佈 Pest 將有內建的快照測試支援。舉例來說,假設每次執行「聯絡人」端點時,都會輸出特定的 HTML。您可能會撰寫像這樣的測試

1it('has a contact page', function () {
2 $response = $this->get('/contact');
3 
4 expect($response)->toMatchSnapshot();
5});

第一次執行此測試時,它會在 tests/.pest/snapshots 建立一個快照檔案,其中包含回應內容。下次執行測試時,它會將回應與快照檔案進行比較。如果回應不同,則測試會失敗。如果回應相同,則測試會通過。

此外,提供的預期值不一定是回應;它可以是任何東西。例如,您可以建立陣列的快照

1$array = /** Fetch array somewhere */;
2 
3expect($array)->toMatchSnapshot();

當然,您可以隨時使用 `--update-snapshots` 選項「重建」快照

1./vendor/bin/pest --update-snapshots

描述區塊

自從我們發布 Pest 之後,描述區塊一直是最受請求的功能之一。它們是任何「功能」測試框架的基本,因為它們允許您對測試進行分組並共用設定和終止邏輯。

1beforeEach(fn () => $this->user = User::factory()->create());
2 
3describe('auth', function () {
4 beforeEach(fn () => $this->actingAs($this->user));
5 
6 test('cannot login when already logged in', function () {
7 // ...
8 });
9 
10 test('can logout', function () {
11 // ...
12 });
13})->skip(/* Skip the entire describe block */);
14 
15describe('guest', function () {
16 test('can login', function () {
17 // ...
18 });
19 
20 // ...
21});

架構測試 + +

在這裡閱讀完整文件:pestphp.com/docs/arch-testing

Pest 一直致力於讓測試更令人愉快。上一個版本中,我們引入了架構期望,讓您可以測試程式碼庫的架構。在此版本中,我們很榮幸地宣布 Pest 已透過新增其他架構期望改良了架構期望。

1test('controllers')
2 ->expect('App\Http\Controllers')
3 ->toUseStrictTypes()
4 ->toHaveSuffix('Controller') // or toHavePreffix, ...
5 ->toBeReadonly()
6 ->toBeClasses() // or toBeInterfaces, toBeTraits, ...
7 ->classes->not->toBeFinal() // 🌶
8 ->classes->toExtendNothing() // or toExtend(Controller::class),
9 ->classes->toImplementNothing() // or toImplement(ShouldQueue::class),

型別涵蓋範圍外掛程式

在這裡閱讀完整文件:pestphp.com/docs/type-coverage

您可能知道,Pest 提供 `--coverage` 旗標,讓您可以在終端機上產生華麗的涵蓋範圍報告。此報告會顯示您的測試涵蓋程式碼的哪些行。這是確保您的測試涵蓋所有程式碼的好方法。

針對這一點,我們很自豪地宣布 Pest 現在內建型別涵蓋範圍支援。這表示您現在可以看到您的原始碼是否已在所有可能的地方使用「型別」。例如,假設您有一個儲存庫,其中有以下方法

1public function find($id)
2{
3 return User::find($id);
4}

此方法缺少一個參數型別和一個回傳型別。因此,如果您執行 `pest --type-coverage`,您會看到以下輸出,並知道您需要針對此方法新增型別

1...
2app/Models\User.php .......................................... 100%
3app/Repositories/UserRepository.php .................. pa8, rt8 33%
4───────────────────────────────────────────────────────────────────
5Total: 91.6 %

此外,就像一般涵蓋範圍一樣,您可以強制執行 `--min` 型別涵蓋範圍百分比。例如,如果您執行 `--type-coverage --min=100`,您會看到以下輸出

1...
2app/Models\User.php .......................................................... 100%
3app/Repositories/UserRepository.php .................................. pa8, rt8 33%
4───────────────────────────────────────────────────────────────────────────────────
5 Total: 91.6 %
6 ERROR Type coverage below expected: 91.6%. Minimum: 100.0%

漂移外掛程式

在這裡閱讀完整文件:pestphp.com/docs/migrating-from-phpunit-guide

是的,沒錯。我們很榮幸地宣布 Pest 現在將擁有類似於 Laravel shift 的工具,稱作 Drift。Drift 將允許您在幾秒鐘內將 PHPUnit 測試升級為 Pest 測試。

因此,如果您有類似這樣的測試

1<?php
2 
3namespace Tests\Unit;
4 
5use PHPUnit\Framework\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 public function test_that_true_is_true(): void
10 {
11 $this->assertTrue(true);
12 }
13}

您可以執行 `./vendor/bin/pest --drift`,而且 Pest 會自動將您的 PHPUnit 測試轉換為 Pest 測試

1 
2 
3test('true is true', function () {
4 expect(true)->toBeTrue();
5});

感謝您閱讀 Pest 2.9 的新功能!如果您正在考慮為您的下一個專案尋找測試框架,以下就是您應該試用 Pest 的原因:為何選擇 Pest →