测试覆盖率 istanbul 绕过 window 变量存储覆盖率数据

骷髅弓箭手 · 2020年06月18日 · 1732 次阅读

参考文章:
https://testerhome.com/topics/23698
https://testerhome.com/topics/8919

WEB 端部分完全参照了这两篇文章的内容。
大体上还是沿用了 RN 的覆盖率方法,在这里就不再赘述,有兴趣的请移步上文的链接。

起因

公司的项目使用的是 WEEX,而不是 RN。
WEEX 有一个地方和 RN 非常不一样,就是在移动平台,window 变量被禁用了
具体在这里:https://weex.apache.org/zh/guide/platform-difference.html
所以,直接使用 window 去存储覆盖率数据会失败。
那没得说,只好找一个新的变量去取代 window 做存储。

结果

中间当然走了很多弯路,但是也没什么值得说的,直接上结果。
当前是在 src 目录增加一个 person_global.js 文件,里面只有一个空的字典。

// src/person_global.js
export const p_global = {}

然后在所有插桩后的 JS 文件中,修改文件内容。
修改文件内容我使用的是 python 脚本,毕竟比较顺手。

// 任意插桩后的JS文件
import { p_global } from '@/person_global' //新增
function cov_1kb7rxg7li() {
  var path = "/home/app/src/api/api.js";
  var hash = "7332365d3e2a48aa04ad78999bdebfefc3a21e3a";
  // var global = new Function("return this")(); 这是原有的代码
  var global = p_global //新增
  var gcv = "__coverage__";

这样的话,就能把覆盖率数据的存储变量从 window 变为 p_global。
至于具体里面的数据是怎么存储的,大家可以自己去试一试,我只能说,JS 的字典是真的灵活。
做完这些后,只需要在 APP 的首页文件中加上以下代码。

// APP.vue
import { p_global } from '@/person_global'
var stream = weex.requireModule('stream')

export default {
  created(){
    stream.fetch({
      method: 'POST',
      url: 'http://10.96.2.20:8889/coverage/client',
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify(p_global.__coverage__)
    }, function(ret) {
      if (ret.ok) {
        console.log('[Coverage] upload success')
      }
      else {
        console.log('[Coverage] upload failed')
      }
    })
  }
}

我并没有使用定时上传的方式,而是选择了每次加载首页的时候才会触发上传,总之只是策略不同而已。

因为网上相关的资料非常少,所以这里做一个记录吧,希望可以帮到一些同学。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册