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

“覆蓋率檢測”的實現原理,就這?

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

[[429164]]

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

 

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

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

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

原理探究

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

測試代碼如下: 

我們執行 istanbul 的 instrument 命令:

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

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

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

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

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

上面還有一段代碼:

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

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

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

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

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

函數插樁

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

istanbul 確實也是這么做的。

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

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

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

我們分別來看下:

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

istanbul 初始化了全局的 coverState 對象用于統計:

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

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

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

分支、語句、函數的插樁

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

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

statement 插樁:

function 插樁:

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

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

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

require hook 實現透明無感知的函數插樁

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

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

istanbul 也是這么做的:

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

總結

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

看完之后,是不是覺得:

覆蓋率檢測的實現,就這?

 

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2022-05-31 09:01:18

SwiftApp 項目

2024-04-01 08:26:30

單測覆蓋率字節碼

2019-09-25 09:20:41

谷歌代碼開發者

2022-03-29 11:32:32

單元測試覆蓋率框架

2011-11-01 10:10:48

ScriptCover

2023-10-27 08:49:00

JCovOpenJDK

2022-10-21 15:29:32

5G網絡

2021-12-25 22:30:27

Chrome DevTJavaScript調試工具

2012-04-11 11:21:57

ibmdw

2022-08-25 06:27:39

vivoJaCoCo代碼覆蓋率

2019-09-30 10:27:52

變異測試評估

2018-02-27 14:50:20

大數據公廁城市

2021-04-22 06:13:41

Express 中間件原理中間件函數

2011-04-25 09:49:20

代碼測試

2012-09-21 10:30:56

Linux項目代碼覆蓋率

2024-06-14 12:04:33

2015-11-09 17:56:57

WebPHP函數覆蓋

2016-01-13 10:14:15

WebPHP函數覆蓋

2022-07-22 07:38:31

監控系統

2022-05-13 09:40:51

代碼可行應用性能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级二级视频 | 色婷婷久久久久swag精品 | 国产一区二区三区久久久久久久久 | 国产一级视频在线观看 | 亚洲最大福利网 | 欧美精品综合在线 | 精品三级在线观看 | 成人精品一区二区 | 色在线免费视频 | 久久亚洲国产精品日日av夜夜 | 久久久久久综合 | 在线黄色影院 | 狠狠的干狠狠的操 | 男人的天堂久久 | 久久精选 | 亚洲国产精品一区二区三区 | 久久9精品 | 久久鲁视频 | 欧美日韩国产高清 | 成人在线视频免费观看 | 女女百合av大片一区二区三区九县 | 日韩一区二区三区在线 | 一级欧美 | 亚洲精品久久久久久一区二区 | 婷婷国产一区二区三区 | 欧美精品综合在线 | 日韩二 | 一区二区三区四区av | 99精品99 | 久久99精品久久久 | 午夜视频免费 | 精品综合| 欧美三级在线 | 性高湖久久久久久久久 | 91精品国产色综合久久 | 欧美一区二区三区一在线观看 | 成人毛片在线视频 | 久久久性色精品国产免费观看 | 成人一区二区三区在线观看 | 国产精品久久久久久久久久 | 精品在线一区 |