前端質(zhì)量提升利器-馬可代碼覆蓋率平臺

本文根據(jù)Song Jiachao老師在“2021 vivo開發(fā)者大會"現(xiàn)場演講內(nèi)容整理而成。公眾號回復(fù)【2021VDC】獲取互聯(lián)網(wǎng)技術(shù)分會場議題相關(guān)資料骡湖。

[圖片上傳失敗...(image-4bf909-1641782716283)]

一充石、背景

1.1 項目特點

隨著互聯(lián)網(wǎng)科技的飛速發(fā)展莫换,越來越多的公司將敏捷開發(fā)的流程引入到項目迭代中,所以越來越多的項目呈現(xiàn)出三個特點:

[圖片上傳失敗...(image-d8db95-1641782716283)]

1)迭代周期短:各種倒排骤铃,壓排期拉岁,一周一小版本,兩周一大版本惰爬,甚至有的項目每天都在發(fā)版喊暖,苦不堪言。

2)需求變更頻繁:我們的產(chǎn)品經(jīng)理不是在推翻自己撕瞧,就是在推翻自己的路上陵叽,所以我們經(jīng)常也會開玩笑跟產(chǎn)品經(jīng)理說:來來來狞尔,你立個字據(jù),保證一下以后再也不改需求了巩掺。產(chǎn)品經(jīng)理這時候信誓旦旦的說:好好好偏序,你把這個需求改了,我保證給你立字據(jù)胖替,下次再也不改了研儒。可是并沒有什么作用独令,需求依然改的很頻繁端朵。當然了,這也不能怪產(chǎn)品經(jīng)理燃箭,面對著瞬息萬變的市場環(huán)境逸月,我們有時候需要用這種試錯的方式來快速的找到正確的方案。

3)系統(tǒng)復(fù)雜度高:前端已經(jīng)不僅僅是畫畫頁面那么簡單了遍膜,大家可以從現(xiàn)在的前端招聘信息中就可以看出來。分布式瓤湘、微服務(wù)瓢颅、中間層虏杰、各種琳瑯滿目的架構(gòu)憋肖,讓本就復(fù)雜的業(yè)務(wù)爷光,變得更加復(fù)雜别垮。

隨著項目的這些特點越來越明顯堕汞,對我們開發(fā)和測試的挑戰(zhàn)也變得越來越大溯职。

1.2 煩惱

所以我們會有如下的一些煩惱:

[圖片上傳失敗...(image-458943-1641782716283)]

有這樣的煩惱但两,歸根結(jié)底有兩方面的原因:

測試人員:他們不知道開發(fā)代碼的改動點在哪里舆声,影響點在哪里醒第,很難用精準化的測試方案渔嚷,來提升測試效率,所以為了保險起見稠曼,只能把相關(guān)功能全部測一遍

開發(fā)人員:他們無法全面的知道每一行代碼的執(zhí)行情況形病,很難通過執(zhí)行數(shù)據(jù),來分析哪些代碼是有用的霞幅,哪些代碼是沒用的漠吻,哪些代碼測試已經(jīng)驗證過,哪些代碼還沒有被驗證

[圖片上傳失敗...(image-e3b39e-1641782716283)]

所以我們迫切的需要一個平臺司恳,能夠方便的看出代碼的改動點和執(zhí)行情況途乃,而這個平臺就是集成代碼覆蓋率平臺。

1.3 方案

所謂的集成代碼覆蓋率平臺扔傅,是指在集成測試期間耍共,采集代碼覆蓋率烫饼,并上報到系統(tǒng)中進行合并展示的平臺。

image

1.4 難點

既然有解決方案划提,為什么現(xiàn)在市面上很少有這樣的產(chǎn)品推出呢枫弟?我們在研究這方面的時候,發(fā)現(xiàn)了兩個非常大的技術(shù)難點鹏往。

第一個難點是:數(shù)據(jù)合并難淡诗。我們都知道,前端所有的測試都是在各端進行的伊履,測試產(chǎn)生的數(shù)據(jù)留在各個終端韩容,很難將這些留在各個終端的數(shù)據(jù)進行收集和合并。

第二個難點是:數(shù)據(jù)失效快唐瀑。前端代碼發(fā)版非常頻繁群凶,在測試的時候,每天可能發(fā)版好多次哄辣,發(fā)版代表雖然是同一份文件请梢,但里面的內(nèi)容可能完全不一樣了,這樣就會導致之前采集的覆蓋率完全失效了力穗。

image

通過不斷的嘗試毅弧,我們終于解決了這兩個問題,于是就誕生了馬可代碼覆蓋率平臺当窗。

二够坐、馬可平臺的優(yōu)勢及亮點

2.1 優(yōu)勢及亮點

馬可平臺是一個完備的代碼覆蓋率平臺,具有以下幾個亮點:

  • 支持一鍵接入:不挑業(yè)務(wù)崖面,框架元咙,對現(xiàn)有代碼零侵入,一鍵即可接入巫员;

  • 支持增量報告:能夠讓使用者更加精準的了解代碼覆蓋率情況庶香;

  • 支持多種語言:馬可平臺不局限于前端,也能服務(wù)后端简识;

  • 支持多種工具:方便用戶使用脉课,比如代碼對比,gitblame等财异;

  • 支持多個用戶:多種報告的實時合并與查看倘零;

  • 支持大盤監(jiān)控:通過大盤實時查看覆蓋率走勢,了解項目質(zhì)量趨勢戳寸;

  • 支持消息通知:定時推送項目覆蓋率情況呈驶;

  • 支持獨立部署:不僅支持第三方直接接入,還支持一鍵私有化部署疫鹊。

image

2.2 體驗

2.2.1 詳情頁

  • 下圖上的第一點:當前版本改動了哪些文件袖瞻,我們會將所有的改動文件通過樹狀結(jié)構(gòu)圖展示在第一個區(qū)域司致,讓用戶一眼就能清楚當前版本到底改了多少個文件

  • 下圖上的第二點:當前文件改動哪些地方,我們通過代碼對比的方式聋迎,直觀的將每一個文件的改動點顯示在第二個區(qū)域脂矫,讓用戶一眼就能看到這個文件到底改了哪幾行代碼

  • 下圖上的第三點:當前改動是否被測試驗證過,剛剛第二點我們標記出了一份文件的到底哪幾行發(fā)生了變更霉晕,那么第三點就是將變更的代碼標記出來是否被驗證過庭再。

有了這三點標記,我們就將改動點和測試過程進行了完美的結(jié)合牺堰,讓測試結(jié)果一目了然拄轻。

[圖片上傳失敗...(image-ea1cf2-1641782716283)]

2.2.2 趨勢圖

通過項目趨勢圖,我們可以清楚的看出項目覆蓋率走勢伟葫,了解項目質(zhì)量趨勢恨搓。

image

2.2.3 概覽

目前馬可平臺已經(jīng)穩(wěn)定運行近3個月了,服務(wù)了39個項目筏养,生成了133分報告斧抱。

image

2.3 價值

通過馬可平臺我們就將測試關(guān)注的四個點即:修改點、影響點渐溶、測試點和測試結(jié)果辉浦,給緊密的聯(lián)系起來,同時將之前的缺乏數(shù)據(jù)的評估轉(zhuǎn)化成精確的掌猛,有客觀依據(jù)可量化的評估。

image

三眉睹、馬可平臺的技術(shù)方案

馬可平臺的技術(shù)方案共有4個小部分:首先會介紹馬可平臺的整體架構(gòu)荔茬,然后分別從接入層、服務(wù)層和展示層竹海,三個方面加以詳細的說明慕蔚。

3.1 整體架構(gòu)圖

馬可平臺分為三個層:接入層、服務(wù)層和展示層斋配;

  • 接入層:我們的目標是一鍵接入孔飒,多語言適配,區(qū)分環(huán)境和智能上報艰争。目前針對Web端的適配已經(jīng)全部完成了坏瞄,正在適配其他技術(shù)棧,比如小程序甩卓、Node.js鸠匀、Typescript。同時我們還規(guī)劃了其他語言的接入方式逾柿,讓馬可平臺變成全語言的代碼覆蓋率平臺缀棍。

  • 服務(wù)層:主要是對報告的各種處理宅此,比如報告管理、用戶管理爬范、項目管理等功能父腕。

  • 展示層:主要是對服務(wù)層的一個延伸,通過可視化的方式青瀑,提供更加便捷的報告查看和管理等功能璧亮。

image

3.2 數(shù)據(jù)流向圖

通過數(shù)據(jù)流向圖,我們將一份報告從接入層到服務(wù)層再到展示層給串聯(lián)起來形成一個完美的閉環(huán)狱窘。

[圖片上傳失敗...(image-9b61ab-1641782716283)]

3.3 接入層

接入層主要就是接入和上報這兩點杜顺;

針對接入:我們提供各語言插樁方案、插樁規(guī)范蘸炸、以及接入指導躬络。

針對上報:主要有各語言的采集方案,上報數(shù)據(jù)標準和上報方案搭儒。

[圖片上傳失敗...(image-f14882-1641782716283)]

3.3.1 接入

插樁維度

通常我們會將插樁分為4個維度:語句覆蓋率穷当,函數(shù)覆蓋率,分支覆蓋率淹禾,和行覆蓋率馁菜。

[圖片上傳失敗...(image-59002-1641782716283)]

插樁過程

image

馬可插樁

這是馬可平臺,js插樁的部分代碼铃岔,主要做了三件事汪疮;

  • 第一步:獲取文件相對路徑

為啥是相對路徑?因為馬可代碼覆蓋率是一個平臺毁习,所以我們需要獲取相對路徑智嚷,讓文件路徑和項目進行關(guān)聯(lián),而不是與打包機器關(guān)聯(lián)纺且。

  • 第二步:調(diào)用了istanbul-lib-instrument進行插樁我們沒有完全重寫插樁代碼盏道,而是借助了開源的力量,讓馬可平臺更加輕量化载碌、通用化猜嘱。

  • 第三步:添加自定義參數(shù)這些參數(shù)都非常重要,指明了當前報告的重要信息嫁艇。

這樣我們就簡單完成了js語言的插樁適配朗伶,其他語言可以同樣參考這樣的思路。

image

3.3.2 上報

上報就是采集和發(fā)送的過程步咪。

針對采集:主要獲取兩個信息腕让,覆蓋率信息和項目信息,兩者缺一不可。

針對發(fā)送:各個端會有很大的差異纯丸,我們提供了一定的建議偏形。比如在web中可以監(jiān)聽Visibilitychange事件,而在小程序中可以監(jiān)聽onShow和onHide事件觉鼻,如果是在Node等其他服務(wù)端中可以通過定時任務(wù)進行上報俊扭。

image

3.4 服務(wù)層

馬可的服務(wù)層提供了很多的功能,這里我們挑報告管理和用戶管理坠陈,這兩個比較典型的功能進行介紹萨惑。

image

3.4.1 報告管理

報告三要素:首先一份完整的報告需要有三個基本要素:覆蓋率信息,項目信息仇矾,和文件信息庸蔼。

  • 覆蓋率信息包括:語句、分支贮匕、函數(shù)姐仅、行四個覆蓋率。

  • 項目信息包括:項目配置刻盐,分支信息掏膏,文件hash,構(gòu)建時間敦锌。

  • 文件信息包括:文件地址馒疹、文件內(nèi)容和Git信息。

通過接入層采集的覆蓋率信息和項目信息乙墙,然后關(guān)聯(lián)Git平臺的文件信息颖变,通過這種方式才能讓馬可變成一個多用戶、多報告支持的覆蓋率平臺听想。

[圖片上傳失敗...(image-ef64e3-1641782716283)]

3.4.2 合并流程

上一個步驟我們采集到了覆蓋率腥刹,下面我們聊一聊馬可平臺是如何進行報告合并的,我們先來考慮兩種情況:

  • 第一種情況:文件沒有變更哗魂;

就是我們下圖左邊的部分肛走,文件沒有變更的時候漓雅,有兩個測試录别,小美和小花分別產(chǎn)生了兩個報告信息,這種情況改如何進行合并呢邻吞?

  • 第二種情況是:文件發(fā)生了變更组题;

同一份文件,文件的內(nèi)容發(fā)生了變更抱冷,變更文件的行號前后無法一一對應(yīng)崔列,比如變更前文件的第10行,到了變更后的文件,就變成了第6行赵讯,這兩行其實是一樣的盈咳,但因為其他行的刪減導致了,這一行的行號也發(fā)生了變化边翼,這種情況又該如何合并呢鱼响?

image

帶著上面兩個問題,我們來整理一下報告的和合并流程组底。

比較復(fù)雜的就是對報告構(gòu)建時間進行對比丈积,構(gòu)建時間比較會有三個結(jié)果,分別對應(yīng)不同的合并流程债鸡。

image

3.4.3 變更內(nèi)容獲取

在主流的git托管平臺江滨,都提供了API接口的方式,返回Git的信息厌均,比如可以通過Gitlab的compare接口就可以將兩個分支的對比信息給拿到唬滑,通過解析返回的信息,我們就可以知道文件的變更內(nèi)容莫秆。

image

3.4.4 用戶管理

為了能夠讓馬可平臺盡可能的簡單化间雀,我們登錄使用了通用Oauth登錄方式,通過這種方式镊屎,不僅解決了登錄問題惹挟,同時也解決了代碼權(quán)限的問題,真是一舉多得缝驳,當然我們在設(shè)計登錄的時候连锯,充分考慮了主流的Git平臺,比如Gitlab用狱、Github运怖、Gitee等,也就是說托管在這些平臺中的代碼夏伊,都可以一鍵接入馬可代碼覆蓋率平臺摇展。

image

3.5 展示層

這就是馬可平臺報告展示的細節(jié),支持實時刷線報告溺忧,支持代碼對比咏连。通過對比可以我們詳細看到文件變更的內(nèi)容,以及便跟內(nèi)容的覆蓋率情況鲁森。

image

3.5.1 代碼對比

那馬可平臺是如何做代碼對比的呢祟滴?

[圖片上傳失敗...(image-4beafd-1641782716283)]

我們借助了一個開源庫,叫做jsdiff歌溉,通過這個庫我們可以對比出兩個文件的差異信息垄懂。對比出來的結(jié)果是一個對象數(shù)組,這是個對象數(shù)組,數(shù)組包含4個內(nèi)容:

  • count:行數(shù)草慧;

  • Value:具體代碼桶蛔;

  • Added:是否新增;

  • Removed:是否刪除漫谷。

通過解析這個數(shù)組羽圃,我們可以將對比的結(jié)果一一還原到頁面中來,比如右下角抖剿,就是我們通過這個數(shù)組進行還原的結(jié)果朽寞。

[圖片上傳失敗...(image-799eba-1641782716283)]

四、總結(jié)規(guī)劃

到這里我們對于馬可代碼覆蓋率平臺的技術(shù)方案斩郎,基本聊完了脑融,對于馬可代碼覆蓋率平臺,我們接下來有兩個比較大的規(guī)劃缩宜。

1)一是豐富各端語言的接入:

  • 前端包括小程序肘迎,Node.js,Typescript锻煌;

  • 其他語言包括妓布,Go,Java等宋梧。

2)二是要做開源:

  • 我們會將馬可平臺整體打包開源匣沼,擁抱開源社區(qū),希望和大家一起共建馬可平臺捂龄。

[圖片上傳失敗...(image-db95d3-1641782716283)]

上面就是我們對代碼覆蓋率的一些探索释涛,代碼覆蓋率可以當做是測試質(zhì)量的一個指標,提供了相對合理倦沧、客觀的數(shù)據(jù)唇撬。但100%的代碼覆蓋率,并不能代表100%沒有bug展融,代碼覆蓋和用例是否正確沒有一個明確的對應(yīng)關(guān)系窖认,僅僅是測試質(zhì)量過程中的一個補充。不能盲目追求代碼覆蓋率告希,而應(yīng)該想辦法設(shè)計更多更好的用例扑浸,讓用例和代碼覆蓋率相互補充,提升項目質(zhì)量暂雹。

作者:vivo官網(wǎng)商城前端團隊-Song Jiachao

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末首装,一起剝皮案震驚了整個濱河市创夜,隨后出現(xiàn)的幾起案子杭跪,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涧尿,死亡現(xiàn)場離奇詭異系奉,居然都是意外死亡,警方通過查閱死者的電腦和手機姑廉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門缺亮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桥言,你說我怎么就攤上這事萌踱。” “怎么了号阿?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵并鸵,是天一觀的道長。 經(jīng)常有香客問我扔涧,道長园担,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任枯夜,我火速辦了婚禮弯汰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湖雹。我一直安慰自己咏闪,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布摔吏。 她就那樣靜靜地躺著汤踏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舔腾。 梳的紋絲不亂的頭發(fā)上溪胶,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音稳诚,去河邊找鬼哗脖。 笑死,一個胖子當著我的面吹牛扳还,可吹牛的內(nèi)容都是我干的才避。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼氨距,長吁一口氣:“原來是場噩夢啊……” “哼桑逝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起俏让,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤楞遏,失蹤者是張志新(化名)和其女友劉穎茬暇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寡喝,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡糙俗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了预鬓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巧骚。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖格二,靈堂內(nèi)的尸體忽然破棺而出劈彪,到底是詐尸還是另有隱情,我是刑警寧澤顶猜,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布粉臊,位于F島的核電站,受9級特大地震影響驶兜,放射性物質(zhì)發(fā)生泄漏扼仲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一抄淑、第九天 我趴在偏房一處隱蔽的房頂上張望屠凶。 院中可真熱鬧,春花似錦肆资、人聲如沸矗愧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唉韭。三九已至,卻和暖如春犯犁,著一層夾襖步出監(jiān)牢的瞬間属愤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工酸役, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留住诸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓涣澡,卻偏偏與公主長得像贱呐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子入桂,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容