開發(fā)團隊越來越多地選擇微服務架構(gòu)而不是單體結(jié)構(gòu),以提高應用程序的敏捷性、可擴展性和可維護性。隨著決定切換到模塊化軟件架構(gòu)——其中每個服務都是一個獨立的單元颜矿,具有自己的邏輯和數(shù)據(jù)庫,通過 API 與其他單元通信——需要新的測試策略和新的測試工具鞭铆。
測試微服務是微服務應用程序過程的關鍵部分:您需要確保您的代碼不會在單元內(nèi)中斷或衡,微服務中的依賴項繼續(xù)工作(并快速工作),并且您的 API 符合定義的協(xié)議. 然而车遂,由于許多微服務采用持續(xù)交付模式構(gòu)建以一致地構(gòu)建和部署功能封断,因此開發(fā)人員和 DevOps 團隊需要準確可靠的測試策略才能對這些功能充滿信心。
那么微服務存在哪些不同類型的測試舶担,它們?nèi)绾芜m用于軟件的其他領域坡疼,它們有什么好處?眾所周知的“測試金字塔”可以為接下來這些測試提供一個測試框架衣陶。
根據(jù)軟件工程原理的著名作者 Martin Fowler 的說法柄瑰,“‘測試金字塔’是一個隱喻,將軟件測試分組到不同粒度的桶中剪况〗陶矗”
金字塔的不同層次定義為:
- 單元測試:測試服務的一小部分,例如類译断。
- 組件測試:驗證單個服務的行為授翻。
- 集成測試:通過測試服務的適配器來驗證服務是否可以與基礎設施服務(例如數(shù)據(jù)庫和其他應用程序服務)進行交互。
注意:某些版本的測試金字塔會切換組件測試和集成測試的順序孙咪。
- 端到端測試:驗證整個應用程序的行為堪唐。
結(jié)合多種微服務測試策略可以提高測試覆蓋率和對軟件的信心,同時也使整體維護更易于管理翎蹈。
單元測試
單元測試旨在確保服務的最小部分在微服務設計階段確定的規(guī)范內(nèi)按預期執(zhí)行淮菠。由于微服務將應用程序功能分解為數(shù)百個可測試的小型功能組件,因此單元測試會單獨且獨立地處理每個組件荤堪。最好在一個類或一組相關類的級別上進行單元測試合陵。
單元測試可以通過使用測試替身(例如 fakes枢赔、stubs、mocks拥知、dummies 和 spies)來切斷組件的依賴關系糠爬。例如,測試人員可以模擬您的依賴項的響應并“假設他們執(zhí)行 [X]”举庶,其中 [X] 是正確響應、失敗響應等揩抡。
組件測試
組件測試驗證給定服務是否正常運行户侥。由于范圍僅限于整個微服務架構(gòu)的一部分,組件測試通過隔離系統(tǒng)內(nèi)的服務來檢查所選微服務(可以由幾個類組成)的端到端功能峦嗤,將其依賴項替換為測試雙打和/或模擬服務蕊唐。
您可以為將被劃分為測試用例的每個組件創(chuàng)建測試環(huán)境。它可能涉及測試資源行為烁设,例如性能測試替梨、確定內(nèi)存泄漏、結(jié)構(gòu)測試等装黑。
集成測試
集成測試驗證獨立開發(fā)的組件/微服務在連接時是否正常工作副瀑。它測試組件之間的通信路徑和交互并發(fā)現(xiàn)錯誤。
集成測試的編寫和運行變得更加困難和耗時恋谭。因此糠睡,擁有出色的生產(chǎn) QA(質(zhì)量保證)實踐將有助于確保順利進行。
合同測試
在測試金字塔中調(diào)用合約測試至關重要疚颊。接觸測試通過確保它們可以相互通信來檢查獨立單元(如兩個微服務)的兼容性狈孔。合同測試測試 API 的工作方式,這是微服務相互交互的方式材义。
合約測試檢查這些微服務的邊界和交互均抽,并將它們存儲在合約中,然后可以將其用作雙方未來如何交互的標準其掂。它要求雙方就允許的交互集達成一致油挥,并允許隨著時間的推移而演變。
端到端測試
端到端測試(E2E 測試)是最終測試階段清寇,涉及從頭到尾測試應用程序的工作流程以實現(xiàn)完整的用戶旅程喘漏。
這些測試可以自動化,但 E2E 測試僅針對超關鍵流進行华烟。它在微服務架構(gòu)中不能很好地擴展翩迈,因為它需要啟動許多微服務并將它們連接起來,這對于自動化和維護是具有挑戰(zhàn)性的盔夜。因此负饲,它僅用于測試特定微服務之間的關鍵交互堤魁。
要使用的微服務測試工具,包括按需登臺環(huán)境
開發(fā)人員和 QA 團隊對微服務測試工具有不同的偏好返十,尤其是對于這些不同類型的測試妥泉。以下是一些流行的概要。許多是按需登臺環(huán)境洞坑,它們是動態(tài)創(chuàng)建的盲链,由 CI/CD 管道觸發(fā)。使用按需登臺迟杂,一旦開發(fā)人員完成登臺環(huán)境刽沾,登臺環(huán)境以及任何配置、環(huán)境或安裝不一致都會被破壞排拷。
releasehub
該平臺是一個按需登臺環(huán)境侧漓,具有可訪問的協(xié)作共享功能。您可以將應用程序的存儲庫連接到 Release监氢,然后為每個拉取請求和每次代碼推送的更新創(chuàng)建臨時環(huán)境布蔗。此外,可以為集成浪腐、傳統(tǒng)登臺或 QA/UAT 用例創(chuàng)建環(huán)境纵揍。開發(fā)人員和 QA 可以完全訪問環(huán)境以進行測試和調(diào)試,并且產(chǎn)品團隊牛欢、設計團隊和利益相關者可以看到功能的發(fā)展并盡早并經(jīng)常提供反饋骡男。
WebApp.io(以前的 LayerCI)**
WebApp.io 是一個代碼審查自動化平臺,允許為全棧 Web 應用程序提供按需審查環(huán)境傍睹。您可以創(chuàng)建自定義拉取請求隔盛。一旦您創(chuàng)建了堆棧的一個副本,您可以立即復制它以自動運行 e2e 測試并集成到 CI/CD 工作流中拾稳。WebApp 將自動在 GitHub吮炕、GitLab 或 BitBucket 中注釋您的拉取請求。
Vercel
Vercel 是一個用于前端框架访得、無服務器功能和靜態(tài)站點的云平臺龙亲,旨在與預先存在的內(nèi)容和數(shù)據(jù)庫集成。它托管的網(wǎng)站和 Web 服務可即時部署悍抑、自動擴展且無需監(jiān)督鳄炉,所有這些都無需配置。它還提供邊緣位置托管和緩存搜骡。它類似于 Amazon Web Services (AWS) Lambda 或 Netlify拂盯。
Pact
Pact 是一個代碼優(yōu)先的消費者驅(qū)動的合同測試工具,適用于編寫代碼的開發(fā)人員和測試人員记靡。它使用合同測試來測試 HTTP 和消息集成——驗證應用程序間消息是否符合共同理解的方法谈竿,并記錄在合同中团驱。這種合同測試方式減少了大型單元測試。
Apache JMeter
Apache JMeter 是測試人員常用的基于 Java 的性能測試工具空凸。它是一個開源平臺嚎花,可以用作負載測試工具,用于分析和測量 Web 應用程序的性能呀洲。
Hoverfly
Hoverfly 是一個自動化的紊选、開源的 API 通信模擬工具,用于專門的集成測試道逗。用戶可以測試 API 在速率限制和/或網(wǎng)絡延遲等場景中的反應丛楚。
Grafana
Grafana 提供免費的指標可視化和分析。儀表板讓開發(fā)人員可以查看時間序列數(shù)據(jù)憔辫,以觀察微服務在實時流量中的響應方式。
Gatling
Gatling 是一個用 Scala 編寫的負載測試工具仿荆。它可以在多個平臺上運行模擬贰您,然后報告活躍用戶數(shù)量和響應時間等指標。
結(jié)論
微服務的測試拢操、調(diào)試和維護部分通常是使用微服務架構(gòu)中最具挑戰(zhàn)性但必不可少的部分锦亦。希望以上信息可以幫助您了解不同的測試類型和工作的最佳工具。