如何在複雜的分佈式系統中做測試

2019歐洲測試大會上,Sarah Wells演講指出:複雜分佈式系統的複雜性並非存在於代碼中,而是存在於服務或功能之間;測試就是尋求如何在發現問題與交付價值間達成平衡;測試人員通常具有對系統功能的最好理解;測試人員能對可能出現問題做出很好的假設,然後非常快速地進行驗證。

Wells在她的主題演講中,探討了系統在複雜化和分佈式後所發生的變化。對於單體系統而言,雖然可能很難定位實現特定功能的代碼位置,但是很容易判別請求在系統中的流轉,並且大多數通信是在進程之間的。Wells認爲,分佈式系統的複雜性已從系統內部轉移到系統之間。

使用微服務可簡化代碼,但會使基於http或隊列實現的路由複雜化。Wells支持在路由上可能會出現更多的問題。用戶常常會收到一些表示請求失敗的瞬態錯誤,這些錯誤會在重複數秒後變爲成功。她認爲明智的做法建立一種補償和重試機制,但採用這種做法意味着用戶更難以完全掌控發生在響應請求中的情況。

Wells建議用戶使用基於風險的方法,讓測試工作聚焦於那些真正重要的事情上。她提出,用戶需要能夠快速確定發生錯誤的時間,儘快修復錯誤,並且必須要建立具備觀測出錯位置能力的系統。

Wells提到,對於複雜分佈式系統的測試,用戶需在儘早發現問題和儘早交付價值間取得平衡。其實,一些問題直到系統投入生產後才能被發現,進而做出優化以快速識別和修復這些問題,她認爲用戶最好能接受這一點。

InfoQ報道全程覆蓋2019歐洲測試大會。在Sarah Wells主題演講後,InfoQ就複雜分佈式系統的測試問題對她做了一次專訪。

InfoQ:您對於複雜分佈式系統的測試有哪些建議?

Sarah Wells:我們發現,無論是開發人員還是測試人員,在着手構建複雜分佈式系統時,都無法試圖在本地啓動完整的系統副本。用戶花費了大量時間去創建很好的生產系統副本,但卻從未妥善管理它們。

需強調的是,我們這裏討論的是複雜系統。如果你無法評估特定更改可能會影響到的範圍,那麼就得花大量的時間做迴歸測試,我們發現這是個瓶頸,而且往往並不能發現問題。

和許多事情一樣,問題主要存在於溝通上。如果開發人員能詳細闡述了他們剛完成的工作,那麼通常測試人員就能準確地找出變更可能帶來的最大風險。

持續交付和微服務是對此最具幫助的做法。許多變更通常非常小型,並且相互獨立。微服務具有非常明確的界限。《加速,精益軟件和DevOps科學:建立和擴展高績效技術團隊》一書中提及的研究表明,那些頻繁發佈小型單獨變更的組織,通常這些變更的失敗率也比較低。

我認爲應在系統間建立契約。但我不確定的是,維護契約測試的成本是否會高於錯誤的風險。我的想法是,將目標鎖定爲團隊間的邊界,而非系統內。

InfoQ:監控和日誌如何支持測試?甚至它們將如何替代測試?

Wells:分佈式系統的許多問題,幾乎與最新發布的代碼沒有關係。這些問題可能與運行代碼的環境有關,或是可能是由於服務之間的依賴關係,即更改爲另一個可導致意外錯誤的服務。服務可能屬於不同的團隊。用戶甚至可能不知道某個服務調用了自己的API。

因此一個更改一旦投入生產系統,至少能夠儘早發現問題並回滾。

可以通過類似於綜合監控的手段,不斷測試關鍵的業務功能,或者監控業務能力水平,也就是檢查事件的實際完成情況。以內容發佈爲例,我們可以檢查在我們的區域中存儲的所有相關數據是否正確更新,否則就給出警告。

我們也在更底層的環境中運行測試。這些測試替代了那些十分脆弱的驗收測試。當做任何變更時都要修改設置,這是件非常痛苦的事。而且很多變更是做架構類的調整。

我們所構建的系統必須提供可觀測能力,以便在第一時間定位錯誤。

這意味着,絕對有必要將全部日誌彙集於單個日誌存儲中,並且需要對日誌做結構化以易於查詢。在複雜系統中請求會經由多個服務,所需存儲的日誌規模可能會高於單體系統幾個數量級,因此用戶可能最終會對日誌做抽樣。在這種情況下,需要確保任一特定時間的所有日誌都得到存儲,並且能夠通過唯一的事務標識關聯所有相關日誌。

用戶可能還希望獲取一些度量,但很容易發生過度獲取的問題。用戶切實需要的應是那些最高層級服務的度量,即客戶呼叫、報告請求率、錯誤率(可能是請求率的一部分)以及請求持續時間等。這些度量通常稱之爲RED度量。

InfoQ:在出現錯誤時,測試人員的作用是什麼?他們的價值何在?

Wells:根據我的經驗,對系統功能具有最好理解的人,除了產品負責人(PO,product owner)就是測試人員。我已經看到很多測試人員逐漸轉型爲產品負責人。

這表明了兩個問題。第一,測試人員對即將發生的問題具有很好的預判。

其次,測試人員將能夠很快地驗證假設問題。他們知悉API的調用,網站的流程。

此外,在出現問題前,測試人員也能提供大量價值。我認爲,很顯然混沌工程需要測試人員的參與。因爲混沌工程就是開展探索。如果關閉某處系統會發生什麼情況?如果密鑰過期會發生什麼問題?這些假設和彈性測試對於複雜分佈式系統是非常重要的,也具有很大的價值。

查看英文原文: Testing Complex Distributed Systems

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章