vue单元测试入门

Posted web 开发学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue单元测试入门相关的知识,希望对你有一定的参考价值。

由于公司业务需求,需要对项目写单元测试。虽然之前没做过,也不能对领导说我不会,怎么办,迎男而上呗,作为一个有追求的程序员,理念是搞定一切需求。好在一点,项目我来了之后重新重构了一下,目录结构清晰多了。一个好的项目,测试一定是容易的。

 本篇简短记录一下整个测试过程中踩到坑,,目前讲单元测试的文章比较少,做个总结,同时也给后来人指个路,各位大神写的不对的地方,欢迎后台留言赐教。

先简单介绍一下项目,项目是用vue + element-ui 构建的中后台管理系统。脚手架用的vue-cli2.* ,之前建的项目,也不想折腾升级。测试框架在对比了 jest 和 mocha 后选择了jest。jest 是基于jasmine的框架,集成度高,功能全面,配置简单。为什么是这两大框架,因为它们是主流框架,vue 脚手架内置了这两个单元测试框架,在新建项目时根据自己需求选择。两大框架对比图如下:

vue单元测试入门

在使用vue脚手架创建项目时选择unit -> jest ,最终会在项目目录下生成test测试文件夹,并且带了一些基本的单元测试配置. 默认 test/unit 文件下所有以 .spec.js结尾的文件都是测试用例。test/unit 文件下有两个重要的配置文件:jest.conf.js 和 setup.js 文件 , jest.conf.js 是 jest 的配置文件,setup.js文件是测试的入口文件,下面介绍下这两个文件。

1jest.conf.js 主要配置 :

先上代码再释义

const path = require('path')

module.exports = {
  rootDir: path.resolve(__dirname, '../../'),
  moduleFileExtensions: [
    'js',
    'json',
    'vue',
    'jsx'
  ],
  moduleNameMapper: {
    '^vue$''vue/dist/vue.common.js',
    '^@/(.*)$''<rootDir>/src/$1'
  },
  transform: {
    '^.+\.js$''<rootDir>/node_modules/babel-jest',
    '.*\.(vue)$''<rootDir>/node_modules/vue-jest'
  },
  transformIgnorePatterns: [
    '<rootDir>/node_modules/(?!(countup.js/dist/|echarts/src/|zrender/src/))'
  ],
  testPathIgnorePatterns: [
    '<rootDir>/test/e2e',
    '<rootDir>/node_modules/'
  ],
  setupFilesAfterEnv: ['mock-local-storage'],
  snapshotSerializers: ['<rootDir>/node_modules/jest-serializer-vue'],
  setupFiles: ['<rootDir>/test/unit/setup'],
  // mapCoverage: true,
  coverageDirectory: '<rootDir>/test/unit/coverage',
  collectCoverageFrom: [
    'src/**/*.{js,vue}',
    '!src/main.js',
    '!src/router/index.js',
    '!**/node_modules/**'
  ]
}


moduleFileExtensions:模块文件扩展名,需要注意的是如果项目用了jsx文件,记得要把扩展名加上。

moduleNameMapper: 模块别名,在webapck中定义的别名要在这定义一遍。

transform:定义需要转换的文件正则及对应工具。

transformIgnorePatterns: 定义忽略转换的正则,这个要注意,默认node_modules文件夹下的依赖不会转换,后边正则括号里的 ?! 很重要,意思是除了括号里的要转换,其他的都不转换,如果依赖里有没有编译的es6模块需要将目录加进去,否则测试的时候会因为不识别es6模块报错。

说到这有必要给大家看下babel配置,

{
  "presets": [
    ["env", {
      "modules"false,
      "targets": {
        "browsers": ["> 1%""last 2 versions""not ie <= 9"]
      }
    }],
    "stage-2"
  ],
  "plugins": ["transform-vue-jsx""transform-runtime""@babel/plugin-syntax-dynamic-import"],
  "env": {
    "test": {
      "presets": ["env""stage-2"],
      "plugins": ["transform-vue-jsx""transform-es2015-modules-commonjs""dynamic-import-node"]
    }
  }
}

其中 env -> test -> plugins -> transform-es2015-modules-commonjs是必须的。是将es6模块转换为commonjs模块。还有一点需要注意,在修改了babel 或 jest.conf.js配置后,一定要在测试命令后面加上 --no-cache 清除缓存,默认是缓存的,笔者修改了配置后怎么都不生效,都快调哭了,直到有一天发现,昨天修改的项目第二天跑不起来了,才想到是缓存原因。,项目单元测试跑顺了,再启用缓存,提高测试速度。

testPathIgnorePatterns: 配置忽略的测试路径,如果有些文件不想测试,可以放到这个里面

setupFilesAfterEnv: 这个是配置单元测试前的环境,mock-local-storage 插件是为了解决项目localStorage及 sessionStorage问题的,测试用例跑在node环境,需要模拟一些浏览器环境的API,这是解决方案之一。

snapshotSerializers: 快照测试,具体看vue官方文档单元测试

setupFiles: 指定jest安装文件,即入口文件,这里需要说明的是 在项目中用的UI依赖要在这里引入一下,不然测试的时候会报没有注册相关的组件。

参考配置如下:

import Vue from 'vue'
import ElementUI from 'element-ui'
import BaseIcon from '@/components/base/base_icon.vue'

Vue.use(ElementUI)

Vue.config.productionTip = false
Vue.component('base-icon', {BaseIcon})

coverageDirectory: 输出测试覆盖率报告目录,jest 集成了 Isstanbul 覆盖率工具,跑完测试用例后自动生成覆盖率报告,这个是很不错的。

collectCoverageFrom: 收集覆盖率的目录

这些都是基本的配置,及踩坑指南,测试用例的编写这里就不再赘述了,参照文档相信大家都能做到,由于项目的不同,在写单元测试时会遇到不一样的问题,最终找到解决的思路才是最重要的。

最后放上文档链接:

jest文档:https://jestjs.io/zh-Hans/ 

vue官方文档:https://cn.vuejs.org/v2/guide/unit-testing.html

有问题的也欢迎大家扫下面二维码加入群聊交流。


以上是关于vue单元测试入门的主要内容,如果未能解决你的问题,请参考以下文章

vue 单元测试入门

vue单元测试入门

Vue 的单元测试入门三UniApp的View组件测试

Egg.js 单元测试入门

前端技术 | vue-cli “从入门到放弃”

VS2010单元测试入门实践教程