先講結論
-
選擇 Cypress,前提是 你希望測試就放在自己的儲存庫裡,用團隊每天在寫的語言撰寫,並擁有難以超越的除錯體驗,而且你有餘力撰寫與維護它們。
-
選擇 TestSprite,前提是 你的瓶頸不在於把測試寫出來,而在於決定該測什麼、以及讓整套測試持續有效,尤其當大量程式碼來自 coding agent,產出速度快到沒人來得及審查時。
-
兩者並用,前提是 你已經有一套值得保留的 Cypress 測試。讓它繼續涵蓋團隊刻意撰寫的流程,再用 agent 驗證補上沒人有時間撰寫的廣度。
說白了,這是人力餘裕與掌控程度之間的取捨。Cypress 給你完全的掌控,代價是你得自己撰寫與維護。agent 讓你不必親自動筆就取得廣度,代價是你得接受並非每一個步驟都出自你手。
並列比較
| 比較面向 | Cypress | TestSprite |
|---|---|---|
| 這是什麼 | 一套讓你用程式碼撰寫測試的框架與執行器 | 一個針對運行中的應用程式規劃、執行並判讀測試結果的 agent |
| 由誰撰寫測試 | 你的工程師,以 JavaScript 或 TypeScript 撰寫 | 從你的原始碼產生,再以自然語言微調 |
| 測試放在哪裡 | 在你的儲存庫裡,和其他程式碼一樣接受審查 | 在專案中,每個測試過往的執行紀錄都可查詢 |
| 除錯體驗 | 非常出色。時光回溯、即時重新載入、熟悉的工具鏈 | 執行過程錄影,加上說明哪裡出現落差的失敗報告包 |
| 當 UI 改動時 | 選擇器失效,得有人去修 | 步驟描述的是意圖,因此外觀上的改動通常不受影響 |
| 持續成本 | 撰寫加上維護,隨測試套件規模一起成長 | 審查與調整,成長速度較慢 |
| 最適合 | 有 QA 人力、偏好以程式碼處理的團隊 | 沒有專職 QA、出貨的程式碼多由 agent 撰寫的團隊 |
| 最弱的地方 | 廣度。只能涵蓋有人寫出來的部分 | 對單一步驟的細部掌控 |
Cypress 確實是更好答案的場合
有些情況下,直覺去找 agent 反而是錯的,值得一一點名。
元件層級的測試。 把元件獨立掛載起來、驗證它的行為,這是 Cypress 的主場。讓 agent 去操作瀏覽器做這件事,層級並不對。
確定性高、涉及安全性的流程。 當每一步的順序都很重要、而且絕不能有任何偏移時,每個步驟都白紙黑字寫下來並經過審查的測試,才是正確的工具。
把測試當成可執行的規格。 有些團隊把測試套件當成功能行為的權威說明。這樣的文件應該由人撰寫,而不是自動產生。
你已經有一套健康的測試。 一套大家信任、也持續維護的 Cypress 測試是資產。為了整併工具而整套換掉,通常划不來。
框架這套模式的極限在哪裡
限制不在技術,而在算術。每一個測試都得由人來寫,而人數是固定的,功能數量卻不是。當 coding agent 產出變更的速度快到沒人讀得完,測試套件就會在你最需要它的時候落後。
最先出現的是兩個徵兆。一是測試涵蓋的範圍集中在寫起來有意思的流程上,而那些通常不是真正會壞掉的流程。二是每個 sprint 花在維護上的比重一路往上爬,直到有人提議把不穩定的測試刪掉,測試套件就是這樣死掉的。
同時使用兩者又不重複做工
實務上行得通的劃分方式,是看這個測試是誰決定要有的。
留在 Cypress 的
元件測試。
步驟細節本身就是約定一部分的流程。
任何由人刻意坐下來明確定義的東西。
交給 agent 的
橫跨各個畫面、沒人有時間撰寫的大範圍回歸測試。
驗證來自 coding agent 的變更。
那些其實重要、卻從來排不進任何人清單的長尾流程。
兩者都不該碰的
負載與效能測試。那是另一種工具。
資安掃描。那是另一種工具。
任何你說不出正確結果應該長什麼樣的東西。
兩者可以跑在同一條 pipeline 上。Cypress 照舊在你的 CI job 裡執行;agent 驗證則可以由 pipeline 本來就會發出的部署事件觸發,等新版本上線後才開始跑,並把結果回報到 pull request。兩邊都不需要知道對方的存在。
如果你正在評估,就測這一點
不論你在比較哪些工具,都刻意弄壞一個東西,看看各家會回報什麼。製造一個真實的回歸,例如一個按下去不會真的存檔的儲存按鈕,然後檢查三件事:它會不會失敗?失敗訊息有沒有指出真正的落差?負責修的人或 agent 能不能直接根據這份輸出開始動手,而不必自己重新推敲來龍去脈?如果一次執行根本沒跑到驗證就回報通過,那它已經沒通過唯一重要的那場考驗。
TestSprite 在 Cypress 之外補上了什麼
Cypress 給不了的,是不必耗費撰寫時間就得到的涵蓋範圍,而這正是 TestSprite 的用途。測試案例由你的原始碼與運行中的應用程式產生,再用白話文字調整,於是廣度不再取決於你能挪出多少工程師。
日常使用上還有兩個差異很關鍵。一是步驟以意圖的形式表達,所以改版把按鈕搬個位置不會讓建置變紅。二是失敗會以一段說明呈現:嘗試做了什麼、應用程式實際做了什麼、兩者在哪裡出現落差;這份說明不只人看得懂,coding agent 也用得上,而後者正逐漸成為更重要的讀者。
在同時保留兩者的團隊裡,分工很清楚:Cypress 負責有人刻意明確定義的流程,包括元件測試,以及任何步驟順序本身就是約定一部分的情境;TestSprite 負責廣度,以及驗證由 agent 撰寫的變更。兩者跑在同一條 pipeline 上,彼此都不需要知道對方的存在。
我必須把現有的 Cypress 測試遷移過去嗎?
不必。兩者在同一條 pipeline 上各自獨立執行。多數團隊會保留自己信任的那套 Cypress 測試,再加上 agent 驗證來補足廣度,而不是取代任何東西。
TestSprite 可以匯出能執行的程式碼嗎?
可以。產生的測試原始碼可以輸出到畫面或寫入檔案,你編輯之後也能取代原本的內容。但要注意,匯出的腳本只是流程中某一條路徑的快照,比較適合用來檢視與轉移,而不適合當成你要手動維護的產物。
除錯是不是 Cypress 比較好用?
如果是你自己寫的測試,是的,而且差距不小。Cypress 的時光回溯非常出色。但當問題變成「一個你從沒寫過的流程為什麼會失敗」時,比較的基準就變了:這時一份說明落差在哪裡的失敗報告包,會比一行行單步追程式碼更有用。
那不穩定的測試怎麼辦?
框架型測試套件的不穩定,通常來自選擇器或時間假設。以意圖表達的步驟能消除前者當中很大一部分,但無法消除真正由環境不穩定造成的不穩定,而且沒有任何工具做得到。
哪一個比較便宜?
該比的是總成本,而不是授權費用。Cypress 是免費的,但撰寫與維護測試套件所花的工程時間不是。這個取捨對哪一邊有利,幾乎完全取決於你有沒有 QA 人力。