利用chrome debug protocol拿到自動化測試后的js覆蓋率數(shù)據(jù)并展示

不熟悉cdp的可以參見前文:Chrome remote debugging protocol在自動化測試中的應(yīng)用和實踐

cov的數(shù)據(jù)結(jié)構(gòu)

首先痰憎,使用takePreciseCoverage方法來拿到j(luò)s執(zhí)行數(shù)據(jù)罚勾,這個數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)是這樣的:

    'result': {
        'result': [{
            'scriptId': '17',
            'url':'https://www.xxxxxxxxx.com/browser/guide.js',
            'functions': [{
                'functionName': 'get',
                'ranges': [{
                    'startOffset': 0,
                    'endOffset': 4273,
                    'count': 1
                }],
                'isBlockCoverage': False
            },
            }],
        }],
    }
        ......

一個result包含多個js的統(tǒng)計情況托启,每個url基本就是js的請求地址;在每個js的統(tǒng)計情況里屯耸,又有多個function的統(tǒng)計情況,每個function里的startOffset和endOffset指的是這個方法的被統(tǒng)計語句按字節(jié)位置來算的開始位置和結(jié)束位置线召,count代表這段語句是否被執(zhí)行到多矮,1代表是缓淹,0代表否塔逃。

因此,思路就是湾盗,拿到測試完成后的js統(tǒng)計數(shù)據(jù),然后通過每個js統(tǒng)計數(shù)據(jù)里的每個function的統(tǒng)計坐標值和統(tǒng)計狀態(tài)躏吊,和原始js數(shù)據(jù)比對,從而實現(xiàn)對js覆蓋狀況的總覽颜阐。

下面說一下具體流程。

過濾cov數(shù)據(jù)

cov數(shù)據(jù)(也就是上文的js統(tǒng)計數(shù)據(jù))不是直接可用的凳怨,因為首先獲取到的覆蓋率是十分全面的,全面到會有很多額外的你不想要的數(shù)據(jù)紫新,比如通用的js類庫李剖,還有dev tools操作時的js數(shù)據(jù)等等,所以第一步是過濾cov數(shù)據(jù)篙顺。

過濾分為兩步,第一步是過濾掉你不需要的js統(tǒng)計數(shù)據(jù)德玫,這里根據(jù)主域名來過濾,具體是寫了cov_domain_filter()這個方法(詳見源碼材彪,下同琴儿。)段化,接受一個數(shù)組造成,數(shù)組內(nèi)容是你要過濾的主域名列表,然后返回給你只留下含有主域名的js的統(tǒng)計數(shù)據(jù)谜疤。

第二步现诀,因為這個統(tǒng)計數(shù)據(jù)包含了所有的執(zhí)行狀態(tài)的統(tǒng)計,包括覆蓋到的和未覆蓋到的坐桩,我們只需要標注出未覆蓋到的代碼,就可以體現(xiàn)出覆蓋情況绵跷,因此這里進一步過濾了狀態(tài),只留下了未覆蓋到的代碼的統(tǒng)計情況碾局,具體方法是cov_not_count_filter()。

至此净当,我們的數(shù)據(jù)就過濾完成了。

合并cov數(shù)據(jù)

仔細研究了一下cov數(shù)據(jù)俘闯,發(fā)現(xiàn)每個js的統(tǒng)計數(shù)據(jù)里忽冻,會有相同的function的統(tǒng)計數(shù)據(jù)真朗,例如前面有一個function test僧诚,他的數(shù)據(jù)是{startoffset:10;endoffset:29},后面又可能存在一個unction test,他的數(shù)據(jù)是{startoffset:30;endoffset:60},當然他們的數(shù)據(jù)不一樣蹭睡,我猜測他是根據(jù)測試的進程赶么,不斷的在js的統(tǒng)計數(shù)據(jù)里追加方法統(tǒng)計數(shù)據(jù),這點沒有徹底的領(lǐng)悟作者的意圖辫呻。

出于后面的統(tǒng)計結(jié)果展示方便,這里我把這種數(shù)據(jù)都給合并了祟昭,例如前文的例子怖侦,把他的數(shù)據(jù)合并了就是{startoffset:10;endoffset:60}篡悟,這樣每個js的統(tǒng)計數(shù)據(jù)里匾寝,只可能存在一個方法,每個方法會有多個不可再合并的統(tǒng)計數(shù)據(jù)急凰,這里的方法是merge_same_func_ranges猜年。

對比和追加cov數(shù)據(jù)

如果只進行一次的測試過程的覆蓋率收集疾忍,那么這一步是不必要做的床三,但是,考慮到一個模塊可能要多個測試用例才能覆蓋完流程分支撇簿,那么要想獲得這個模塊的覆蓋率,就只有在每個用例完成后补疑,將收集的cov數(shù)據(jù)和前一次的進行對比和追加。

這里是寫的很痛苦了诊胞,因為cov的數(shù)據(jù)結(jié)構(gòu)不是我是谷歌制定的锹杈,本身對于為什么要這么設(shè)計也并不理解充分,這個數(shù)據(jù)結(jié)構(gòu)層級非常的深竭望,所以要對比并進行追加就非常的繁瑣,這里用了大量的列表推導式來代替for循環(huán),否則for循環(huán)會更多影钉,這個方法是make_covdata_file掘剪。

將cov數(shù)據(jù)最終展示

cov數(shù)據(jù)處理完,還需要一個網(wǎng)頁進行展示廉赔,這里是用了一個模板類匾鸥,通過設(shè)立html模板,將數(shù)據(jù)替換扫腺,再生成從而實現(xiàn)了簡單的網(wǎng)頁展示村象,如果你有更高的需求可以自行進行設(shè)計攒至。

這里要說的是著色器模塊迫吐,也就是給數(shù)據(jù)上背景色,設(shè)計上是通過對未覆蓋的代碼兩端插入背景色的html代碼來實現(xiàn)未覆蓋代碼的醒目展示志膀,這里存在一個算法問題鳖擒,因為你不能直接根據(jù)代碼的起始坐標(也就是startoffset和endoffset)直接插入背景色html代碼,因為當你第一次插入的時候是沒問題的蒋荚,但你要在下一個坐標插入的時候,就會出問題惊奇,因為你之前插入了代碼的緣故播赁,對下一個坐標而言,已經(jīng)不是真實坐標了容为,需要加上之前背景色代碼的偏移量。

這里我不(jiu)得(shi)已(lan)采用了一個非常犧牲性能的辦法竭缝,就是直接拿cov數(shù)據(jù)復制出副本沼瘫,用需要加背景的代碼的起始坐標拿出這部分的字符串抬纸,然后在副本里搜索并添加背景代碼耿戚,然后再替換回去(捂臉哭)。

最終的展示效果

這里我做了一個簡單的本地文件作為示例坛猪,看一下最終結(jié)果皂股。

覆蓋率效果展示.png

為了方便演示,整個profiler模塊被我集成進了之前的一個ui測試框架里就斤,例子也直接扔進去了,只需要把這個項目clone下來洋机,然后把環(huán)境變量修改為你的,再運行process模塊就可以體驗绷旗,當然你也可以直接使用這個模塊。

項目地址:https://github.com/icesword0760/uitest-keyword

一些tips

1.不能用于壓縮混淆后的js上庄岖;

2.因為展示部分的著色器算法性能損耗過大角骤,所以如果你要生成報告的話會很慢,有興趣的可以自己重寫這部分启搂。

3.php項目,結(jié)合博客里的php覆蓋率統(tǒng)計方法牢撼,可以和這個模塊一起做到前后端代碼覆蓋率統(tǒng)計疑苫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撼短,隨后出現(xiàn)的幾起案子挺勿,更是在濱河造成了極大的恐慌曲横,老刑警劉巖不瓶,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚊丐,死亡現(xiàn)場離奇詭異,居然都是意外死亡麦备,警方通過查閱死者的電腦和手機昭娩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門栏渺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膀捷,“玉大人迈嘹,你說我怎么就攤上這事全庸∪谕矗” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵覆劈,是天一觀的道長沛励。 經(jīng)常有香客問我,道長目派,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任白筹,我火速辦了婚禮谅摄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘送漠。我一直安慰自己,他們只是感情好棒厘,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布下隧。 她就那樣靜靜地躺著,像睡著了一般何乎。 火紅的嫁衣襯著肌膚如雪句惯。 梳的紋絲不亂的頭發(fā)上支救,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天各墨,我揣著相機與錄音,去河邊找鬼贬堵。 笑死,一個胖子當著我的面吹牛黎做,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筷厘,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宏所,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爬骤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赫冬,失蹤者是張志新(化名)和其女友劉穎溃列,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體听隐,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡雅任,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了硼婿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡寇漫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出记焊,到底是詐尸還是另有隱情栓撞,我是刑警寧澤遍膜,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布瓢颅,位于F島的核電站,受9級特大地震影響惜索,放射性物質(zhì)發(fā)生泄漏剃浇。R本人自食惡果不足惜猎物,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔫磨。 院中可真熱鬧,春花似錦蒲列、人聲如沸搀罢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唧取,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邢享,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工骇塘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人湾碎。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓奠货,卻偏偏與公主長得像,于是被迫代替她去往敵國和親递惋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,386評論 8 265
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)杉编,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • (身在惠州·之四) 文/羅文烈 如果一座城市里嘶朱,有一片湖面光酣,那么疏遏,這個映在倒影中的城市救军,空氣中就別有一種淡淡的、陰...
    羅文烈閱讀 877評論 5 6
  • 這套書戳寸,小白同學已經(jīng)盼了好久了胆萧,之前買了1庆揩,愛不釋手跌穗,一直催著讓我買后面的,看漫畫學英語是一種奢望蚌吸,聊勝于無吧~
    不負時光不負卿閱讀 514評論 0 0
  • 如果稀缺讓你智商變低,理性開關(guān)失靈缝彬,從而去做蠢事的話,那么稀缺思維才是導致這一切的幕后黑手谷浅,也就是一個可怕的惡魔。...
    FASG_一只龍蝦閱讀 352評論 0 0