公司项目组使用jscoverage对被测试过的js文件作代码覆盖率检测。上一个tag的代码,jscoverage运行的好好的。到了新的tag,由于工程文件作了调整,js源代码文件所在路径改动较大,导致jscoverage页面上始终无法显示各个js文件的覆盖率。前两天我依照jscoverage文档的介绍,自己实现了一个小的demo,通过这个过程,搞清楚了jscoverage使用中的各文件之间相互关系,解决了项目组的问题。
官网用户手册:jscoverage user manual
1. 最简单的模型就是一个html文件,一个js文件。
我使用的文件如下:
-->src debug.bat --> dst
--> host.html ==> --> jscoverage.html
--> dummy.js --> host.html
--> dummy.js(instrumented)
这里的调用关系就是,jscoverage.html -> host.html -> dummy.js(instrumented). JsCoverage 通过在指定的JS文件中对于每一行有效语句加入标签,从而在相关网页运行过后得到一个%覆盖率。
debug.bat:
@echo off
RD D:\DevCode\jsCoverage\dst /S /Q
D:\DevCode\jscoverage\jsCoverage.exe D:\DevCode\jscoverage\src D:\DevCode\jscoverage\dst\ --encoding=utf-8
运行该bat之后,可以生成上述dst文件夹。接下来,启动jscoverage.html. 官方的User Manager建议使用IIS创建一个web链接,而不是直接html双击打开,原因在于目前的浏览器对于文件url可能有些安全性的限制,细节可查官网用户手册。
jscoverage.html运行如下:

此时选择Summary 标签页,可以看到dummy.js代码中目前被运行过的部分:

点击dummy.js链接,可调到Source标签页看到每行被注入位置的原文件:

显然,此时53%的覆盖率很准确。回到Browser标签页,再点击其他的radio button, Summary页中的覆盖率会立即更新,直至100%
2. 公司项目中的实际情况要复杂一些。但是文件间相互路径关系并没变
.bat
--> runUT.html ==> --> jsCoverage.html
--> runUT.html
--> srcUT --> srcUT
--> dummyUT.js --> dummyUT.js
--> src --> src
--> dummy01.js --> dummy01.js(instrumented)
--> dummy02.js --> dummy02.js(instrumented )
由于jscoverage.html启动之后,UT case是runUT.html进行调用的,注意这里xxxUT.js和xxx.js的相对路径保持不变。我们的.bat将完成如下工作:
1. 将runUT.xml所在目录整体复制生成新的文件夹
2. 去除其中无用的文件文件夹(.svn)
3. 标明那些被复制但不注入行位置锚记的文件 (xxxUT.js)
具体各选项见jscoverage.exe --help
JSCoverage是个方便统计js代码覆盖率的工具,非常适合集成进build server作定时地监测。