@zsx10110 大佬,求指导,我们的产品后端是用 Nodejs 开发的,用的 express,而且是采用了微服务模式。现在我们想通过 E2E 的 UI 测试用例来收集对服务端代码的测试覆盖率。在您的那篇长文中我有看您有提到,具体该怎么操作,有比较详细的参考文档么。
首先说实话我并没有做过 nodejs 为后台的覆盖率,因为我们这边的实际场景都是 node 只是一个代理转发的逻辑,所以基本都没有针对 nodejs 这块来做覆盖率。
再来说下我觉得可能能够帮助到你的一些信息
你可以看下这个库, 它里面有可运行的 demo 了,而且也说明有 server 端的例子。你可以看下。 因为我之前也只是跑过 demo 所以了解的不多
istanbul-middleware
另外一个是 nyc
这个库我用的比较多,不过 nodejs 这块我没有尝试过,下来我这边试试看 是否可以通过 nyc 插桩得到 nodejs 的覆盖率数据
嗯, 刚才试了下了,结果是可以的, 我就以使用 nyc 举例了,因为 istanbul-middleware 的方式也是可以的,而且看 readme 也很简单了
我写了一个 demo, 你自己可以访问去试验下 nyc-expresss-coverage-demo
这里使用的例子其实是istanbul-middleware test 目录的例子,只是我将其中关于 instalbul-middleware 库的引用都去掉了,增加了 nyc 的引用
npm install
安装依赖库npm run instrument
对服务的代码进行插桩,生成一个插桩后的目录 server-instrumentnode index
启动服务, 这个时候服务引用的文件其实是 server-instrunment 的文件了,因为我在 index.js 里面将内容做了指定了。再访问 http://localhost:8888/coverageData 就可以得到覆盖率数据
我们先麻烦点,将对应的数据放置到根目录的 .nyc_output 的 a.json 文件中,这里的文件名称可以随意。
nyc run report
就会看到在 coverage 目录下生成了一个覆盖率的报告了。
当然,这里有麻烦的地方就是需要自己去拷贝覆盖率的数据对吧,这个问题倒是不难,自己写一个第三方的库,然后做个定时任务,定时去上报全局变量中的coverage的变量给到真正处理覆盖率数据的后台就可以了。
感谢大佬指导,讲解的很清楚,单个服务的时候可以拿到了,但是实际项目中我们是微服务模式而且用了 docker,端口应该是做了映射,serverip+server.js 中指定的端口目前不能访问,等周一去问开发他们的映射后真正对外端口后再试试看,感谢大佬的耐心详细指导。
大侠,想问一下,Istanbul-middleware 给的例子中,是从 app 目录下的 index.js 调用 server 文件夹下面的 index.js,我有尝试把两个文件合并为一个文件来运行,可是即使能运行也不能拿到覆盖率数据(运行中打桩而不是事先打桩的情况)。大侠有空的时候能帮忙看看是否可以合并成一个文件啊?
@ 清水 来个 github 仓库地址 如何,我试试看,因为截图内容好多,看的有点乱
https://github.com/zxytest/Istanbul-middleware-Demo/blob/main/test/app/README.md。
这个是我本地尝试成功的一个 demo,把 Istanbul-middleware 作为结果展示和收集的一个服务端,然后在 case 中获取覆盖率数据并发给服务端展示,只是一个简单的模式运行,希望可以抛砖引玉,能有更好的解决方案。