国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

“覆蓋率檢測”的實現(xiàn)原理,就這?

開發(fā) 前端
覆蓋率就是執(zhí)行過的代碼占總代碼的比例,比如執(zhí)行了多少行(Line),執(zhí)行了多少個分支(Branch),執(zhí)行了多少個函數(shù)(Function),執(zhí)行了多少條語句(Statement)。

[[429164]]

覆蓋率檢測是用來判斷單測完整性的,jest 和 karma 都提供了這種功能:

 

覆蓋率就是執(zhí)行過的代碼占總代碼的比例,比如執(zhí)行了多少行(Line),執(zhí)行了多少個分支(Branch),執(zhí)行了多少個函數(shù)(Function),執(zhí)行了多少條語句(Statement)。

用它比上總的數(shù)量就是覆蓋率,分為行覆蓋率、分支覆蓋率、函數(shù)覆蓋率、語句覆蓋率等。

看起來是不是很神奇,執(zhí)行完一遍就能知道覆蓋到了哪些代碼,其實實現(xiàn)原理比較簡單,相信看完這篇文章,你會有“就這?”的感覺。

原理探究

jest 和 karama 都是基于 istanbul 做的覆蓋率檢測,我們來探究下 istanbul 的實現(xiàn)原理。

測試代碼如下: 

我們執(zhí)行 istanbul 的 instrument 命令:

  1. npx istanbul instrument ./test.js -o ./out.js 

instrument 是指函數(shù)插樁,也就是透明的給函數(shù)添加一些代碼。

為什么要插樁呢?看完生成的代碼你就明白了。

我們來格式化一下,把變量名替換下。

這就是轉(zhuǎn)換后的代碼,在每一個 statement,每一個 function、每一個 branch 都做了計數(shù),分別是 s、f、b 屬性。

上面還有一段代碼:

初始化了全局變量 AAA,記錄了這些信息:

  • path:路徑
  • s:statement 數(shù)
  • b:branch 數(shù)
  • f:function 數(shù)
  • fnMap:function 的開始結(jié)束位置信息
  • statementMap:statement 的開始結(jié)束位置信息
  • branchMap:branch 的開始結(jié)束位置信息

看到這里我們大概就能搞懂覆蓋率的原理了,就是對每個 statement、function、branch 都插入一段計數(shù)代碼,記錄在一個全局對象中。

為了不和別的全局變量沖突,這個對象的名字是隨機生成的,比如 __cov_5ZoEXQ_Hbo27uXArxdm2oA,這里為了簡化改為了 AAA。

我們搞明白了覆蓋率就是靠插入計數(shù)代碼,那怎么做的插樁呢?

函數(shù)插樁

函數(shù)插樁是基于 AST,找到 statement、function、branch 的 AST,在前面插入插樁代碼的 AST。

istanbul 確實也是這么做的。

下面是 istanbul 的源碼(只看紅線標出的位置就行):

就是通過 esprima(js parser)來把代碼 parse 成 AST,然后對 AST 進行插樁。

插樁代碼分為兩部分,一部分是初始化全局對象的代碼,一部分是每個分支、語句、函數(shù)的計數(shù)代碼。

我們分別來看下:

初始化全局對象的代碼插樁

istanbul 初始化了全局的 coverState 對象用于統(tǒng)計:

做插樁的時候會記錄信息到這個 coverState 中:

最后把 coverState 變成字符串加入到代碼里:

那具體的分支、語句、函數(shù)的 AST 是怎么插樁的?

分支、語句、函數(shù)的插樁

對不同 AST 的插樁,就是遍歷過程中根據(jù)類型做不同的處理:

然后,具體的插樁就是在前面插入一段 AST:

statement 插樁:

function 插樁:

看到這里,我們就知道了函數(shù)插樁的實現(xiàn)原理,就是遍歷 AST,在不同的位置插入計數(shù)代碼的 AST 就可以了。

但是有的同學(xué)可能會說了,平時我也沒手動生成插樁后的代碼啊?用 jest --coverage 跑測試用例自動就做了計數(shù),然后給出覆蓋率數(shù)據(jù)了。

istanbul 是怎么做到透明的插樁的呢?

require hook 實現(xiàn)透明無感知的函數(shù)插樁

看過之前一篇 require hook 的魔術(shù)那篇文章的小伙伴知道,nodejs 的模塊加載是分為 load、extension['.js']、compile 這幾步的。

我們只需要重寫 extension['.js'] 這一步,就能做到透明的代碼轉(zhuǎn)換。

istanbul 也是這么做的:

它就是通過修改了 extension['.js'] 方法,在這里面做了函數(shù)插樁,之后執(zhí)行的代碼就是轉(zhuǎn)換過后的了,開發(fā)者根本感知不到。

總結(jié)

jest 和 karma 都基于 istanbul 實現(xiàn)了覆蓋率檢測。覆蓋率統(tǒng)計的原理就是函數(shù)插樁,基于 AST 在代碼的 statement、function、branch 處插入計數(shù)代碼,同時通過 require hook 實現(xiàn)了透明的轉(zhuǎn)換。這樣代碼一執(zhí)行就能拿到統(tǒng)計數(shù)據(jù),自然就可以算出覆蓋率了。

看完之后,是不是覺得:

覆蓋率檢測的實現(xiàn),就這?

 

責(zé)任編輯:姜華 來源: 神光的編程秘籍
相關(guān)推薦

2022-05-31 09:01:18

SwiftApp 項目

2024-04-01 08:26:30

單測覆蓋率字節(jié)碼

2019-09-25 09:20:41

谷歌代碼開發(fā)者

2022-03-29 11:32:32

單元測試覆蓋率框架

2011-11-01 10:10:48

ScriptCover

2023-10-27 08:49:00

JCovOpenJDK

2021-12-25 22:30:27

Chrome DevTJavaScript調(diào)試工具

2022-10-21 15:29:32

5G網(wǎng)絡(luò)

2022-08-25 06:27:39

vivoJaCoCo代碼覆蓋率

2012-04-11 11:21:57

ibmdw

2019-09-30 10:27:52

變異測試評估

2018-02-27 14:50:20

大數(shù)據(jù)公廁城市

2021-04-22 06:13:41

Express 中間件原理中間件函數(shù)

2012-09-21 10:30:56

Linux項目代碼覆蓋率

2011-04-25 09:49:20

代碼測試

2024-06-14 12:04:33

2016-01-13 10:14:15

WebPHP函數(shù)覆蓋

2015-11-09 17:56:57

WebPHP函數(shù)覆蓋

2022-07-22 07:38:31

監(jiān)控系統(tǒng)

2022-05-13 09:40:51

代碼可行應(yīng)用性能
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品免费播放| 91国产中文字幕| 欧美激情免费在线| 国产鲁鲁视频在线观看免费| 中文字幕中文字幕中文字幕亚洲无线| caoporen国产精品| 97视频免费| 午夜国产精品视频| 亚洲一区二区三区视频播放| 榴莲视频成人app| 最近2019中文字幕在线高清| 久操视频在线免费播放| 色乱码一区二区三区88| 一本一道dvd在线观看免费视频| 天天影视涩香欲综合网| 日本粉色视频在线观看| 日本韩国视频一区二区| 99精品免费在线观看| 亚洲激情av在线| 美女网站色免费| 蜜桃av噜噜一区二区三区小说| 99热在线国产| 欧美日韩综合| 精品国产乱码久久久久久88av| 伊人激情综合| 六月婷婷久久| 国产日韩1区| 午夜精品亚洲一区二区三区嫩草| 久久一日本道色综合久久| 一区二区三区在线视频看| 粉嫩久久99精品久久久久久夜| 日本三级免费观看| 国产精品美女一区二区三区 | 色一情一乱一伦一区二区三欧美 | 秋霞影院一区| 久久久久久成人精品| 日本天堂一区| 92国产精品视频| 999亚洲国产精| 亚洲欧洲精品在线 | 欧美aaa在线观看| 91色.com| 天堂在线看视频| 911国产精品| 日本一区免费网站| 国内精品久久久久| 欧美aa国产视频| 亚洲综合五月天| 亚洲国产精品二十页| 在线观看av每日更新免费| 日韩黄色在线免费观看| 一区二区三区高清在线视频| 欧美亚洲综合另类| 精品丝袜在线| 久久久久久国产免费 | 亚洲影视在线| av日韩一区二区三区| 国产精品不卡在线| 国产黄色免费在线观看| 亚洲国产日韩欧美在线图片| 日本一区二区三区中文字幕| 久久久久国色av免费观看性色| 欧美激情黄色片| 亚洲一一在线| 亚洲免费观看高清在线观看| 成人video亚洲精品| 久久亚洲精品成人| 国产综合久久| 青青草原av在线播放| 欧美中文字幕一区二区三区| 电影中文字幕一区二区| 国产区二精品视| 久久夜色精品一区| a级在线观看| 国产成人精品一区二区| 久久国产精品第一页| 麻豆电影在线观看| 怡红院精品视频| 午夜片欧美伦| av网站手机在线观看| 亚洲一二三区视频在线观看| 黄色污网站在线观看| 国产欧美日韩中文字幕| 国产成人午夜片在线观看高清观看| 香蕉av在线| 久久伊人色综合| 视频一区二区国产| 91成人福利在线观看| 中文字幕精品—区二区| 亚洲午夜极品| 九七伦理97伦理| 亚洲色图色老头| 激情丁香综合| 裸体免费网站| 欧美巨猛xxxx猛交黑人97人| 极品少妇一区二区三区| xx免费视频| 日韩三级成人av网| 三级影片在线观看欧美日韩一区二区| 中文字幕国内自拍| 中文字幕av一区二区三区谷原希美| 亚洲一级特黄| 在线观看视频色潮| 午夜精品三级视频福利| 国产成人免费在线视频| 国产激情在线视频| 91久久大香伊蕉在人线| 亚洲一区二区三区四区的 | 一女二男3p波多野结衣| 一个人www欧美| 日本特黄久久久高潮| 久草视频视频在线播放| 国产91色在线|免| 国产午夜精品一区二区三区嫩草 | 少妇高清精品毛片在线视频| 日韩国产精品一区| 嫩草成人www欧美| 免费黄色片在线观看| 日韩av大片免费看| 国产精品国产三级国产aⅴ原创| 精品自拍视频| www.日本三级| 中文字幕在线观看亚洲| 国产一区二区视频在线| 福利写真视频网站在线| 欧美在线视频二区| 欧美电影影音先锋| 99精品国产在热久久婷婷| 国产高清在线看| 国产精品伊人日日| 欧美自拍丝袜亚洲| 一区二区三区国产精华| 日本福利在线观看| 666精品在线| 欧美日韩一区高清| 亚洲中字在线| 变态调教一区二区三区| 欧美一区二区福利| 精品国产亚洲一区二区三区在线观看| 国产精品久久久久久久免费软件| 欧美三级电影一区二区三区| 精品国产一二| 欧美精品一区二区三区视频| 九一久久久久久| 欧美成人免费全部网站| 国产精品无码一本二本三本色| 久久久久久国产精品久久| 亚洲人成影院在线观看| 欧美日韩一区二区三区视频播放| 伊人色综合久久| 久久精品午夜一区二区福利| 日韩av在线高清| 久久久久国产免费免费| 久久91麻豆精品一区| 永久在线免费观看| 精品午夜一区二区| 亚洲免费一在线| 欧美国产日韩亚洲一区| 久久国产综合| 激情在线视频播放| 久久精品免费一区二区| 97精品一区二区视频在线观看| 欧美日韩国产一区二区| 欧美专区一区二区三区| 日韩成人在线电影| 日本一二三区视频免费高清| av观看久久| 国产亚洲精品美女久久久久| 亚洲欧洲日韩在线| 翔田千里一区二区| 国产精品视频一区视频二区| 116美女写真午夜一级久久| 蜜桃传媒一区二区| 在线观看欧美日韩| 亚洲久草在线视频| 久久字幕精品一区| 午夜视频一区二区在线观看| 国产剧情在线观看| 一区二区传媒有限公司| 成人黄色免费网站在线观看| 亚洲激情视频网站| 亚洲乱码国产乱码精品精可以看 | 一区二区三区加勒比av| 午夜一区在线| 精品99re| 国产黄色在线播放| 久久婷婷国产精品| 5g国产欧美日韩视频| 国产一区二区三区在线看| 亚洲乱码国产乱码精品精的特点| 久久精品女人天堂| 美女久久99| 欧洲成人一区| 生活片a∨在线观看| 亚洲第一狼人区| 亚洲国产精品一区二区第一页 | 成人黄色免费电影| 亚洲欧美日韩不卡一区二区三区| 欧美性一区二区三区| 亚洲成人黄色网址|