系統(tǒng)級集成測試的斷舍離

食之無味,棄之可惜

在企業(yè)級應(yīng)用的“季度或月度發(fā)布”被認(rèn)為是領(lǐng)域最佳實(shí)踐的時(shí)候,在應(yīng)用部署到生產(chǎn)環(huán)境之前維護(hù)一個(gè)完整的環(huán)境來進(jìn)行集成測試是非常必要的。但是,集成測試環(huán)境和集成測試本身有著如下的問題:

  • 環(huán)境本身脆弱,而且通常存在手動配置部分,環(huán)境維護(hù)成本很高;
  • 環(huán)境因素導(dǎo)致集成測試不穩(wěn)定、不可靠、反饋慢,測試失敗不易定位問題,同時(shí)還會重復(fù)測試隔離組件已經(jīng)測過的功能。

集成測試成為了持續(xù)交付的瓶頸,猶如雞肋。因此,最新一期(2017年第16期)ThoughtWorks技術(shù)雷達(dá)建議企業(yè)暫緩搭建企業(yè)級集成測試環(huán)境,而是采用增量的方式發(fā)布關(guān)鍵組件到生產(chǎn)環(huán)境。增量發(fā)布涉及到一些重要的技術(shù)包括契約測試、將發(fā)布與部署解耦、專注于平均恢復(fù)時(shí)間和生產(chǎn)環(huán)境下的QA。

斷舍離之技術(shù)可行性

下面分別介紹技術(shù)雷達(dá)建議的這四項(xiàng)技術(shù),以及在沒有集成測試的情況下如何保證應(yīng)用的質(zhì)量、如何幫助企業(yè)做到獨(dú)立增量發(fā)布。

消費(fèi)端驅(qū)動的契約測試

消費(fèi)端驅(qū)動的契約測試是微服務(wù)測試的重要組成部分,主要用來覆蓋兩兩服務(wù)之間的契約關(guān)系,下面舉個(gè)例子來說明什么是契約測試以及契約測試與API測試的區(qū)別。

家里有個(gè)插座,買電器的時(shí)候需要考慮插頭跟插座是能配對的,也就是說插座和插頭之間需要有契約。

這里的契約測試就是插座跟插頭的配套性測試,包括

  • 三相/三頭還是兩相/兩頭的;
  • 電壓是220V還是110V;
  • 插孔的形狀:英式 or 中式?
  • 等等

API測試:對于插座本身功能的測試,需要覆蓋

  • 插座能夠正常通電;
  • 電壓是預(yù)期的220v;
  • 接地的插孔真的能夠接地
  • 等等

也就是說API測試需要測試API本身功能的各個(gè)方面,而契約測試重點(diǎn)在覆蓋API調(diào)用的格式、參數(shù)數(shù)量、參數(shù)類型等,不一定需要涉及API本身的功能和具體的數(shù)據(jù)。

發(fā)布與部署解耦

部署,就是把組件或者基礎(chǔ)設(shè)施部署到生產(chǎn)環(huán)境,不對用戶可見,不會影響業(yè)務(wù)和用戶的使用。發(fā)布,則是將部署的組件讓用戶可見,對業(yè)務(wù)會產(chǎn)生影響。可以通過采用Feature toggle的方式實(shí)現(xiàn)部署與發(fā)布的解耦,做到持續(xù)部署和可控制的發(fā)布,減少組件改變帶來的風(fēng)險(xiǎn)。這樣,產(chǎn)品經(jīng)理可以根據(jù)業(yè)務(wù)需求靈活控制發(fā)布給最終用戶的功能組件,幫助企業(yè)業(yè)務(wù)價(jià)值最大化。

關(guān)注平均恢復(fù)時(shí)間

先看這樣兩種情況,思考哪種更好:

  • 系統(tǒng)宕機(jī)次數(shù)很少,可能每年也就一到兩次,但是恢復(fù)能力很弱,一旦宕機(jī),得花至少24個(gè)小時(shí)恢復(fù)正常;
  • 系統(tǒng)宕機(jī)頻率較高,不過每次宕機(jī)都能快速恢復(fù),用戶甚至感覺不到。

對于第一種,平均失敗間隔很長,但是一旦失敗對用戶的影響不言而喻;第二種雖然會頻繁的失敗,但是平均恢復(fù)時(shí)間很短,用戶體驗(yàn)不受影響,當(dāng)然是第二種更好。

傳統(tǒng)的Ops團(tuán)隊(duì)比較關(guān)注失敗發(fā)生的頻率,隨著持續(xù)交付和監(jiān)控技術(shù)的發(fā)展,“快速恢復(fù)”成為可能。不用擔(dān)心錯(cuò)誤、失敗的發(fā)生,而是利用對這些錯(cuò)誤和失敗的監(jiān)控和分析,讓系統(tǒng)做到快速恢復(fù),可以省掉一些復(fù)雜的集成測試,也可以減少無處不在的安全攻擊的影響。

生產(chǎn)環(huán)境下的QA

生產(chǎn)環(huán)境是真實(shí)用戶使用的環(huán)境,通常都不能跟測試環(huán)境一樣可以在上面直接測試產(chǎn)品的功能,不能簡單的把測試環(huán)境所用的QA技術(shù)直接后延到生產(chǎn)環(huán)境,而其中一項(xiàng)在生產(chǎn)環(huán)境使用的技術(shù)就是監(jiān)控。采用監(jiān)控技術(shù)來獲取生產(chǎn)環(huán)境的信息,對其進(jìn)行分析,然后優(yōu)化開發(fā)、測試過程,同時(shí)優(yōu)化企業(yè)業(yè)務(wù)。更多關(guān)于生產(chǎn)環(huán)境下QA的內(nèi)容,請參看文章《產(chǎn)品環(huán)境下的QA》。

對上面四種技術(shù)的解釋,我們可以看到:契約測試是對持續(xù)獨(dú)立部署有幫助的,監(jiān)控技術(shù)則是縮短平均恢復(fù)時(shí)間和做好生產(chǎn)環(huán)境下的QA共同的關(guān)鍵技術(shù)之一。接下來主要分享項(xiàng)目在圍繞契約測試和日志監(jiān)控這兩塊所做的實(shí)踐,一起來看系統(tǒng)級集成測試的斷舍離該如何實(shí)現(xiàn)。

斷舍離之項(xiàng)目實(shí)踐

項(xiàng)目是一個(gè)開發(fā)了七八年的老項(xiàng)目,團(tuán)隊(duì)對集成測試也是進(jìn)行了多次的調(diào)整,經(jīng)歷了“七年之癢”后依然覺得是雞肋:

  • Pipeline上執(zhí)行非常不穩(wěn)定,總是“隨機(jī)掛”,不能真實(shí)反映問題;
  • 系統(tǒng)復(fù)雜,集成測試自然也不簡單,每次順利執(zhí)行的時(shí)間都需要半個(gè)小時(shí)以上,何況還有很不穩(wěn)定的情況,最嚴(yán)重的時(shí)候?qū)е翾A超過一周拿不到包部署;
  • 通過集成測試發(fā)現(xiàn)的應(yīng)用程序的缺陷半年也難得出現(xiàn)一個(gè);
  • 隨著系統(tǒng)逐漸變得復(fù)雜,集成測試維護(hù)的成本也不斷增加。

可以看出,集成測試已經(jīng)嚴(yán)重阻礙了項(xiàng)目持續(xù)交付的進(jìn)行,不得不對其斷舍離了。

(一)測試策略調(diào)整

斷舍離的第一個(gè)部分是從集成測試本身入手,調(diào)整測試策略。步驟如下:

  • 不再添加新的功能層面的自動化測試,原有的集成測試部分能用底層的UT、API測試覆蓋的盡量下移;
  • UT和API測試不能cover的服務(wù)間的契約關(guān)系通過增加契約測試來保證;
  • 從CI上摘掉原來的集成測試,加速pipeline出包,然后添加Smoke測試到QA環(huán)境執(zhí)行;
  • 不管是在測試環(huán)境還是生產(chǎn)環(huán)境發(fā)現(xiàn)缺陷,都添加對應(yīng)的測試。

整體策略調(diào)整思路是根據(jù)測試金字塔的結(jié)構(gòu)進(jìn)行調(diào)整,把測試盡量往下層移,但并沒有全部去掉集成測試,只是縮減到非常關(guān)鍵的路徑覆蓋,最終測試結(jié)構(gòu)調(diào)整如下圖所示:

(二)日志監(jiān)控、分析和優(yōu)化

沒有了Pipeline上的集成測試,直接上到QA或者prod環(huán)境,那么加強(qiáng)日志監(jiān)控變得尤其重要。因此,斷舍離的第二個(gè)部分是日志的監(jiān)控、分析和優(yōu)化。

日志數(shù)據(jù)采集

項(xiàng)目使用的日志分析工具是Splunk,使用該工具從下面幾個(gè)方面來著手采集日志數(shù)據(jù):

  • 在Splunk上設(shè)置日志監(jiān)控的Dashboard,主要用來監(jiān)控API的請求失敗、錯(cuò)誤的日志,還有API執(zhí)行時(shí)間等性能相關(guān)內(nèi)容。如下圖所示:

  • 設(shè)置預(yù)警郵件提醒:對于一些存在嚴(yán)重性能問題的API請求,通過郵件的方式進(jìn)行預(yù)警提醒,如下圖:

  • 主動查找錯(cuò)誤日志:對于一些生產(chǎn)環(huán)境中用戶反饋回來的問題,通過主動查找錯(cuò)誤日志的方式去定位。

  • 前面的幾個(gè)機(jī)制同樣應(yīng)用于QA和Staging等測試環(huán)境,以通過日志分析盡量提前發(fā)現(xiàn)問題。

日志數(shù)據(jù)利用

利用前面幾種方式采集到的日志數(shù)據(jù),從下面幾個(gè)方面進(jìn)行分析和優(yōu)化:

  • 發(fā)現(xiàn)和定位系統(tǒng)功能問題,分析系統(tǒng)用戶的行為習(xí)慣,優(yōu)化業(yè)務(wù);

  • 發(fā)現(xiàn)和定位安全、性能等非功能問題,進(jìn)行修復(fù)和優(yōu)化;

  • 發(fā)現(xiàn)和分析日志記錄本身的不足,規(guī)范日志記錄,從而進(jìn)一步增強(qiáng)日志給問題診斷帶來的幫助,形成良性循環(huán)。規(guī)范日志記錄主要涉及這些點(diǎn):統(tǒng)一日志輸出路徑、統(tǒng)一日志記錄格式、清晰定義日志級別,并且把添加必要日志作為story開發(fā)流程的一部分,QA會參與日志評審。下圖是Splunk里看到的項(xiàng)目最新優(yōu)化的日志記錄格式:

項(xiàng)目對集成測試斷舍離才剛剛開始,正在不斷摸索著前進(jìn),目前能看到的最直接的影響是pipeline出包明顯加快,由以前的好幾天出不來一個(gè)包變成一天能出好幾個(gè)包。最振奮人心的是本周剛剛發(fā)生的事情:前一天下班前報(bào)的bug,第二天上午就已經(jīng)修復(fù)出包可以測試了。

寫在最后

系統(tǒng)級集成測試雖然有各種問題,不一定會因?yàn)榧蓽y試掛掉而發(fā)現(xiàn)很多問題,前面也討論了斷舍離的可行性,分析了項(xiàng)目斷舍離的實(shí)踐,但集成測試并不是用來發(fā)現(xiàn)問題的,而是一道對質(zhì)量把關(guān)的屏障,關(guān)鍵路徑的必要測試是不可替代的。因此,我們提倡減少集成測試的數(shù)量,合理調(diào)整各層測試的比例。

系統(tǒng)級集成測試的斷舍離需要團(tuán)隊(duì)有持續(xù)、遞進(jìn)、穩(wěn)定的交付能力,需要保證用戶不會受此影響,企業(yè)業(yè)務(wù)能夠正常運(yùn)轉(zhuǎn)。系統(tǒng)級集成測試的斷舍離過程不是一蹴而就的,凝結(jié)在集成測試上的心血也不是那么容易放棄的,需要很多的平衡和取舍,并在整個(gè)過程中要不斷的關(guān)注系統(tǒng)的質(zhì)量和風(fēng)險(xiǎn),及時(shí)作出相應(yīng)的調(diào)整。

文/ThoughtWorks林冰玉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 食之無味,棄之可惜 在企業(yè)級應(yīng)用的季度或月度發(fā)布被認(rèn)為是領(lǐng)域最佳實(shí)踐的時(shí)候,應(yīng)用部署到生產(chǎn)環(huán)境之前維護(hù)一個(gè)完整的環(huán)...
    BY林子閱讀 388評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 準(zhǔn)備換工作嗎?作為一個(gè)測試人員,今天赴面試現(xiàn)場,往往會被問到一系列有關(guān)敏捷測試的問題。即使是一個(gè)開發(fā)人員,同樣也免...
    CC先生之簡書閱讀 3,508評論 0 15
  • 接口自動化測試一體式解決方案 前戲叨逼叨:測試多年工作經(jīng)驗(yàn),很少有寫文章、博客之類的東西。其實(shí)我這人不愛去寫博客之...
    J先生有點(diǎn)兒屁閱讀 15,412評論 20 105
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,814評論 28 54

友情鏈接更多精彩內(nèi)容