测试覆盖率 如何收集 nodejs 服务端的测试覆盖率(Nodejs)

清水 · 2021年07月09日 · 最后由 清水 回复于 2021年07月31日 · 7208 次阅读

@zsx10110 大佬,求指导,我们的产品后端是用 Nodejs 开发的,用的 express,而且是采用了微服务模式。现在我们想通过 E2E 的 UI 测试用例来收集对服务端代码的测试覆盖率。在您的那篇长文中我有看您有提到,具体该怎么操作,有比较详细的参考文档么。

共收到 20 条回复 时间 点赞

首先说实话我并没有做过 nodejs 为后台的覆盖率,因为我们这边的实际场景都是 node 只是一个代理转发的逻辑,所以基本都没有针对 nodejs 这块来做覆盖率。
再来说下我觉得可能能够帮助到你的一些信息
你可以看下这个库, 它里面有可运行的 demo 了,而且也说明有 server 端的例子。你可以看下。 因为我之前也只是跑过 demo 所以了解的不多
istanbul-middleware

另外一个是 nyc
这个库我用的比较多,不过 nodejs 这块我没有尝试过,下来我这边试试看 是否可以通过 nyc 插桩得到 nodejs 的覆盖率数据

清水 · #22 · 2021年07月09日 Author
仅楼主可见
saii 回复

期待大佬尝试后的指导。

清水 回复

嗯, 刚才试了下了,结果是可以的, 我就以使用 nyc 举例了,因为 istanbul-middleware 的方式也是可以的,而且看 readme 也很简单了

我写了一个 demo, 你自己可以访问去试验下 nyc-expresss-coverage-demo
这里使用的例子其实是istanbul-middleware test 目录的例子,只是我将其中关于 instalbul-middleware 库的引用都去掉了,增加了 nyc 的引用

  1. npm install 安装依赖库
  2. npm run instrument 对服务的代码进行插桩,生成一个插桩后的目录 server-instrument
  3. node index 启动服务, 这个时候服务引用的文件其实是 server-instrunment 的文件了,因为我在 index.js 里面将内容做了指定了。
  4. 直接访问 http://localhost:8888 即可看到服务网页的内容,其实就是开始我们的测试了。
  5. 再访问 http://localhost:8888/coverageData 就可以得到覆盖率数据

  6. 我们先麻烦点,将对应的数据放置到根目录的 .nyc_output 的 a.json 文件中,这里的文件名称可以随意。

  7. nyc run report 就会看到在 coverage 目录下生成了一个覆盖率的报告了。

当然,这里有麻烦的地方就是需要自己去拷贝覆盖率的数据对吧,这个问题倒是不难,自己写一个第三方的库,然后做个定时任务,定时去上报全局变量中的coverage的变量给到真正处理覆盖率数据的后台就可以了。

清水 #19 · 2021年07月10日 Author
saii 回复

👍 👍 👍 感谢大佬指导,讲解的很清楚,单个服务的时候可以拿到了,但是实际项目中我们是微服务模式而且用了 docker,端口应该是做了映射,serverip+server.js 中指定的端口目前不能访问,等周一去问开发他们的映射后真正对外端口后再试试看,感谢大佬的耐心详细指导。

saii 回复

你可以写一个完整的解决方案,放在社区里开源诶

恒温 回复

恒温大佬的建议真的太好了,期待一个完美的完整解决方案问世😄

恒温 回复

那可以考虑改造下 istanbul-middleware 看看,我找时间试试 😀

saii 回复

赞,社区可以给部分支持~

10楼 已删除
清水 #11 · 2021年07月12日 Author
saii 回复

我好像大概知道点 istanbul-middleware 所谓运行中打桩的用法了

清水 回复

嗯,我觉得他挺适合 node 后台的

清水 #13 · 2021年07月14日 Author
saii 回复

我尝试通过的也只是本地跑的 demo,不知道在微服务架构下该如何解决,期待大佬的成果

清水 #14 · 2021年07月23日 Author
saii 回复

大侠,想问一下,Istanbul-middleware 给的例子中,是从 app 目录下的 index.js 调用 server 文件夹下面的 index.js,我有尝试把两个文件合并为一个文件来运行,可是即使能运行也不能拿到覆盖率数据(运行中打桩而不是事先打桩的情况)。大侠有空的时候能帮忙看看是否可以合并成一个文件啊?

清水 回复

你能提供下 你合并后的是什么样的吗,另外为什么说拿不到覆盖率数据呢

清水 #16 · 2021年07月26日 Author
saii 回复

我合并后的文件是这样的:


我后来还是没有合并成一个文件,而是把两个文件放到了同一个目录下。

22楼 已删除
saii 回复

这个截图是按照顺序的

@ 清水 来个 github 仓库地址 如何,我试试看,因为截图内容好多,看的有点乱

仅楼主可见
清水 #22 · 2021年07月31日 Author
saii 回复

https://github.com/zxytest/Istanbul-middleware-Demo/blob/main/test/app/README.md
这个是我本地尝试成功的一个 demo,把 Istanbul-middleware 作为结果展示和收集的一个服务端,然后在 case 中获取覆盖率数据并发给服务端展示,只是一个简单的模式运行,希望可以抛砖引玉,能有更好的解决方案。

saii 关于 nodejs 覆盖率的探索 中提及了此贴 08月08日 23:41
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册