JavaScript覆盖率统计实现

更新时间:2023-06-13 00:55:19 阅读: 评论:0

JavaScript覆盖率统计实现
主要需求
1、 ⽀持browr & nodejs
秋天来了手抄报因为javascript既可以在浏览器环境运⾏,也可以在nodejs环境运⾏,因此需要能够统计两种环境下单元测试的覆盖率情况。
2、 透明、⽆缝
⽤户写单元测试⽤例的时候,不需要为了⽀持覆盖率统计多写代码,之前写的⽤例⽆需修改就可以直接统计覆盖率情况。
原理
javascript覆盖率的相关⽂章⽐较少,下⾯的图是通过阅读开源javascript覆盖率⼯具及开源测试框架的覆盖率插件得出的。javascript覆盖率统计的核⼼思想是,在源代码相应的位置注⼊统计代码,当代码运⾏之后,根据统计代码统计的数据确定程序运⾏的路径,最终⽣成覆盖率统计报告。
1. 转换(ins tr um e nt)
使⽤开源⼯具对源代码进⾏语法分析⽣成语法树
在语法树相应的位置注⼊统计代码,在程序执⾏到这个位置的时候对相应的全局变量赋值,确保执⾏之后能够根据全局变量知道代码的执⾏流程使⽤开源⼯具根据注⼊之后的语法树⽣成对应的javascript代码,即转换之后的代码(instrumented code)
注:这⾥进⾏语法分析的好处是,针对书写不规范的代码(⽐如⼀⾏多个语句),依然能够很好统计出分⽀覆盖和组合覆盖等信息。
2. 执⾏(r un)
这⼀步需要先载⼊转换后的代码:
nodejs:直接通过对require语句进⾏hook来⽆缝实现,后⾯会详细介绍
浏览器环境:需要将转换后的代码传给浏览器。如果是karma之类的带rver的测试框架,需要通过socket传输⾄浏览量器,执⾏完之后再将包含覆盖率信息的执⾏结果传回rver,⽣成测试报告
然后执⾏单元测试,产⽣的统计信息会挂在全局变量this下⾯。对于浏览器环境,this就是window,⽽对于nodejs环境this就是global。
3. ⽣成报告(r e p or t)
这⼀步会根据全局标量中的覆盖率信息⽣成特定格式的报告,如html、lcov、cobertura、teamcity等。
⼀个例⼦
qq墙//source code
function abs(num){
if(abs > 0)
return num;
el山水诗有哪些
return -num;
}
//instrumented code
var __cov_iypKC$dWI6uJFmvxThycaA = (Function('return this'))();
if (!__cov_iypKC$dWI6uJFmvxThycaA.__coverage__) { __cov_iypKC$dWI6uJFmvxThycaA.__coverage__ = {}; }
合作成语
__cov_iypKC$dWI6uJFmvxThycaA = __cov_iypKC$dWI6uJFmvxThycaA.__coverage__;
if (!(__cov_iypKC$dWI6uJFmvxThycaA['/Urs/lonfee88/Codes/testframe/coverage-jasmine-istanbul-karma/abs.js'])) {
__cov_iypKC$dWI6uJFmvxThycaA['/Urs/lonfee88/Codes/testframe/coverage-jasmine-istanbul-karma/abs.js'] = {"path":"/Urs/lonfee88/Codes/testframe/cover }
__cov_iypKC$dWI6uJFmvxThycaA = __cov_iypKC$dWI6uJFmvxThycaA['/Urs/lonfee88/Codes/testframe/coverage-jasmine-istanbul-karma/abs.js'];
function abs(num){__cov_iypKC$dWI6uJFmvxThycaA.f['1']++;__cov_iypKC$dWI6uJFmvxThycaA.s['2']++;if(abs>0){__cov_iypKC$dWI6uJFmvxThycaA.b['1' nod e.js集成覆盖率
通过hook可以直接⽆缝的加载转换后的代码,可以对下⾯两种语句进⾏hook:
require词字
对require进⾏hook的代码是通过对Module._extensions['.js']进⾏赋值实现的:
function hookRequire(matcher, transformer, options){
options = options || {};
var fn = transformFn(matcher, transformer, options.verbo),
postLoadHook = options.postLoadHook &&
typeof options.postLoadHook === 'function' ? options.postLoadHook : null;
温暖作文600字
文化活动有哪些Module._extensions['.js'] = function(module, filename){
var ret = adFileSync(filename, 'utf8'), filename);制作包装盒
if (ret.changed) {//载⼊instrument之后的代码并运⾏
module._de, filename);
} el {//载⼊原来的代码并运⾏
originalLoader(module, filename);
}
if (postLoadHook) {
postLoadHook(filename);
}
};
}
hook使覆盖率的集成变得简单,甚⾄不需要写代码,⽐如Mocha的覆盖率集成,只需要改⽤如下的调⽤⽅式即可:
istanbul cover _mocha -- -R spec test/spec
浏览器集成覆盖率
浏览器集成覆盖率就稍微⿇烦⼀点,好在istanbul提供了:
1. 转换代码(调⽤istanbul的Instrumenter接⼝)
2. 将instrumented code发送到浏览器(⾃⼰实现)
3. 将包含覆盖率信息的执⾏结果发回rver(⾃⼰实现)
4. 根据返回的覆盖率信息⽣成覆盖率报告(调⽤istanbul的Reporter接⼝)

本文发布于:2023-06-13 00:55:19,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1035824.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:覆盖率   统计   代码   信息   需要   开源   能够
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图