Pest v3 現已推出

今天,我們很興奮地宣布推出Pest 3。如同我們在 Laracon US 宣佈的,Pest 3 引入了突變測試、架構預設值、團隊管理、新的設定 API,以及多項針對架構測試和更多項目的改進。

查看 Pest 的建立者 Nuno Maduro 現場示範 Pest 3 的新功能

以下是我們將介紹此版本所有精彩細節。和以往一樣,你可以在我們的網站上找到升級指南

  • 突變測試:一種創新的新技術,對你的程式碼進行微小的變更,以查看測試是否能偵測到這些變更。
  • 架構預設值:一套預定義的規則,可用於測試應用程式的架構。
  • 團隊管理:一個新功能,讓你可以直接從主控台管理你的團隊任務和待辦事項。
  • 新的設定 API:一個更直覺且容易使用的設定 API。
  • 更多架構測試改進toUseStrictEqualitytoHaveMethodsDocumented->not->toHaveProtectedMethods,以及更多。
  • 以及更多...:類型範圍中新增常數、靜態分析改進,以及更多。

突變測試

突變測試是一種創新的新技術,它對你的程式碼進行微小的變更(突變),以查看測試是否能偵測到這些變更。這能確保你徹底測試應用程式,不只達到程式碼覆蓋率,更著重於測試的實際品質。這是找出測試套件弱點並提升品質的絕佳方式。

Mutation Testing

若要開始進行突變測試,請前往你的測試檔案,並使用 covers() 函數,具體說明測試涵蓋程式碼的哪個部分。

1covers(TodoController::class);
2 
3it('list todos', function () {
4 $this->getJson('/todos')->assertStatus(200);
5});

然後,執行 Pest PHP 並加上 --mutate 選項以開始突變測試。

1./vendor/bin/pest --mutate
2# or in parallel...
3./vendor/bin/pest --mutate --parallel

Pest 隨後會對「突變」的程式碼重新執行你的測試,並查看這些測試是否仍然通過。如果某個測試針對突變仍然通過,表示該測試未覆蓋程式碼的特定部分。因此,Pest 將輸出突變和程式碼差異。

1UNTESTED app/Http/TodoController.php > Line 44: ReturnValue - ID: 76d17ad63bb7c307
2 
3class TodoController {
4 public function index(): array
5 {
6 // pest detected that this code is untested because
7 // the test is not covering the return value
8- return Todo::all()->toArray();
9+ return [];
10 }
11}
12 
13 Mutations: 1 untested
14 Score: 33.44%

在找出未測試的程式碼後,你可以撰寫額外的測試來涵蓋該程式碼。

1covers(TodoController::class);
2 
3it('list todos', function () {
4+ Todo::factory()->create(['name' => 'Buy milk']);
5 
6- $this->getJson('/todos')->assertStatus(200);
7+ $this->getJson('/todos')->assertStatus(200)->assertJson([['name' => 'Buy milk']]);
8});

然後,你可以重新執行 Pest 並加上 --mutate 選項,查看突變是否已「測試」且涵蓋。

1Mutations: 1 tested
2Score: 100.00%

突變分數越高,你的測試套件品質就越好。100% 的突變分數表示所有突變都已「測試」,這是突變測試的目標。

現在,如果您看到「未測試」或「未涵蓋」的變異,或者變異分數低於 100%,通常表示您有缺少測試測試未涵蓋所有臨界狀況

我們的外掛程式與 Pest PHP 深度整合。因此,每次引入變異時,Pest PHP 將會

  • 僅執行涵蓋變異程式碼的測試以加快處理速度。
  • 盡可能快取以加快後續執行的處理速度。
  • 如果已啟用,請使用平行執行以平行執行多項測試以加快處理速度。

變異測試有更多可探索的地方,例如 @pest-mutate-ignore--mutate --everything。您可以在我們的變異測試部分中瞭解更多資訊。

結構預設

如您所知,結構測試讓您可以指定期望值來測試您的應用程式是否符合一系列結構規則,協助您維護乾淨且可持續的程式碼庫。

這是 Pest 最熱門的功能之一,而在 Pest 3 中,我們引入了結構預設。結構預設是一組預定義的結構規則,您可以用來測試應用程式的結構。這些預設旨在協助您快速、輕鬆地開始結構測試。

Arch Presets

以下是 Pest 3 中可用的結構預設

php

php 預設是一組預定義的期望值,可使用在任何 PHP 專案上。它並未搭配任何架構或函式庫。

它避免使用 dievar_dump 等函式,並確保您未使用已棄用的 PHP 函式。 原始碼

1arch()->preset()->php();

安全性

安全性 預設是一組預定義的期望值,可使用在任何 PHP 專案上。它並未搭配任何架構或函式庫。

它確保您未使用可能導致安全性漏洞的程式碼,例如 evalmd5 等函式。 原始碼

1arch()->preset()->security();

Laravel

Laravel 預設是一組預定義的期望值,可使用在Laravel專案上。

它確保專案的結構遵循已知的 Laravel 慣例,例如控制器只有 indexshowcreatestoreeditupdatedestroy 等公開方法,並總是加上 Controller 字尾等。 原始碼

1arch()->preset()->laravel();

嚴格

嚴格 預設是一組預定義的期望值,可使用在任何 PHP 專案上。它並未搭配任何架構或函式庫。

它確保您在所有檔案中使用嚴格類別,所有類別都是最終的等等。 原始碼

1arch()->preset()->strict();

寬鬆

relaxed 預設值是一組預設的預期,可於任一 php 專案上使用。未與任何架構或函式庫結合。

strict 預設值相反,可確保你在檔案中未全部使用嚴格型態,所有類別並非最終版本,還有更多。來源程式碼

1arch()->preset()->relaxed();

就像一般的架構測試一樣,你可以使用 ignoring() 方法略過特定預期目標。

1arch()->preset()->security()->ignoring('md5');
2 
3arch()->preset()->laravel()->ignoring(User::class);

若要開始使用架構預設值,請參閱我們的 架構測試部分。

團隊管理

Pest 3 也推出了團隊管理,這項新功能讓你能夠直接自控制台管理團隊任務和待辦事項。透過團隊管理,你可以建立任務、指派任務並追蹤任務,以及查看各個任務的狀態。

Team Management

若要開始在 Pest 中使用團隊管理,你需要在 Pest.php 設定檔中指定專案 URL。此 URL 將用於將待辦事項連結至對應的專案管理系統。

1pest()->project()->github('my-organization/my-repository');

如果你使用的是不同的版本控制系統,則可以使用 gitlabbitbucketjiracustom 方法。

最後,你可以使用 todo() 方法建立代辦事項。你也可以使用 assigneeissue 參數,將待辦事項指派給特定的團隊成員,或將待辦事項連結至專案管理系統中的議題。

1it('has a contact page', function () {
2 //
3})->todo(assignee: 'taylor@laravel.com', issue: 123);

此外,經常需要為待辦事項提供額外背景說明。Pest 讓你能夠撰寫待辦事項的註解,方式是將字串提供給 todo() 方法的 note 參數。

1it('has a contact page', function () {
2 //
3})->todo(note: <<<NOTE
4 Given I am a user
5 When I visit the contact page
6 Then I should see a contact form
7NOTE);

待辦事項完成後,你可以使用 wip() 方法將其標記為處理中,或使用 done() 方法將其標記為已完成。

1it('has a contact page', function () {
2 //
3})->wip(assignee: 'taylor@laravel.com', issue: 123); // or ->done()

最後,你可以透過在執行 Pest 時包含 --todos 選項,將待辦事項與測試套件中的其他部分分開查看。你也可以透過將名稱提供給 --assignee 選項,按指派人篩選待辦事項,或透過將議題編號提供給 --issue 選項,按議題篩選待辦事項。

1./vendor/bin/pest --todos --assignee=taylor # or --issue=123

團隊管理還有許多好用的功能,你可以在我們的 團隊管理 部分中進一步了解。

全新設定 API

Pest 1 / Pest 2 的設定 API 有點令人困惑,原本用於在封閉範圍內取得 $this 變數與測試個案執行個體綁定的 uses() 函式,最後幾乎用於所有事情。

在 Pest 3 中,我們推出了更直觀、更簡單使用的全新設定 API。新的設定 API 以 pest() 函式為基礎,可讓你使用流暢且具表現力的 API 設定 Pest。

注意:Pest 3 中仍有提供 uses() 函式,我們沒有計畫將其移除。不過,我們建議新專案使用新的設定 API。

1-uses(TestCase::class)->in(__DIR__);
2+pest()->extends(TestCase::class);
3 
4-uses(TestCase::class, RefreshDatabase::class)->in('Features');
5+pest()->extends(TestCase::class)->use(RefreshDatabase::class)->in('Features');
6 
7-uses()->compact();
8+pest()->printer()->compact();

當然,uses() API 中提供的任何方法,例如 ->beforeEach()->group(),在新 pest() 設定 API 中仍有提供;我們只是讓它變得更直觀、更易於使用。

更多架構 тестиং改良

新預期

同樣地,Pest 帶來了一堆新的架構預期和改良。其中一些已經使用在新架構預設中,不過你也可以個別使用它們。

你可以在我們的 架構測試 區段查看所有現有的架構預期。

中斷改進

你可能知道,Pest 允許你在每次測試後使用 afterEach() 方法執行特定中斷回呼。這對於清理資源或在測試之間重設狀態非常有用。

1afterEach(function () {
2 // This will run after each test...
3});

在 Pest 3 中,我們引入了一種新的 after() 方法,允許你在特定測試或使用 describe 區塊描述的一組測試後執行特定中斷回呼。}

1it('may list todos', function () {
2 //
3})->after(function () {
4 // This will run after this test only...
5});

若要了解有關鉤子的更多資訊,請參閱我們的 鉤子 區段。

其他改進

由於 Pest 3 是基於 PHPUnit 11,您現在可以在 Pest 使用任何 PHPUnit 11 功能。此外,Pest 3 還附帶了一系列次要的錯誤修正和改進。以下列出其中一些改進:

  • 特性:類型覆蓋範圍現在會檢查常數上是否有缺失類型。
  • 特性:測試上使用靜態閉包時的更好錯誤訊息 + 資料集上的錯誤引數。
  • 特性:在測試閉包中加入靜態分析工具的基本支援。
  • 特性:整體靜態分析改進,在預期和整個 API 表面上進行。
  • 功能:刪除 phpunit.xml 檔案且在 Pest 執行後保持可以正常運作的功能。
  • 修正:使用 --fail-on-xxx CLI 選項時,結束代碼計算不正確的問題。
  • 修正:Describe 區塊現在支援鏈結方法時呼叫多個方法。
  • 修正:現在在第一個測試之前會捕獲和顯示執行時期例外狀況。
  • 修正:當結果小於 100 但大於 99.5 時,會在使用 --min=100 選項時,發生報表失效的問題。
  • 還有更多內容...

現在是深入測試並開始使用 Pest 的最佳時機。若您已準備好立即開始使用 Pest 3,請參閱我們的安裝指南,取得逐步說明。如果您目前正在使用 Pest 2,我們在我們的升級指南中提供了詳細的升級說明。

謝謝您持續的支持與回饋。我們迫不及待地想看到您使用 Pest 3 完成的成果!


感謝您閱讀 Pest 3.0 的新功能!如果您正在考慮在您的下一個專案中使用測試架構,以下是您應該嘗試 Pest 的原因:為什麼選擇 Pest →