Playwright API 測試做對了什麼
一流的 request context。 API 呼叫不需要瀏覽器頁面,因此檢查能以一次請求的速度跑完。
可重複使用的已驗證狀態。 登入一次、把狀態存下來,之後所有測試共用。這是相較於舊有框架最實際的一項改進。
兩個層級共用同一個執行器。 一套報告工具、一個 CI job、一種執行方式。當你就是那個要維護的人時,這件事的價值常被低估。
對於本來就長期使用 Playwright、而 API 覆蓋需求又只是中等規模的團隊來說,這確實是個相當不錯的位置。
它幫不上忙的地方
存下來的狀態會過期
存下來的驗證資訊只是一個快照。token 會過期,而更新的邏輯得由你自己寫、自己維護。
資料相依性
哪個測試會建立另一個測試需要的資料,以及當前者失敗時會發生什麼事。
全靠手寫的 fixture、執行順序與 skip 條件來表達。
並行執行下的清理
Playwright 本來就設計成平行執行測試,這讓以命名規則比對的清理方式變得不安全。
清理必須綁定到每一次執行實際建立出來的資料。
這些都不是框架的缺陷。它們是 API 測試中沒有任何執行器能替你解決的部分,同時也構成了長期成本的大宗。
覆蓋範圍取決於你想得到什麼
比較少被提起的問題是:手寫的測試套件只會涵蓋有人記得的端點。錯誤碼、邊界值與少用的參數,正好就是會出問題的那些情況,也正好是晚上十一點沒人會想動手寫的那些。
改由規格文件、或對執行中的服務做一次探索來產生覆蓋,會徹底改變你所涵蓋的範圍樣貌,而這比任何單一斷言寫起來順不順手都更重要。
專門打造的那一層負責什麼
不論你用哪套工具,決定一個 API 測試套件能不能撐過第一年的都是四件事:會過期的 session、只在執行期才存在的值、彼此相依的呼叫,以及沒人清理的資料。TestSprite 把它們分別稱為 Auto-Authentication、Dynamic Variables、Dependency Chains 與 Auto-Cleanup,而 API 測試文件 說明了背後的運作機制。
storage state 撐不住的地方
重複使用已驗證的 storage state,是 Playwright 在 API 工作上帶來最大的便利,而在你把整套測試建立在它之上以前,有三個邊界值得先弄清楚。
存下來的狀態是一個快照,因此只要 token 效期夠短,就會在執行到一半時過期,產生看起來和授權錯誤一模一樣的失敗。存下來的狀態也只屬於單一使用者,所以任何需要第二個帳號來驗證權限的測試,都得另外自行準備。而存下來的狀態還記錄了它產生時所對應的環境,這表示拿本機產生的狀態檔去跑 staging,會製造出一類讓人摸不著頭緒的失敗。
這些都不是不該用它的理由。它們只是解釋了為什麼專案最後都會長出一個小模組,用來依使用者、依環境管理狀態檔——而那正是你開始動手打造你原本想避開的那個東西的時刻。
讓兩者並行運作
瀏覽器流程,以及那些真的需要在同一個測試裡同時涵蓋兩端的跨層檢查,留給 Playwright。API 表面的廣度覆蓋,則交給自動產生的測試。兩者從同一條 pipeline 執行,彼此不需要知道對方的存在。
GitHub App 是你在 TestSprite 儀表板中設定的一個 webhook。它會監聽你的 pipeline 本來就會發出的部署事件,因此你的儲存庫完全不用改動。
GitHub Actions 則是把這個步驟放進你自己的 workflow,從終端機完成設定。最新的指令列在 CLI 儲存庫。
TestSprite 從哪裡接手
瀏覽器流程與跨層測試留給 Playwright。TestSprite 接手的是廣度與狀態處理——不論 request context 做得多好,這兩塊永遠還是你自己的事。
具體來說,就是用 Auto-Authentication 取代你得依使用者、依環境維護的 storage state 模組,用 Dependency Chains 取代 fixture 與執行順序慣例,並用綁定每一次執行的 Auto-Cleanup 取代那種必須在平行執行下保證安全的前綴比對刪除。覆蓋範圍來自你的規格與執行中的服務,而不是來自某個人記得要寫的部分。
結果是,那半天寫出來的輔助程式碼,不必再變成某個人長期背在身上的責任——真正的成本從來就不是寫的那一次,而是後續的維護。
只用 Playwright 做 API 測試夠嗎?
如果 API 表面規模中等,而且有團隊持續維護,那就夠了。真正的問題在於,你願不願意自己扛下 session 更新、相依順序與並行安全的清理,因為選了這條路,這些就是隨之而來的。
storage state 能解決驗證問題嗎?
它解決的是重複登入,不是過期。存下來的狀態只是一個快照,總得有東西負責更新它。
兩套測試可以共用憑證嗎?
共用來源,不要共用 session。讓每一層各自取得自己的 session,才不會讓其中一層的失敗連帶拖垮另一層。
那契約測試呢?
那是另一種工具。契約測試檢查的是兩個服務對 schema 有沒有共識;這裡檢查的是執行中的服務行為是否正確。
自動產生的覆蓋會和我們現有的測試重複嗎?
有一些重疊沒關係,成本也很低。把自動產生的那一層用在廣度上,手寫測試則留給你刻意定義出來的那些流程。