最佳化測試

Pest 提供多種最佳化技術,以協助開發人員撰寫有效率且效能良好的測試。其中一項最重要的技術為平行測試,它允許多個測試同時在多個程序中執行,使用 --parallel 選項。此技術能大幅減少執行測試所需的時間並提升您的測試套件的整體效能。

此外,Pest 提供 --profile flag,用於快速找出執行速度較慢的測試,讓您能夠最佳化它們的執行。

最後,僅專注在您的測試套件的失敗案例通常很有用。為此,當執行 Pest 時,您可以使用 --compact 印表機。這會指示 Pest 僅顯示與您的測試套件失敗測試相關的資訊。

平行測試

Pest 2 中的平行測試執行速度提升 80%。這個令人印象深刻的結果,只因為重新建構平行測試核心系統才有可能。這個新的核心包含進階的技術,用於在測試用例執行之間重複使用程序。

預設情況下,Pest 會在單一程序中依序執行您的測試。但是,您可以透過 --parallel 選項,在多個程序中同時執行測試,大幅縮短執行測試所需的時間。

1./vendor/bin/pest --parallel

在平行執行測試時,Pest 會為您的電腦上每個可用的 CPU 核心建立一個程序。但是,您可以使用 --processes 選項手動修改程序數目。

1./vendor/bin/pest --parallel --processes=10

以下是撰寫要平行執行的測試時,需要特別注意的一些重點

  1. 資料庫資源可能不會在測試之間共享:每個測試都應該是孤立且獨立於其他測試的。
  2. 測試順序可能沒有保障:測試不應該依賴於任何特定的執行順序。
  3. 測試可能會受競爭狀態影響:當多個程序或執行緒存取共享資源時,可能會發生競爭狀態。請務必設計您的測試,以處理潛在的競爭狀態,並儘可能避免競爭狀態。

剖析

想像你有一個龐大的測試套件,執行需要好幾分鐘。你注意到某些測試執行時間比其他測試長很多,但你不知道哪些測試最慢,或者是什麼原因造成執行速度變慢。

若要找出最慢的測試並最佳化執行,你可以使用 Pest 的 --profile 選項。啟用此標示執行測試套件時,Pest 會收集每個測試的持續時間,並提供一份凸顯最慢測試的報告。

1./vendor/bin/pest --profile

例如,假設你執行測試套件並看到下列輸出

你可以看到 UserTest > create userOrderTest > create order 測試執行時間明顯比其他測試長很多。透過分析這個測試,你可能會發現它執行好幾個低效率的資料庫查詢,或執行其他耗費資源的作業,這些作業可以最佳化以縮短執行時間。

精簡式印表機

如果你有大量的測試,那麼專注在錯誤的測試上會很有幫助。你可以使用 --compact 印表機指示 Pest 只顯示測試錯誤,如此一來就能更輕鬆找出並解決任何問題,而且沒有通過所有測試的雜訊。

此外,由於 --compact 印表機會產生更簡潔的輸出,因此可以提升測試速度幾毫秒,這是因為每個測試所需的輸入/輸出較少。

你甚至可以將 Pest 設定為始終使用精簡式印表機,這樣你在每次執行測試套件時就不用指定 --compact 選項。

1// tests/Pest.php
2pest()->printer()->compact();
3 
4//

現在你已瞭解如何加速測試套件,接下來我們來討論持續整合:持續整合