当前位置:   article > 正文

做组件测试时,如何统计测试覆盖率?_vue cypress 代码覆盖率

vue cypress 代码覆盖率

 

背景

在使用 cypress 做组件测试时遇到一个问题,如何统计组件测试的覆盖率?

根据 cypress 关于覆盖率的介绍,cypress 并不提供这个功能,建议通过 nyc 这个库或通过babel插件 babel-plugin-istanbul 在编译时集成到项目中。

  1. Cypress does not instrument your code - you need to do it yourself. The golden standard for JavaScript code instrumentation is the battle-hardened Istanbul and, luckily, it plays very nicely with the Cypress. You can instrument the code as a build step through one of two ways:
  2. Using the nyc module - a command-line interface for the Istanbul library
  3. As part of your code transpilation pipeline using the babel-plugin-istanbul tool.

其实这两种方式都是基于 Istanbul 实现的, 同时 cypress 提供了一个插件 @cypress/code-coverage 来收集 Istanbul instrument 生成的结果。

对于没有接触过 Istanbul 的我来说,看的有点晕,本文主要是记录下在使用 cypress 对 vue 进行组件测试时,如何进行覆盖率统计。

cypress coverage

进行代码覆盖统计有三步,instrument/collect/report(插桩、收集、展示)。

先给结论:

1、通过 vite-plugin-istanbul 进行 instrument;

2、通过 @cypress/code-coverage 进行收集;

3、通过 nyc 进行数据展示。

下面展开讲一下为什么这么选择和各个方案的实践。

instrument

instrument 的方式挺多的,暂时只对 cypress 推荐的两种方式进行尝试和实现。

1、对完成编译打包的文件进行 instrument,比如使用 nyc 进行 instrument。

  1. // 将 vite 打包后的dist目录拷贝到coverage目录,将新目录打包的js进行 instument(区分测试目录和实际打包目录,这里根据自己需求做就好了)
  2. npm run build // 打包
  3. cp -r ./dist ./coverage // 复制出来做测试
  4. npx nyc instrument ./dist ./coverage // 进行 instrument

执行了 instrument 后可以查看输入目录 coverage 已生成了 instrument 后的代码(后面再聊如何收集)。

2、动态 instrument,使用对应插件进行动态 instrument,比如vite-plugin-istanbul(需要注意区分development/production):

  1. // vite.config.js
  2. import { defineConfig } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. import istanbul from 'vite-plugin-istanbul';
  5. // https://vitejs.dev/config/
  6. export default defineConfig({
  7. build: {
  8. sourcemap: true
  9. },
  10. plugins: [
  11. vue(),
  12. istanbul({
  13. include: 'src/*',
  14. exclude: ['node_modules'],
  15. extension: ['.js', '.ts', '.vue'],
  16. requireEnv: false,
  17. forceBuildInstrument: false
  18. })
  19. ]
  20. })

或者使用babel插件 babel-plugin-istanbul 进行动态instrument,但我目前基本都使用vite来构建项目,暂时不去了解 babel 插件的使用了。

collect

完成了 instrument 后,会在页面其实已生成了 window.coverage 对象,并根据代码执行情况更新覆盖率。

在我项目的组件测试中,cypress 是通过 vite 来启动测试服务的,cypress的配置如下:

  1. // cypress.config.ts
  2. import { defineConfig } from "cypress"
  3. export default defineConfig({
  4. component: {
  5. devServer: {
  6. framework: "vue",
  7. bundler: "vite",
  8. }
  9. }
  10. });

所以我在项目根目录下的 vite.config.ts 配置进行 intrument 即可,然后通过 @cypress/coverage 插件进行 coverage 数据收集: 

  1. // cypress.config.ts
  2. import { defineConfig } from "cypress"
  3. import task from '@cypress/code-coverage/task'
  4. export default defineConfig({
  5. component: {
  6. devServer: {
  7. framework: "vue",
  8. bundler: "vite",
  9. },
  10. setupNodeEvents(on, config) {
  11. task(on, config)
  12. // include any other plugin code...
  13. // It's IMPORTANT to return the config object
  14. // with any changed environment variables
  15. return config
  16. }
  17. },
  18. video: false
  19. });
注:如果需要coverage .vue后缀文件,可以通过命令行或者 .nycrc 文件增加 extension 配置,比如: 
  1. // .nycrc
  2. {
  3. "extension": [
  4. ".js",
  5. ".ts",
  6. ".vue"
  7. ]
  8. }

report

通过 nyc report 命令进行展示,默认是 text 输出,可以在命令行或者配置文件进行配置。

nyc report --reporter=lcov --reporter=text // 输出 text 并在默认 coverage 目录生成html展示文件

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号