微服務測試的思考與實踐

最近幾年商佛,微服務架構越來越火爆闷愤,逐漸被企業(yè)所采用整葡。隨著軟件架構的變化,對應的軟件測試策略需要作何調整呢讥脐?本文將介紹微服務架構下的測試策略遭居,并結合分享在業(yè)務和架構演變過程中,一個歷經九年的項目測試策略的演進旬渠。

關于微服務

微服務架構是一種架構模式俱萍,它提倡將單一應用程序劃分成一組小的服務,每個服務運行在其獨立的進程中坟漱,服務間采用輕量級通信機制互相溝通(通常是基于HTTP協議的RESTful API)鼠次。每個服務都圍繞著具體的業(yè)務進行構建,并且能夠被獨立部署到生產環(huán)境芋齿、預生產環(huán)境腥寇。

從微服務的概念可以看出它有如下好處:

  • 每個服務可以獨立開發(fā)
  • 處理的單元粒度更細
  • 單個服務支持獨立部署和發(fā)布
  • 更有利于業(yè)務的擴展

同時,獨立開發(fā)導致技術上的分離觅捆,HTTP通信加上Queue的機制增加了問題診斷的復雜度赦役,對系統的功能、性能和安全方面的質量保障帶來了很大的挑戰(zhàn)栅炒。另外掂摔,服務間的復雜依賴關系帶來了很多的不確定性,要實現獨立部署赢赊,對運維也提出了更高的要求乙漓。微服務架構的系統要特別關注這幾個方面:

  • 服務間的依賴、連通性
  • 服務的容錯释移、可用性
  • 數據的最終一致性
  • 獨立部署
  • 不確定性

測試策略的選擇

談到微服務的測試策略叭披,很容易就想到了老馬網站上Toby Clemson的文章《Microservices Testing》,該文推薦的微服務框架下的測試策略是這樣的:

經典策略模型

這個策略模型強調測試分層以及每一層的恰當覆蓋玩讳,整體符合金字塔結構涩蜘。它是最優(yōu)的嗎?

有人對此提出了質疑...認為策略模型應該是蜂巢形狀的(請參考文章):

蜂巢模型

這個模型重點關注服務間的集成測試熏纯,兩端的單元測試和UI層E2E測試較少同诫。

也有同事提出微服務下的測試結構應該是鉆石形狀的,服務間的集成依然是重點樟澜,單元測試較少误窖,而頂層增加了安全和性能等非功能測試叮盘。

鉆石模型

好像都有道理,到底選擇什么樣的策略模型好呢贩猎?不禁陷入了困境…...怎么辦熊户?不妨先來聽聽我們項目的故事吧!

項目的故事

測試策略的演進

還是那個藍鯨項目吭服,不知不覺進入了第九個年頭嚷堡。在這九年里,隨著業(yè)務的不斷發(fā)展艇棕,系統架構也進行了多次演進和調整蝌戒。相應的,測試策略也發(fā)生了有意思的演進變化沼琉。

測試策略的演進

最初單一用戶系統北苟、單體架構的時候,嚴格按照測試金字塔來組織各層的自動化測試打瘪。隨著功能的擴展友鼻,大量mock的單元測試給重構帶來了很大的不便。

企業(yè)系統開始開發(fā)的時候闺骚,我們調整了策略彩扔,減少單元測試的編寫,增加UI層E2E測試的覆蓋僻爽,測試結構由原來的金字塔演變成上面梯形下面倒三角的形式虫碉。

后來,架構調整胸梆,開始服務化敦捧。此時,大量的E2E測試漸漸暴露出問題:

  • CI上的測試執(zhí)行時間越來越長碰镜,而且定位問題的能力很弱兢卵,測試一旦失敗需要很長時間修復,測試人員好幾天也拿不到可以測試的版本绪颖,反饋周期過長济蝉;
  • 由于服務化帶來的不穩(wěn)定因素增加,E2E測試沒法很好的覆蓋到需要的場景菠发,測試人員就算拿到可測的版本也總有各種缺陷發(fā)生。

因此贺嫂,項目引入契約測試滓鸠,停止編寫新的E2E測試,將測試下移第喳,分別用API測試和契約測試取代糜俗。

隨著功能的不斷增加,雖然E2E測試的量并不增加,但是其不穩(wěn)定性悠抹、維護難珠月、定位難的問題有增無減,此時已經很難由自動化測試來保證產品的質量楔敌。為了平衡成本和收益啤挎,項目考慮去掉大部分E2E測試,只保留少量的Smoke測試卵凑,將更多的測試下移庆聘。

同時,技術雷達上新的技術“生產環(huán)境下的QA”出現勺卢,項目也開始關心生產環(huán)境伙判,并且在QA測試階段結合微服務的特點進行對應的探索式測試。

應對微服務的挑戰(zhàn)

前文提到過微服務帶來的挑戰(zhàn)黑忱,下面來看項目是如何應對這些挑戰(zhàn)的宴抚。

  • 服務間的依賴、連通性

微服務架構下甫煞,獨立開發(fā)的服務要整合起來最具挑戰(zhàn)菇曲,如何保證服務間的依賴關系和連通性非常關鍵。前面已經講過E2E集成測試有很大的挑戰(zhàn)危虱,并不適合羊娃,而消費端驅動的契約測試是個不錯的選擇。項目正是利用契約測試去保證服務間的連通性埃跷,取代一部分E2E集成測試蕊玷。

  • 服務的容錯、可用性

在系統負荷達到一定程度或者某個服務出現故障的時候弥雹,微服務架構有兩種技術來確保系統的可用性:服務的熔斷和降級垃帅。服務的熔斷是指當某個服務出現故障時,為了保證系統整體的可用性剪勿,會關閉掉出現故障的服務贸诚;服務的降級則是當系統整體負荷過載的時候,考慮關閉某些外圍服務來保證系統的整體可用性厕吉。

對應的測試包括:

  1. 熔斷:從性能角度酱固,當系統負載達到某個熔斷狀態(tài)的時候,服務是否能正確熔斷头朱;同時运悲,從功能角度驗證熔斷后系統的行為是否跟預期相符;
  2. 降級:從業(yè)務的角度项钮,要能區(qū)分出核心業(yè)務和外圍業(yè)務班眯,在需要降級的時候不能影響核心業(yè)務希停;當某個服務降級后,從功能角度驗證系統行為是否跟預期相符署隘。
  • 數據的最終一致性
數據一致性

數據一致性是微服務特別需要關注的宠能。舉個例子,電商平臺某個訂單支付成功以后磁餐,需要更新積分和訂單狀態(tài)违崇,當訂單服務或者積分服務其中有一個出現故障的時候,就會導致最終的數據不一致性崖媚。

測試這種情況亦歉,從業(yè)務的角度分析哪些服務會導致數據不一致性,制造對應的異常情況去測試數據的最終一致性畅哑。

  • 獨立部署

微服務的獨立部署需要有CI肴楷、CD的支持,跟DevOps實踐分不開荠呐。同時赛蔫,更為關鍵的是需要契約測試來驗證獨立部署后服務行為的正確性。項目在這方面的工作泥张,請參考王健的文章:你的微服務敢獨立交付嗎呵恢?

  • 不確定性

微服務架構使得系統復雜度增加不少,很多的事情發(fā)生都是不可預測的媚创,只能在其發(fā)生以后找到產生的原因渗钉。因此,也就沒法在預生產環(huán)境通過測試去發(fā)現在真實生產環(huán)境才會發(fā)生的issue钞钙,我們需要把目光轉移到生產環(huán)境鳄橘,利用生產環(huán)境的不確定性、微服務的不可預測性來構建反脆弱的系統芒炼。

項目在這方面主要采用的技術是生產環(huán)境下的QA瘫怜,請參考文章:生產環(huán)境下的QA

項目測試策略

從前面介紹的演進過程可以看到,項目測試策略在不同階段結合參考了不同的策略模型:金字塔->近似鉆石(除非功能測試外本刽,類似于鉆石模型)->蜂巢鲸湃。后期全面服務化的時候,我們認為蜂巢模型是比較適合的子寓。

當然暗挑,光有符合這個策略模型的自動化測試是遠遠不夠的,我們項目還采用了針對微服務特點的探索式測試斜友,保持持續(xù)交付節(jié)奏窿祥,踐行DevOps實踐,結合生產環(huán)境下的QA等技術把關注點右移到生產環(huán)境蝙寨。

現在晒衩,項目整體測試策略演變成下圖的形式:


項目測試策略
  1. 項目采用的是敏捷迭代開發(fā)和持續(xù)交付的模式,每四周一個發(fā)布周期墙歪。
  2. 在開發(fā)過程中實現的自動化測試是分層實現的:底層少量的單元測試听系,中間量最多的是API測試(類似于老馬推薦的策略模型里的組件測試),上面有一部分契約測試和少量的Smoke測試來保證服務間的契約和集成虹菲。除此之外靠胜,QA有手動的探索式測試,其中包括針對微服務特點進行的一些測試毕源。整個測試結構是類似于蜂巢模型的浪漠。
  3. 采用生產環(huán)境下的QA技術,利用生產環(huán)境霎褐,進行error監(jiān)控址愿、用戶行為分析、用戶反饋收集冻璃,從而來影響和指導預生產環(huán)境的開發(fā)和測試工作响谓。
  4. 利用DevOps實踐,做到高效的部署和監(jiān)控省艳,跟生產環(huán)境下的QA結合娘纷,形成良性的環(huán)路,保證項目的正常交付跋炕。

測試策略再思考

項目上多次測試策略的調整赖晶,看似很簡單,其實每次調整并不是一個輕松的過程辐烂,都是平衡利弊遏插、綜合考慮多個因素才做出的決定。

分析整個調整過程棉圈,最后突然發(fā)現:當我們面對多個策略模型不知道如何選擇的時候涩堤,其實我們陷入了一個太過于關注測試結構的誤區(qū),忘記了最初的目標是什么分瘾。

影響測試策略的因素

跳出誤區(qū)胎围,回到原點,重新思考測試策略的目標德召。影響策略的最關鍵因素是業(yè)務價值白魂、質量要求、痛點上岗。

影響測試策略的因素
  • 業(yè)務價值

帶來更大的業(yè)務價值福荸、幫企業(yè)贏得更多的利潤,是軟件系統的目標肴掷;軟件測試是軟件系統成功的保障之一敬锐,業(yè)務價值也是測試策略的終極目標背传。所有測試活動都要圍繞這個目標開展,考慮業(yè)務優(yōu)先級台夺,有效規(guī)避業(yè)務風險径玖。

  • 質量要求

不同的系統、同一系統的不同利益干系人(參與的不同角色)對于質量的定義和要求都可能是不同的颤介,這毫無疑問是影響測試策略的一個關鍵因素梳星。

對于僅有內部用戶的系統,關注的重心可能是系統的功能滚朵;而對外發(fā)布的產品冤灾,則要求更高,一個按鈕位置的不恰當都可能帶來大量用戶的流失辕近。

  • 痛點

真正的痛點往往也是優(yōu)先級最高韵吨,迫切需要解決的。那些可以通過測試策略的調整來解決的痛點亏推,自然成為了關鍵的影響因素之一学赛。比如,CI Pipeline出包太慢吞杭,為了提高出包的效率盏浇,一方面在Pipeline本身想辦法,另一方面調整自動化測試的比例芽狗、執(zhí)行頻率等也是解決方案之一绢掰。

演進式測試策略

處在不同階段的項目,在業(yè)務價值這個大目標下童擎,其他影響因素也是會不一樣的滴劲,跟技術架構的演進一樣,測試策略也應該是演進式的顾复。

從目標出發(fā)班挖,綜合所處階段各個方面的影響因素,制定出適合當時的測試策略芯砸。隨著時間的推移萧芙,對策略進行評估和度量,并進一步改進假丧、提高双揪,以更好的滿足需求。這就是目標驅動的演進式測試策略包帚。


演進式測試策略

總結

微服務架構下多個服務的整合是最具有挑戰(zhàn)的渔期,對此最重要的是契約測試。契約測試有效保證服務間的契約關系不被破壞,確保服務的連通性疯趟,有助于實現真正的獨立部署和獨立交付拘哨。

微服務架構引入的不確定性并不是壞事,可以利用這些不確定性信峻,采用生產環(huán)境下的QA等技術宅静,增強系統的反脆弱性,從中獲益站欺。

測試策略的影響因素不是唯一的,技術架構并不是最關鍵的因素纤垂。微服務架構下的測試策略跟其他架構下的并不會有本質的區(qū)別矾策。

業(yè)務價值始終是我們的終極目標。在這個終極目標的驅動下峭沦,測試策略不是制定完了就可以束之高閣的贾虽,需要在整個軟件系統構建過程中不斷的度量和改進,是演進式的吼鱼。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末蓬豁,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子菇肃,更是在濱河造成了極大的恐慌地粪,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琐谤,死亡現場離奇詭異蟆技,居然都是意外死亡斗忌,警方通過查閱死者的電腦和手機质礼,發(fā)現死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來织阳,“玉大人眶蕉,你說我怎么就攤上這事∵蠖悖” “怎么了造挽?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惊窖。 經常有香客問我刽宪,道長,這世上最難降的妖魔是什么界酒? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任圣拄,我火速辦了婚禮,結果婚禮上毁欣,老公的妹妹穿的比我還像新娘庇谆。我一直安慰自己岳掐,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布饭耳。 她就那樣靜靜地躺著串述,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寞肖。 梳的紋絲不亂的頭發(fā)上纲酗,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天欧芽,我揣著相機與錄音推正,去河邊找鬼。 笑死捉邢,一個胖子當著我的面吹牛琼稻,可吹牛的內容都是我干的吮螺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼帕翻,長吁一口氣:“原來是場噩夢啊……” “哼鸠补!你這毒婦竟也來了?” 一聲冷哼從身側響起嘀掸,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤紫岩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后横殴,有當地人在樹林里發(fā)現了一具尸體被因,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年衫仑,在試婚紗的時候發(fā)現自己被綠了梨与。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡文狱,死狀恐怖粥鞋,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情瞄崇,我是刑警寧澤呻粹,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站苏研,受9級特大地震影響等浊,放射性物質發(fā)生泄漏。R本人自食惡果不足惜摹蘑,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一筹燕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦撒踪、人聲如沸过咬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掸绞。三九已至,卻和暖如春耕捞,著一層夾襖步出監(jiān)牢的瞬間衔掸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工俺抽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留具篇,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓凌埂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诗芜。 傳聞我的和親對象是個殘疾皇子瞳抓,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容