成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[429164]]

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

 

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

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

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

原理探究

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

測(cè)試代碼如下: 

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

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

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

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

我們來(lái)格式化一下,把變量名替換下。

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

上面還有一段代碼:

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

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

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

為了不和別的全局變量沖突,這個(gè)對(duì)象的名字是隨機(jī)生成的,比如 __cov_5ZoEXQ_Hbo27uXArxdm2oA,這里為了簡(jiǎn)化改為了 AAA。

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

函數(shù)插樁

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

istanbul 確實(shí)也是這么做的。

下面是 istanbul 的源碼(只看紅線(xiàn)標(biāo)出的位置就行):

就是通過(guò) esprima(js parser)來(lái)把代碼 parse 成 AST,然后對(duì) AST 進(jìn)行插樁。

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

我們分別來(lái)看下:

初始化全局對(duì)象的代碼插樁

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

做插樁的時(shí)候會(huì)記錄信息到這個(gè) coverState 中:

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

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

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

對(duì)不同 AST 的插樁,就是遍歷過(guò)程中根據(jù)類(lèi)型做不同的處理:

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

statement 插樁:

function 插樁:

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

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

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

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

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

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

istanbul 也是這么做的:

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

總結(jié)

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

看完之后,是不是覺(jué)得:

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

 

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

2022-05-31 09:01:18

SwiftApp 項(xiàng)目

2024-04-01 08:26:30

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

2019-09-25 09:20:41

谷歌代碼開(kāi)發(fā)者

2022-03-29 11:32:32

單元測(cè)試覆蓋率框架

2011-11-01 10:10:48

ScriptCover

2023-10-27 08:49:00

JCovOpenJDK

2022-10-21 15:29:32

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

2021-12-25 22:30:27

Chrome DevTJavaScript調(diào)試工具

2012-04-11 11:21:57

ibmdw

2022-08-25 06:27:39

vivoJaCoCo代碼覆蓋率

2019-09-30 10:27:52

變異測(cè)試評(píng)估

2018-02-27 14:50:20

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

2021-04-22 06:13:41

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

2011-04-25 09:49:20

代碼測(cè)試

2024-06-14 12:04:33

2012-09-21 10:30:56

Linux項(xiàng)目代碼覆蓋率

2015-11-09 17:56:57

WebPHP函數(shù)覆蓋

2022-07-22 07:38:31

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

2016-01-13 10:14:15

WebPHP函數(shù)覆蓋

2022-05-13 09:40:51

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

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

主站蜘蛛池模板: 国际精品鲁一鲁一区二区小说 | 人人操日日干 | 免费精品 | 一级a性色生活片久久毛片 午夜精品在线观看 | 成人国产精品久久久 | 成人一区av偷拍 | 伊人精品一区二区三区 | 亚洲网址在线观看 | 欧美日韩专区 | 欧美一区二区在线观看 | 国产精品1区2区3区 国产在线观看一区 | 久久精品国产一区二区电影 | 国产精品久久久久久久7777 | 超碰人人做 | 黄网站涩免费蜜桃网站 | 亚洲精选一区二区 | 亚洲精品在线看 | 亚洲精品一区二区三区中文字幕 | 亚洲国产看片 | 日韩在线h | 国产精品久久久久国产a级 欧美日韩国产免费 | 久久精品免费观看 | 免费在线观看一级毛片 | 精品色 | 精品亚洲一区二区三区四区五区 | 视频一区 亚洲 | 一级毛片免费视频观看 | 久久久久国产精品 | 亚洲一区日韩 | 久久精品a级毛片 | 日本一二区视频 | 日本不卡免费新一二三区 | 蜜桃视频在线观看免费视频网站www | 一本色道精品久久一区二区三区 | 欧美9999| av片免费| 国产精品小视频在线观看 | 超碰天天| 国产成人精品免高潮在线观看 | 日韩一区中文字幕 | 亚洲激情一区二区 |