把 API 效能測試工具對應到這三個問題

容量 → 負載產生器

  • 執行緒群組、逐步加壓、分散式工作節點。

  • 在發布前與架構變更後執行。持續執行的成本很高。

回歸 → 時間比對

  • 需要的是基準線與差異比對,而不是高並行。

  • 三者之中成本最低的一項,也是最常缺席的一項。

正確性 → 功能驗證

  • 針對回應主體做斷言,包括刁鑽輸入的情況。

  • 另外兩者的底層基礎。

多數團隊缺少的那一類

幾乎每個說自己有做效能測試的團隊都有負載產生器,但很少有團隊會針對每一次變更監看效能回歸。就成本與收穫而言,這個順序反了。

容量在版本之間很少改變,所以持續測它得不到什麼資訊。效能回歸則是一個 pull request、一個 pull request 累積出來的;等到每季一次的容量測試抓到它,你面對的是半年份的 commit,完全不知道是哪一次加進了那個沒有索引的查詢。

每一類該看什麼

  • 負載產生器: 能不能對回應主體做斷言,至少抽樣檢查。多數工具做得到,但很少團隊會開啟,這就是為什麼負載測試報告一片乾淨,而每一個回應其實都是空的。

  • 回歸工具: 它比對的是你自己的歷史數據,還是一個絕對門檻。別人的目標值說明不了你自己的產品。

  • 功能驗證: 有沒有涵蓋邊界案例。一個在大分頁尺寸下就開始變慢的查詢是結構性問題,在這裡會比容量測試早很多就被抓出來。

誠實地解讀百分位數

效能工具會給你百分位數,而這些數字經常被誤讀,誤讀的方式剛好會蓋掉你正在找的那個問題。

看起來漂亮的 p50 只說明了中位數的那一筆請求,對於運氣不好的人經歷了什麼完全沒有交代。一個每小時被呼叫一千次的端點,就算 p99 看起來沒問題,也代表每小時有十筆慢請求,也就是十個不耐煩的使用者。而把所有端點平均起來的數字幾乎沒有意義,因為它把健康檢查和報表產生混在一起算。

兩個習慣就能解決大部分問題:按端點分別看百分位數,而不是看整體加總;看 p95 和 p99,而不是看平均值。真正重要的端點通常就那幾個,長期追蹤那四個數字,比任何一次把所有東西攤開來的儀表板都更有用。

能省錢的順序

先正確性,再回歸,最後容量。對一個回傳錯誤內容的端點做負載測試,只會得到一個很有自信卻毫無意義的數字,而這正是效能專案浪費掉第一季最常見的方式。

終端機

npm install -g @testsprite/testsprite-cli
testsprite setup

如果你不想在本機安裝任何東西,TestSprite 儀表板也提供同樣的設定方式。CLI 其餘的功能都整理在 CLI 儲存庫。

工作階段、擷取的變數值、執行順序與清理,都記錄在 API 測試文件。

有兩條路徑,而選哪一條其實取決於誰擁有這條 pipeline。從儀表板連接 GitHub App 完全不需要更動你的儲存庫,因為它是對你的建置流程本來就會發出的部署事件做出反應。加上一個 GitHub Actions 步驟,則是把這項檢查放進儲存庫裡,讓它像建置流程的其他部分一樣接受審查。

TestSprite 補上的是什麼

正確性這一欄,也就是另外兩者的底層基礎。它斷言的是回應主體而不是狀態碼,涵蓋會讓結構性變慢浮現的邊界案例,並且在每一次 pull request 都會執行。

測試覆蓋是由一次探索掃描加上你的規格文件產生的。Auto-Authentication 讓工作階段在整輪執行中保持有效,Dynamic Variables 在呼叫之間傳遞變數值,Dependency Chains 推導出執行順序,Auto-Cleanup 則精準移除這輪執行所建立的東西。

它的價值在於,你的容量數字開始描述的是一個真的能運作的服務。一個在大分頁尺寸下變慢的查詢,在這裡被找出來的成本只是負載測試的零頭;而一個默默回傳空結果的端點,也不會再在吞吐量上拿到漂亮成績。

TestSprite 屬於這個類別嗎?

屬於正確性那一欄。它驗證的是行為,包括邊界案例,並不會產生持續的負載。

有沒有一個工具可以涵蓋這三件事?

有些工具宣稱可以。但實務上,產生負載和深入斷言回應主體是互相拉扯的,因為斷言會吃掉產生器的吞吐量。

合理的回歸門檻該設多少?

用你自己的數據波動來設。如果在沒有其他負載的環境下,每次執行的數字都會差上百分之十,那百分之五的門檻只是雜訊。

我們需要分散式的負載產生嗎?

只有在單一產生器成為瓶頸的時候才需要。很多團隊買了分散式的產能,卻從來沒有把它用滿過。

各自應該在哪裡執行?

正確性與回歸在每一次 pull request 執行。容量則在發布前與架構變更後執行。

簡短版

三個問題,三種工具。

API 效能測試工具可以分成負載產生器、回歸比對與功能驗證三類。多數團隊有第一類、缺第二類,而正確性是這兩者共同的底層基礎。