JMeter 真正出色的地方

  • 產生並行負載。 執行緒群組、逐步加壓、分散式產生器。這正是它當初被設計出來的目的,至今仍是最好的免費選擇之一。

  • 協定涵蓋面廣。 遠遠不只 HTTP,這對於含有訊息傳遞與資料庫層的企業系統很重要。

  • 它早就裝好了。 這不是技術優點,卻是團隊選它的真實原因。

JMeter API 測試開始彆扭的地方

測試計畫是 XML

  • 想在 pull request 裡審查一項變更,幾乎是不可能的任務。

  • .jmx 檔的合併衝突,則是另一種等級的痛苦。

預設的斷言很淺

  • 回應碼與子字串比對能涵蓋常見情況,除此之外就沒什麼了。

  • 只要牽涉到結構性的檢查,就得動用腳本元件。

狀態全靠手動

  • 擷取器、變數與控制器,全都得一個一個手動接起來。

  • 相依關係圖藏在測試計畫的結構裡,而不是被明確宣告出來。

行得通的分工

把 JMeter 留給容量問題:服務在持續並行之下表現如何、延遲會從哪裡開始惡化、什麼會最先壞掉。這正是它的用途,本文沒有任何一處在建議換掉它。

把功能正確性搬到另一個地方——一個把工作階段、擷取到的值、執行順序與清理當成產品本身的一部分,而不是當成要你自己拼裝的元件的地方。這四項的說明,請見 API 測試文件

無論如何,有一件事值得在 JMeter 裡做

在你的負載計畫裡加上回應內容的斷言,哪怕只抽樣一部分請求也好。只檢查狀態碼的負載測試,就算服務回傳的是空結果,也照樣會回報一切正常;而「又快又錯」是最糟的結果,因為沒有人會去追查它。

把功能測試這一層建起來

終端機

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

不想在本機安裝的人,用儀表板也能做到同樣的事;完整的指令清單則收錄在 CLI 儲存庫

把 .jmx 的問題說白

在 JMeter 裡做功能覆蓋之所以愈久愈難維護,問題不在斷言,而在檔案格式,值得具體說明原因。

測試計畫是 GUI 產生的 XML。只改一條斷言就開一個 pull request,得到的 diff 會是一堆被重新排序的元素和自動產生的識別碼,於是審查變成一種信任遊戲。同一週裡兩個人改同一份計畫,會產生一種合併衝突:與其讀懂它,不如直接捨棄其中一邊來得省事。而正因為審查不切實際,這份計畫就會不斷累積沒人看過的變更。

這是實實在在的成本,而當計畫只由一個人維護時,這筆成本完全看不見——偏偏大多數 JMeter 測試套件,正是在這種情況下建起來的。

不同的執行節奏

負載測試在發布前與架構變更後跑。正確性則每個 pull request 都跑,因為那是修掉回歸問題成本最低的時機。

  • GitHub App 是你在 TestSprite 儀表板裡設定的一個 webhook。它會監聽你的管線本來就會產生的部署事件,因此你的儲存庫完全不必改動。

  • GitHub Actions 則是把這個步驟放進你自己的工作流程裡,從終端機完成設定。

TestSprite 能從負載計畫裡接走什麼

那些只因為 JMeter 本來就在、才被塞進 JMeter 的功能覆蓋。測試計畫由一次探索掃描加上你的規格產生,以自然語言描述,而不是靠元件拼裝出來;而且可以在 pull request 裡審查,而不是埋在自動產生的 XML 裡。

Auto-Authentication 讓工作階段在整輪執行中保持有效,Dynamic Variables 在呼叫之間傳遞值,Dependency Chains 依據每個案例需要什麼、產出什麼來推導執行順序,Auto-Cleanup 則精準清除這一輪執行所建立的東西。這些正是你現在要靠擷取器、變數、控制器和 teardown 執行緒群組自己組出來的部分。

你的負載計畫原封不動,繼續做 JMeter 真正出色的那件事。改變的是:正確性測試變成每個 pull request 都跑,而不是等到發布前才跑;而且斷言的變更,第二個人也讀得懂。

JMeter 能做功能性的 API 測試嗎?

可以,只是整個使用體驗處處跟你作對。XML 計畫、淺薄的預設斷言,以及全手動的狀態處理,就是你要付的代價。

我們該換掉 JMeter 嗎?

負載測試不必換。該換掉的是當初誤打誤撞跑到上面的功能覆蓋,負載計畫留著。

那 Taurus 或 JMeter DSL 呢?

兩者都大幅改善了撰寫體驗,但都改變不了這個工具原本被最佳化的方向。

兩者可以同時放在 CI 裡跑嗎?

可以。它們以不同的節奏回答不同的問題,而且彼此都不需要知道對方的存在。

TestSprite 會產生負載嗎?

不會。它驗證的是正確性,包含邊界情況。持續並行是 JMeter 的地盤。

簡短版

負載計畫留著,把正確性搬走。

JMeter API 測試之所以行得通,是因為 JMeter 本來就在,而不是因為它合適。容量問題留給它,在你現有的負載計畫裡加上回應內容斷言,然後把功能正確性交給真正為工作階段、狀態、執行順序與清理而設計的地方。