[技术博客]JSCover+selenium获得js代码覆盖率
本文档讲解了我们是如何使用JSCover来获得Selenium的测试样例的js代码文件的执行覆盖率的。
事实上网上有挺多博客讲这玩意儿了,不过完全按照网上已有的教程去弄的的话,并无法满足我们的需要。
参考链接:
- https://www.cnblogs.com/bhlsheji/p/4
- https://stackoverflow.com/questions/9495625/selenium-is-there-any-js-javascript-code-coverage-tool-which-we-can-integrate
- http://tntim96.github.io/JSCover/manual/manual.xml
工具介绍
Selenium
浏览器自动化测试工具。可以模拟用户对浏览器的操作,从而起到自动化测试的效果。具体怎么用,网上一堆教程,不赘述了。
selenium会在测试样例的编写中被使用,我们还会使用selenium的executeScript调用JSCover提供的hook来保存覆盖率数据。
JSCover
js代码覆盖率检测工具。原理是插桩js代码,该项目在github上开源,它也有托管在github上的官网。附带一提,根据我的使用经验来看,有问题不要查百度、也不要查它的user manual,而是应该查github上的issue。
JSCover我们只使用它的JSCover-all.jar
文件,下下来以后就拿出来这个就行了。
原理性流程
- 使用JSCover对js代码进行插桩,使得我们能够获得代码覆盖率。
- 对插桩后的代码执行测试样例。
- 将各测试样例的代码覆盖率导出保存起来。
- 合并各测试样例的代码覆盖率
- 使用合并后的代码覆盖率文件生成测试报告
流程示意图
实际流程的分步讲解
0. 预准备jscoverage.js
这一步是因为jscover自身存在的问题,原因之后再讲解。总之先得在不启用local-storage的情况下对代码进行一次插桩,得到jscoverage.js
。
示例指令:java -Dfile.encoding=UTF-8 -jar JSCover-all.jar -fs D:/code_origin D:/code_instrumented
-Dfile.encoding=UTF-8
:设定编码,避免网页代码中的中文在插桩后变成乱码。-jar JSCover-all.jar
:指定JSCover-all.jar
的所在路径。-fs
:指定使用文件插桩模式。我们只使用该模式,除此之外还有proxy模式,不过我们不使用,原因见最下。D:/code_origin
和D:/code_instrumented
:前者为原来的js代码文件所在的目录,后者为想把插桩后的代码保存到的目录。
执行完上述指令后,应该就能在插桩后的代码的所在目录(也就是示例中的D:/code_instrumented
)中找到jscoverage.js
文件,将它保存到一个合适的地方,留待之后使用。
1. 代码插桩
代码插桩分为两部分,一部分是给网页的js代码文件插桩,使得执行时能够得到覆盖率变量。另一部分是在测试样例的执行末尾利用selenium提供的executeScript调用JSCover提供的hook,这本质就是个动态插桩的过程,它使得我们能够保存下来覆盖率数据。
网页的js代码文件插桩
示例指令:java -Dfile.encoding=UTF-8 -jar JSCover-all.jar -fs --local-storage D:/code_origin D:/code_instrumented
事实上,它和上一步“预准备”中的指令的差别仅在于--local-storage
而已。local-storage
的含义是“是否启用HTML5的local-storage功能来保存代码覆盖率变量”。如果不启用的话,JSCover就会用一个js变量来保存代码覆盖率变量,而众所周知,js变量是无法跨页面的,这也就导致每当我们切换页面时,代码覆盖率变量就会丢失。所以我们需要启用local-storage
来保存代码覆盖率变量。
不过JSCover在local-storage
模式下生成的jscoverage.js
文件存在bug,所以我们在上一步“预准备”时需要先在非local-storage
下生成一个jscoverage.js
文件。这个文件仅仅是用来显示测试报告用的,不会影响到代码覆盖率数据。
hook调用
这一部分可以参考参考链接3(官方手册)中的做法。官网代码的python版:
json_str = driver.execute_script("return jscoverage_serializeCoverageToJSON();")
之后将json_str保存成jscoverage.json
,然后放到插桩后的代码所在目录下,覆盖掉原来的jscoverage.json
文件就行了。
不过因为官网这种做法是一个类一个jscoverage.json
,一个类在selenium中就表示一类测试样例,而我们有好多好多类测试样例,所以就会有好多好多代码覆盖率文件jscoverage.json
。所以我们需要在执行时分别保存它们,在全部执行完后再合并它们。合并会在后面再讲解。
假设我们有三个Selenium的测试类,分别将叫TC_A, TC_B, TC_C。那我们可以生成类似以下的一个目录结构
- coverage
- TC_A
- jscoverage.json
- TC_B
- jscoverage.json
- TC_C
- jscoverage.json
这仅仅只需要在保存json_str时操作一下就行了,不再赘述。
2. 执行测试样例
这一部分和平时一模一样,仅仅需要注意要执行插桩后的网页代码文件,而不是插桩前的。
3. 合并代码覆盖率文件
在执行测试样例后,一切正常的话,就能得到类似在第一步中描述的那样的代码覆盖率文件的目录结构了:
- coverage
- TC_A
- jscoverage.json
- TC_B
- jscoverage.json
- TC_C
- jscoverage.json
示例指令: java -cp JSCover-all.jar jscover.report.Main --merge coverage/* D:/code_instrumented
coverage/*
:也就是上述的目录结构的顶层目录的路径。D:/code_instrumented
:合并后的代码覆盖率文件的保存目录。我们直接指定为插桩后的代码的所在目录,省去手动覆盖的麻烦。
注意,如果只有一个jscoverage.json的话,是无法使用上述指令进行合并的,毕竟只有一个,JSCover会报错。这时候请手动复制那唯一一个jscoverage.json
,覆盖掉原来的jscoverage.json
。
4. 生成测试报告
把我们在“预准备”时搞到的jscoverage.js
翻出来,然后覆盖掉插桩后的代码所在目录下的jscoverage.js
,再修改一下它,将jscoverage_isReport
改为true:
var jscoverage_isReport = true;
最后打开jscoverage.html
即可。可能会啥都没,这时候你打开浏览器的控制台看看报啥错吧,例如chrome的话,通常而言都是Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
,然后百度百度解决一下,或者换个浏览器再试试,或者自己改改jscoverage.html
,都行。我是最后直接用Edge打开了。
最后应该是这样子的:
点开一个文件的话,就能看见哪些行被覆盖了,哪些没有:
不使用JSCover的Proxy模式的原因
Proxy模式要方便很多,可以省去插桩网页代码的步骤。因为proxy模式下,jscover会截获所有浏览器的发包和收包,对于所有发过来的js文件,它都会自动进行插桩。
不过因为JSCover的Proxy模式需要修改浏览器代理。而我们目前的本地测试环境使用了Fiddler作为浏览器代理,这两个代理冲突了,也就只能二选一,所以我们没有使用JSCover的Proxy模式,不过要是你的项目不使用浏览器代理来搭建本地测试环境,可以考虑用用JSCover的proxy模式,真的方便很多。
[技术博客]JSCover+selenium获得js代码覆盖率的更多相关文章
- [转]有哪些值得关注的技术博客(Java篇)
有哪些值得关注的技术博客(Java篇) 大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...
- 创建GitHub技术博客
创建GitHub技术博客全攻略 githubio技术博客网站生成 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字.本 ...
- 最值得收藏的java技术博客(Java篇)
第一个:java_my_life 作者介绍:找不到原作者信息.大概做了翻阅全部是2012年的博客. 博客主要内容:主要内容是关于Java设计模式的一些讲解和学习笔记,在相信对学习设计模式的同学帮助很大 ...
- Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 v4
Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 1. 原则 2 1.1. 有深度, 有广度 2 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...
- Atitit.如何文章写好 论文 文章 如何写好论文 技术博客
Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 1. 原则 1 1.1. 有深度, 有广度 1 1.2. 业务通用性有通用性 尽可能向上抽象一俩层..业务通用性与语言通用性. 2 ...
- 创建GitHub技术博客全攻略【转】
本文转载自:http://blog.csdn.net/renfufei/article/details/37725057/ 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比 ...
- 技术人如何利用 github+Jekyll ,搭建一个独立免费的技术博客
上次有人留言说,技术博客是程序员的标配,但据我所知绝大部分技术同学到现在仍然没有自己的技术博客.原因有很多,有的是懒的写,有的是怕写不好,还有的是一直想憋个大招,幻想做到完美再发出来,结果一直胎死腹中 ...
- [技术博客]海报图片生成——小程序canvas画布
目录 背景介绍 canvas简介 代码实现 难点讲解 圆角矩形裁剪失败之PS的妙用 编码不要过硬 对过长的文字进行截取 真机首次生成时字体不对 drawImage只能使用本地图片 背景介绍 目标:利用 ...
- 【技术博客】基于JsPlumb和JQuery-UI的流程图的保存和再生成
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. 基于JsPlumb和JQuery-UI的流程图的保存和再生 ...
随机推荐
- Java 之 多线程
一.并发与并行 1.并发 指两个或多个事件在同一时间段内发生. 2.并行 指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这 ...
- CDA数据分析实务【第一章:营销决策分析概述】
一.营销概述 营销是关于企业如何发现.创造和交付价值以满足一定目标市场的需求,同时获取利润的学科.营销学用来辨识未被满足的需求,定义,度量目标市场的规模和利润潜力,找到最合适企业进入的细分市场和适合该 ...
- ubuntu用samba来实现和虚拟机的文件共享
1.安装samba sudo apt install -y samba sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak 2.创建文件夹并修改权限 ...
- CentOS操作系统内核升级
一.升级内核(带aufs模块,记住一定要升级,要不然会出现很多莫名奇怪的问题,建议用yum安装) 1.yum安装带aufs模块的3.10内核(或到这里下载kernel手动安装:http://down. ...
- Httpd服务入门知识-Httpd服务常见配置案例之ServerSignature指令选项
Httpd服务入门知识-Httpd服务常见配置案例之ServerSignature指令选项 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ServerSignature指令概述 ...
- 如何测试Web服务.2
-->全文字数:2700,需要占用你几分钟的阅读时间 ,您也可以收藏后,时间充足时再阅读- -->上一节讲了<Web服务基础介绍>,本节介绍可用于测试web服务的开源测试工具. ...
- Matplotlib同时绘制多张图片
我现在有一组图片,一共100张图片,每张大小是200*200,即imgs.shape=100*200*200*3 (注意通道数在最后一维). 我需要同时绘制这100张图片,而且每张图片需要写上对应的名 ...
- 洛谷P2495 [SDOI2011]消耗战(虚树dp)
P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...
- DT系统开发之-在线询盘信息的调取实现
调用标签 <!--{tag("table=message&condition=status=3 and typeid=1&areaid=$cityid&cati ...
- flutter 中的样式
flutter 中的样式 样式 值 width 320.0 height 240.0 color Colors.white,Colors.grey[300] textAlign TextAlign.c ...