最近再为团队团队选择可行的测试方案。前端目前是vue-cli技术栈。试着在vue项目添加测试。把测试完整的方案记录下来。

vue官网给的例子用的是karma + mocha + chai。

karma:Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner)。
mocha:mocha是一个基于nodejs和浏览器集合的各种特性的JavaScript测试库。
chai:chai是一个基于nodejs的断言库,并且完美支持各种主流的JavaScript测试框架。。

新建项目

Vue2.0安装环境不说了我们选择简易版生成vue项目

vue init webpack-simple npm-karma

目录结构

 <template><div><h1>{{title}}</h1></div></template><script>export default {data () {return {title: 'hello world'}}}</script>

安装karma

全局安装karma-cli

npm install karma-cli -g

进入项目目录下执行

karma init

这里选择vue推荐的mocha,根据上下键来进行选择,然后回车就好。

这里选择no

这里选择phantomJS,注意PhantomJS需要提前安装在电脑上,当然选择Chrome更方便

填写测试脚本存放位置,支持通用匹配。我们可以后面手动填写。选择空,回车

是否有需要排除的符合前面格式的问文件,选择空,回车

选择自动监测测试。选择yes

接下来项目根路径会有一个karma.config.js文件。

安装依赖
这时候我们的项目中的依赖如下:

我们已经选择了mocha作为测试库,还需要安装mocha和karma-mocha

浏览器选择了phantomjs,这里我们还需要安装 karma-phantomjs-launcher

使用webpack打包,还需要安装karma-webpack,extract-text-webpack-plugin

使用chai作为断言库,需要安装chai、sinon-chai、sinon、karma-sinon-chai

npm install karma-webpack karma-mocha chai sinon-chai sinon karma-sinon-chai karma-phantomjs-launcher extract-text-webpack-plugin mocha –save-dev

修改配置
karma配置中需要引入webpack配置,我们新建一个专门配置的文件夹存放所需的配置,

如下图,在项目根目录下新建了一个config文件夹

webpack.test.config.jsvar path = require("path")
var webpack = require("webpack")
var ExtractTextPlugin = require('extract-text-webpack-plugin')function resolve(dir) {return path.join(__dirname, '..', dir)
}var webpackConfig = {module: {rules: [// babel-loader{test: /\.js$/,use: 'babel-loader',include: [resolve('src'), resolve('test')]},// vue loader{test: /\.vue$/,use: [{loader: 'vue-loader',options: {loaders: {js: 'babel-loader'},}}]},// css loader{test: /\.css$/,use: ExtractTextPlugin.extract({use: 'css-loader',fallback: 'vue-style-loader'})},// img loader{test: /\.(png|gif|jpe?g)(\?\S*)?$/,use: [{ loader: 'url-loader' }]},// font loader{test: /\.(eot|woff|woff2|ttf|svg)(\?\S*)?$/,use: [{ loader: 'url-loader' }]},]},resolve: {extensions: ['.js', '.vue', '.json'],alias: {'vue$': 'vue/dist/vue.esm.js','@': resolve('src'),}},plugins: [new webpack.DefinePlugin({'process.env': {NODE_ENV: '"production"'}})]
}module.exports = webpackConfig

karma.conf.js 引入webpack配置,修改了preprocessors配置

var webpackConfig = require('./config/webpack.test.config.js');module.exports = function(config) {config.set({// 基础路径,用在files,exclude属性上basePath: '',// 测试框架// 可用的框架:https://npmjs.org/browse/keyword/karma-adapterframeworks: ['mocha','sinon-chai'],// 需要加载到浏览器的文件列表files: ['./test/**/*.spec.js'],// 排除的文件列表exclude: ['./test/**/*.spec.js'],// 在浏览器使用之前处理匹配的文件// 可用的预处理: https://npmjs.org/browse/keyword/karma-preprocessorpreprocessors: {'./test/**/*.spec.js': ['webpack']},//  使用测试结果报告者//  可能的值: "dots", "progress"//  可用的报告者:https://npmjs.org/browse/keyword/karma-reporterreporters: ['progress'],//  服务端口号port: 9876,//webpack配置webpack: webpackConfig,// 启用或禁用输出报告或者日志中的颜色colors: true,// 日志等级// 可能的值: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUGlogLevel: config.LOG_INFO,//启用或禁用自动检测文件变化进行测试autoWatch: true,// 测试启动的浏览器// available browser launchers: https://npmjs.org/browse/keyword/karma-launcherbrowsers: ['PhantomJS'],// 开启或禁用持续集成模式// 设置为true, Karma将打开浏览器,执行测试并最后退出singleRun: false,// 并发级别(启动的浏览器数)concurrency: Infinity})
}

package.json 运行npm run test 可以启动测试

{"name": "npm-karma","description": "A Vue.js project","version": "1.0.0","author": "Zero-su <345469066@qq.com>","license": "MIT","private": true,"scripts": {"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot","build": "cross-env NODE_ENV=production webpack --progress --hide-modules","test": "karma start ./karma.conf.js"},"dependencies": {"vue": "^2.5.11"},"browserslist": ["> 1%","last 2 versions","not ie <= 8"],"devDependencies": {"babel-core": "^6.26.0","babel-loader": "^7.1.2","babel-preset-env": "^1.6.0","babel-preset-stage-3": "^6.24.1","chai": "^4.1.2","cross-env": "^5.0.5","css-loader": "^0.28.7","extract-text-webpack-plugin": "^3.0.2","file-loader": "^1.1.4","karma": "^2.0.2","karma-mocha": "^1.3.0","karma-phantomjs-launcher": "^1.0.4","karma-sinon-chai": "^1.3.4","karma-webpack": "^3.0.0","mocha": "^5.2.0","sinon": "^5.0.10","sinon-chai": "^3.1.0","vue-loader": "^13.0.5","vue-template-compiler": "^2.4.4","webpack": "^3.12.0","webpack-dev-server": "^2.9.1"}
}

执行 npm run test

看到如下界面

然后打开http://localhost:9876/

就成功了,然后开始写测试代码

测试代码编写
之前karma.conf.js配置了匹配文件

 preprocessors: {'./test/**/*.spec.js': ['webpack']
},

在项目根目录下新建test文件夹,再在里面新建specs文件夹,之后的测试代码文件就在这里面写,注意文件名要以.spec.js结尾。

项目文件结构如下

hello.spec.js

import Vue from 'vue'
import hello from '@/components/hello.vue'describe('hello', () => {it('hello world', () => {var vm = new Vue(hello).$mount();expect(vm.title).to.equal('hello world')})
})

保存之后会自动更新,

控制台上看到这个就成功辣。

查看测试覆盖率
Istanbul 是 JavaScript 程序的代码覆盖率工具。

webpack的Loader处理器 istanbul-instrumenter-loader
测试覆盖率显示插件 karma-coverage-istanbul-reporter
执行

npm install istanbul-instrumenter-loader karma-coverage-istanbul-reporter –save-dev

修改配置

webpack.test.config.js

var webpackConfig = {module: {rules: [// babel-loader{test: /\.js$/,use: 'babel-loader',include: [resolve('src'), resolve('test')]},// 为了统计代码覆盖率,对 js 文件加入 istanbul-instrumenter-loader{test: /\.(js)$/,exclude: /node_modules/,include: /src|packages/,enforce: 'post',use: [{loader: "istanbul-instrumenter-loader",options: {esModules: true},}]},// vue loader{test: /\.vue$/,use: [{loader: 'vue-loader',options: {loaders: {js: 'babel-loader'},// 为了统计代码覆盖率,对 vue 文件加入 istanbul-instrumenter-loaderpreLoaders: {js: 'istanbul-instrumenter-loader?esModules=true'}}}]},// css loader{test: /\.css$/,use: ExtractTextPlugin.extract({use: 'css-loader',fallback: 'vue-style-loader'})},// img loader{test: /\.(png|gif|jpe?g)(\?\S*)?$/,use: [{ loader: 'url-loader' }]},// font loader{test: /\.(eot|woff|woff2|ttf|svg)(\?\S*)?$/,use: [{ loader: 'url-loader' }]},]},resolve: {extensions: ['.js', '.vue', '.json'],alias: {'vue$': 'vue/dist/vue.esm.js','@': resolve('src'),}},plugins: [new webpack.DefinePlugin({'process.env': {NODE_ENV: '"production"'}})]
}

karma.conf.js

var webpackConfig = require('./config/webpack.test.config.js');module.exports = function(config) {config.set({// 基础路径,用在files,exclude属性上basePath: '',// 测试框架// 可用的框架:https://npmjs.org/browse/keyword/karma-adapterframeworks: ['mocha','sinon-chai'],// 需要加载到浏览器的文件列表files: ['./test/**/*.spec.js'],// 排除的文件列表exclude: [],// 在浏览器使用之前处理匹配的文件// 可用的预处理: https://npmjs.org/browse/keyword/karma-preprocessorpreprocessors: {'./test/**/*.spec.js': ['webpack']},//  使用测试结果报告者//  可能的值: "dots", "progress"//  可用的报告者:https://npmjs.org/browse/keyword/karma-reporterreporters: ['coverage-istanbul'],//  服务端口号port: 9876,//webpack配置webpack: webpackConfig,// 启用或禁用输出报告或者日志中的颜色colors: true,// 日志等级// 可能的值: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUGlogLevel: config.LOG_INFO,//启用或禁用自动检测文件变化进行测试autoWatch: true,// 测试启动的浏览器// available browser launchers: https://npmjs.org/browse/keyword/karma-launcherbrowsers: ['PhantomJS'],// 开启或禁用持续集成模式// 设置为true, Karma将打开浏览器,执行测试并最后退出singleRun: false,// 并发级别(启动的浏览器数)concurrency: Infinity,coverageIstanbulReporter: {dir: './coverage',reports: ['text-summary', 'html'],fixWebpackSourcePaths: true},})
}

重新执行

npm run test

控制台可以清晰的看到

行覆盖率(Lines):是否每一行都执行了?
函数覆盖率(Functions):是否每个函数都调用了?
分支覆盖率(Branches):是否每个if代码块都执行了?
语句覆盖率(Statements):是否每个语句都执行了?
项目文件中会生成一个coverage文件

打开index.html文件

遇到的坑
cannot load ‘webpack’
刚开始按照别人的教程一步一步的,到之后karma start之后总是报错,找不到webpack,明明我是安装karma-webpack了啊,后来才发现karma start是相当于全局的,不是在项目下的,所以我再package.json里面加入了

"test": "karma start test/karma.conf.js"

然后执行npm run test就好了

全局安装karma安装不上
原因是我之前node安装了两次,然后环境路径没有配置对。重新改系统环境就好了。

参考

https://blog.csdn.net/qq_36045121/article/details/80454059
karma+webpack搭建vue单元测试环境
chai官网
github
https://github.com/Zero-su/vue-karma

vue-cli自动化测试karma + mocha + chai相关推荐

  1. 大前端的自动化工厂(5)—— 基于Karma+Mocha+Chai的单元测试和接口测试

    一. 前端自动化测试 大多数前端开发者对测试相关的知识是比较缺乏的,一来是开发节奏很快,来不及写,另一方面团队里也配备了"人肉测试机",完全没必要自己来.但随着项目体量的增大,许多 ...

  2. 前端单元测试-karma+mocha+chai

    一.概念普及 1.单元测试运行环境: 运行环境是集成一系列功能的工具,我们可以通过它来选择"测试框架".自动打开浏览器.查看测试结果等功能.我们可以把它近似的理解为vue的vue- ...

  3. 使用karma+mocha+chai为vue组件库做单元测试

    前言 单元测试,这一环节对我们的应用的重要性不言而喻,它能很大程度确保我们项目运行的健壮性.因此,前一段时间,笔者公司要求现有的vue搭建的npm组件库做单元测试.之前,笔者对单元测试做过了解,一直想 ...

  4. 前端新手使用karma+mocha+chai+sinon 进行angularjs 单元测试

    这里只谈如何搭建环境. 选型:在jasmine 和 mocha+chai中间比较了一下,根据项目需要选择了后者. 安装依赖包和环境 直接执行下列命令安装或在项目目录下 运行npm install(pa ...

  5. 搭建 vue2 单元测试环境(karma+mocha+webpack3)

    从网上找了很多例子关于单元测试,都是如何新建项目的时候的添加单元测试,用vue-cli中怎么添加,但是我的项目已经生成了,不能再一次重新初始化,这时如何添加单元测试,这里面遇到了好多坑,写在这里记录一 ...

  6. electron的单元测试(基于mocha+chai+karma)

    1. 最近有个接手在已有的(electron-vue)的项目中做单元测试,但是基于vue-electron脚手架搭建的项目的electron是2.0.4版本,而最新的electron已经升级到11版本 ...

  7. vue的自动化测试详解

    大厂视野 1.流量大 性能优化 2.项目复杂 源码 3.持续迭代 4.项目稳定运行 自动化测试 需求评审 开发 测试(人点)(可以使用自动化测试完成一部分) 上线 5.为什么要写测试呢 测试代码可读性 ...

  8. 前端测试 karma mocha should 都是什么鬼?

    测试TDD和BDD的区别 TDD是测试驱动开发,通过用测试用例来规范约束开发者,编写出质量更高的代码 BDD是行为驱动开发,描述行为路径,就像描述故事,产品和前线业务人员可参与到开发流程中,减轻测试和 ...

  9. vue cli 4 多环境_Vue 笔记整理19

    19.1 vue-cli起步 19.1.1 什么是vue-cli Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: - 通过 @vue/cli 搭建交互式的项目脚手架. - 通 ...

最新文章

  1. PLSQL_解析过程及硬解析和软解析的区别(案例)
  2. Silverlight C# 游戏开发:Flyer01开发一个有趣的游戏
  3. 在计算机中 鼠标器属于,在计算机中,鼠标器属于()。
  4. VS2012 生成项目报 Lc.exe已退出,代码为-1 错误
  5. 学习笔记:ORACLE 性能优化求生指南
  6. pat 乙级 1010 一元多项式求导(C++)
  7. 谁动过你的电脑?小姐姐们要学会保护好自己电脑里的小秘密呀
  8. 设计模式C++(Strategy策略模式)
  9. [GAMP学习笔记]计算STEC程序中遇到的一些问题小结
  10. 用友U8V10.1软件安装教程
  11. 各类杀软对应的进程名
  12. 33种著名汽车标志及来历
  13. 计算机设备不能正常启动怎么办,电脑没有找到可引导设备怎么办
  14. tc27x的内存保护MPU设置浅析(个人理解)
  15. 助力高效办公,TOM企业邮箱网页版全面升级
  16. java毕业实习报告范文3篇
  17. APUE读书笔记-第十一章-线程
  18. DedeCMS织梦为文章图片自动添加ALT标签
  19. Flash 实验 遮罩层
  20. Python使用高德地图绘制经纬度坐标位置

热门文章

  1. 【工作流】工作流快速入门
  2. Halcon 单目标定,畸变矫正,图像坐标系转世界坐标系
  3. 韶华易老,昔日往事诚可抛
  4. 一文读懂数据科学Notebook
  5. 第5节 树形计算亚式期权价格
  6. Visual Studio 2008的使用技巧
  7. 如何用Matlab在极坐标系下绘图并调整极坐标初始角位置
  8. PTA 互评成绩(sort函数)
  9. 量化选股——基于动量因子的行业风格轮动策略(第2部分—策略回测)
  10. iis 7 windows server 64bit