近期,公司為了鍛煉開發(fā)人員技能器瘪,舉辦了一場涵蓋多個技術(shù)線的技能大練兵,我有幸受邀負責java技術(shù)方向的出題和評審工作。下面從以下幾個方面回顧下整個過程:
- 題目設(shè)計
- 程序要求
- 測試方法
題目設(shè)計
題目設(shè)計主要考慮以下幾點:
技術(shù)演進需求:在公司系統(tǒng)云遷移的戰(zhàn)略背景下面哼,我們的應(yīng)用即將從原來傳統(tǒng)的虛擬機部署向PAAS云環(huán)境進行大規(guī)模遷移,需要開發(fā)人員掌握云環(huán)境的開發(fā)技能扫步,應(yīng)用開發(fā)框架需要從原來的SpringMVC+dubbo升級為SpringCloud服務(wù)治理框架魔策。
新老員工兼顧:目前公司的開發(fā)人員構(gòu)成中,入職一兩年的新員工超過一半河胎,題目設(shè)計需要考慮到新員工的技能水平闯袒,不宜難度過大,否則會打消新員工參與的積極性游岳。同時政敢,還需要能體現(xiàn)正真的技術(shù)實力,不能因為題目過于簡單而使得分數(shù)拉不開差距胚迫。因此喷户,題目設(shè)計要使大家都能完成基本功能,同時拿高分的難度較大访锻。
解決生產(chǎn)難題:大練兵的初衷就是鍛煉開發(fā)人員技術(shù)實力褪尝,提升企業(yè)級應(yīng)用的開發(fā)技能,更好的完成日常任務(wù)期犬,最終要解決生產(chǎn)難題河哑,保障線上系統(tǒng)穩(wěn)定。類似力扣網(wǎng)上的算法題龟虎,不適合作為此次大練兵的題目璃谨。
基于以上幾點考慮,最終題目設(shè)計如下:
完成一個交易系統(tǒng):
產(chǎn)品子系統(tǒng)(product)遣总、訂單子系統(tǒng)(order)睬罗、積分經(jīng)驗子系統(tǒng)(experience)轨功,3個子系統(tǒng)完成分布式部署和調(diào)用。
業(yè)務(wù)場景:
一筆交易過程中容达,產(chǎn)品子系統(tǒng)要扣減庫存古涧,訂單子系統(tǒng)要新增訂單,積分子系統(tǒng)要有相應(yīng)的積分增加花盐。積分規(guī)則為每消費1元增加1積分羡滑。功能要求:
完成5只接口:下單、查詢庫存算芯、查詢訂單柒昏、查詢積分、個人交易信息概覽
題目意在考察大家在完成基本功能的同時熙揍,如何保證數(shù)據(jù)的一致性职祷。
程序要求
根據(jù)前期統(tǒng)計的報名意向來看,預(yù)計會有50人左右提交比賽交付物届囚。這么多交付物如果要依靠線下演示評審打分的話有梆,周期很長,而且需要人工部署調(diào)試意系,帶來巨大的工作量泥耀。因此,必須使用自動化的方式進行打分蛔添。同時為了控制程序?qū)崿F(xiàn)范圍痰催,防止開發(fā)人員無限蔓延開發(fā)需求,增加過多考察范圍之外的擴展迎瞧,因此對程序做了以下限制:
中間件限制:由于本次大練兵意在為后續(xù)的云遷移做技術(shù)儲備夸溶,因此中間件的選型必須控制在云上中間件的范圍內(nèi),因此要求使用SpringCloud+consul的服務(wù)治理框架夹攒、Nginx軟負載等中間件蜘醋,不能使用Apache、Dubbo等云上不用的中間件咏尝。
數(shù)據(jù)格式:題目提供3個子系統(tǒng)中核心的數(shù)據(jù)庫表結(jié)構(gòu)压语,例如產(chǎn)品信息表、訂單信息表编检、用戶經(jīng)驗表等胎食。同時給出5個接口的上送和返回字段,所有人必須按照此格式對前提供服務(wù)允懂。
組包格式:由于決定要實現(xiàn)自動化的打分程序厕怜,就必須要統(tǒng)一組包要求,包括壓縮包的目錄層級結(jié)構(gòu)、sql腳本格式粥航、nginx配置文件琅捏、start和stop腳本等。題目要求必須實現(xiàn)3個模塊(product递雀、order柄延、experience),同時提供了一個可選的其它模塊(other)缀程,參賽者可根據(jù)需要自己實現(xiàn)搜吧,如網(wǎng)關(guān)、聚合服務(wù)等功能都可以放在other模塊實現(xiàn)杨凑。other模塊組包要求同其它3個模塊一致滤奈。
本次題目主要的考察難點是如何保證數(shù)據(jù)的一致性。但是由于測試環(huán)境是同網(wǎng)段的機器撩满,內(nèi)網(wǎng)測試環(huán)境非常穩(wěn)定蜒程,在正常的程序運行過程中,很難發(fā)生數(shù)據(jù)不一致的情況伺帘。如何產(chǎn)生使數(shù)據(jù)可能不一致的事件搞糕,是本次出題的重點。
因此除了以上幾個限制曼追,本次大練兵還引入了一個大殺器:chaos-monkey。
chaos-monkey:是由netflix開源的一款軟件汉规,它能在生產(chǎn)系統(tǒng)中隨機產(chǎn)生異常事件礼殊,包括超時、程序異常针史、宕機等晶伦。chaos-monkey的想法源自于“混沌工程”。
混沌工程啄枕,是一門對系統(tǒng)進行實驗的學(xué)科婚陪,旨在了解系統(tǒng)對應(yīng)生產(chǎn)環(huán)境各種混亂狀況的能力,建立對系統(tǒng)的信心频祝。通過開展混沌工程方面的實驗泌参,可以測試出系統(tǒng)是否存在缺陷,從而了解系統(tǒng)在混亂的生產(chǎn)條件下如何表現(xiàn)常空。
chaos-monkey的原則沽一,避免大多數(shù)失效的主要方式就是經(jīng)常失效。通過經(jīng)常在生產(chǎn)環(huán)境制造故障漓糙,以保證生產(chǎn)環(huán)境的彈性铣缠。
本次比賽提供了chaos-monkey的jar包和配置,要求參賽者必須引入,以模擬超時或者異常蝗蛙,從而引發(fā)數(shù)據(jù)不一致蝇庭,測試程序的健壯性。
測試方法
測試主要分為兩步驟:自動部署和自動測試捡硅。
服務(wù)拓撲圖如下:
自動部署
所有選手的交付物都提交到統(tǒng)一的ftp目錄哮内,因此從ftp中遍歷文件并觸發(fā)部署即可。
流水線步驟如下:
for(遍歷ftp上的包)
清除redis緩存
執(zhí)行題目提供的sql建表語句病曾,初始化數(shù)據(jù)庫
從FTP獲取壓縮包牍蜂,并解壓
If(有nginx配置文件)
替換nginx配置文件,并重載
else
分發(fā)默認的nginx配置文件泰涂,并重載
執(zhí)行鋪底數(shù)據(jù)腳本
For(遍歷服務(wù)個數(shù))
按規(guī)則將各個服務(wù)壓縮包分發(fā)至各服務(wù)節(jié)點
if(存在額外的init.sql)
執(zhí)行init.sql
執(zhí)行服務(wù)的啟動腳本start.sh
運行測試腳本鲫竞,收集測試結(jié)果,計算分數(shù)逼蒙,并輸出到CSV文件
停止各服務(wù)
通常情況下从绘,自動部署使用Jenkins實現(xiàn)。但是Jenkins不支持循環(huán)遍歷是牢,一個job只能完成一個參賽者的部署和測試僵井。如果每個參賽者一個job,不能保證每個job配置的正確性驳棱,并且由于只有一套評審環(huán)境批什,每個人一個job的話,不能保證job的串行執(zhí)行社搅,多個job同時執(zhí)行會相互影響驻债。因此決定自己編寫部署腳本,僅在部署完成后形葬,需要測試時觸發(fā)測試job合呐,由測試job完成測試和打分。部署腳本監(jiān)聽測試job的狀態(tài)笙以,測試完成后淌实,再開始執(zhí)行下個參賽者的部署流程。
自動化測試
公司本來就具備完善的Robot Framework自動化測試基礎(chǔ)設(shè)施猖腕,本次測試直接使用即可拆祈。由于部署程序已經(jīng)在程序啟動前完成了數(shù)據(jù)庫和緩存的初始化,因此測試程序僅需讀取測試數(shù)據(jù)并向Nginx發(fā)起調(diào)用即可谈息。
由于要測試程序異常時缘屹,數(shù)據(jù)的一致性,因此要在測試開始之前開啟chaos-monkey侠仇,在執(zhí)行寫入數(shù)據(jù)的邏輯后(即下單接口)轻姿,關(guān)閉chaos-monkey犁珠,再開始查詢,通過查詢各個接口的數(shù)據(jù)并于寫入的數(shù)據(jù)相比對互亮,驗證數(shù)據(jù)的一致性犁享,并打分,步驟如下:
1.開啟各服務(wù)的chaos-monkey功能豹休;
2.執(zhí)行寫數(shù)據(jù)的測試腳本炊昆,即調(diào)用數(shù)百次下單接口;
3.關(guān)閉各服務(wù)的chaos-monkey功能威根;
4.執(zhí)行單個數(shù)據(jù)查詢接口凤巨,驗證每個接口的可用性,并記錄分數(shù)洛搀;
5.執(zhí)行組合驗證邏輯敢茁,驗證多個服務(wù)的數(shù)據(jù)一致性,并記錄分數(shù)留美。
每個參賽者的測試執(zhí)行完成后彰檬,要將計算的分數(shù)寫入?yún)R總到csv文件中。拿到最終的csv文件后谎砾,即可利用excel實現(xiàn)按照成績排序逢倍。
思考
通過本次大練兵,有以下幾點思考:
- 工具建設(shè)要持續(xù)投入:工具建設(shè)可使用最小的成本景图,獲取最大的收益较雕。此次練兵,開發(fā)部署流水線和自動化測試腳本各投入1人挚币,僅在2周內(nèi)使用業(yè)余時間就完成了開發(fā)和測試郎笆,比人工部署、演示忘晤、測試的成本要低得多。同時工具可重復(fù)執(zhí)行激捏,每次修改完后自動觸發(fā)设塔。日常的開發(fā)和測試過程應(yīng)盡可能多的使用工具去做回歸測試,避免人為疏忽引起的分析遺漏而沒回歸覆蓋远舅。
- 環(huán)境問題不容忽視:每個人都能在自己的環(huán)境中跑通程序闰蛔,但是在評審環(huán)境中,有些程序卻無法運行图柏。因此在日常測試過程中序六,我們除了程序本身的正確性以外,還需關(guān)注環(huán)境差異可能帶來的問題蚤吹。這里順帶吐槽一下例诀,如果公司能使用docker等容器技術(shù)随抠,將會提升我們的版本質(zhì)量,降低因環(huán)境不同而出錯的概率繁涂。
- 規(guī)范意識有待提高:雖然題目中已經(jīng)將組包格式拱她、程序端口等做了要求,也已將注意點通知到所有人扔罪,但是還是有很多人沒有遵守秉沼,導(dǎo)致測試程序跑分較低。這反映出大部分開發(fā)人員的特點矿酵,只管悶頭寫代碼唬复,卻忽視了規(guī)范要求,導(dǎo)致日后返工全肮,甚至產(chǎn)生線上故障敞咧,導(dǎo)致嚴重的后果。建議大家在日常編碼之前倔矾,提前熟悉并遵守規(guī)范和要求妄均,避免走彎路。
最后哪自,感謝大家對我的容忍丰包。2021,愿所有程序都不出bug壤巷!