karma+webpack搭建vue单元测试环境的方法示例


Posted in Javascript onMay 24, 2018

最近做了一次关于vue组件自动化测试的分享,现在将vue组件单元测试环境搭建过程整理一下。这次搭建的测试环境和开发环境隔离,所以理论上适用所有使用vue的开发环境。

准备

这篇文章的重点在于搭建测试环境,所以我随便写了个webpack的vue开发环境。

代码地址:https://github.com/MarxJiao/vue-karma-test

目录结构如下

karma+webpack搭建vue单元测试环境的方法示例

目录结构

app.vue和child.vue代码

karma+webpack搭建vue单元测试环境的方法示例

app.vue

karma+webpack搭建vue单元测试环境的方法示例

child.vue

运行效果如下:

 karma+webpack搭建vue单元测试环境的方法示例

运行效果

测试环境搭建

注意:这里使用的是webpack 1.x的版本,后面有介绍webpack 2+版本的配置,思路大同小异。

安装karma

因为karma是要在命令中运行的,所以先安装karma-cli:npm install -g karma-cli

安装karma:npm install karma --save-dev

在项目根目录执行:karma init

这时会提示使用的测试框架,我们可以使用键盘的上下左右来选择框架,有jasmine、mocha、qunit、nodeunit、nunit可供选择,如果想用其他框架也可以自己填写。这里我们使用jasmine作为测试框架,jasmine自带断言库,就不用引入其它的库了。

karma+webpack搭建vue单元测试环境的方法示例

选择框架

之后提示是否使用require.js,这里我们不使用。

karma+webpack搭建vue单元测试环境的方法示例

use require.js

选择浏览器,可以多选。单元测试只需要能运行js的环境就好了,不需要界面,所以我们选择PhantomJS。注意PhantomJS需要提前安装在电脑上,phantomjs安装包。嫌麻烦的话选择chrome最方便了。

karma+webpack搭建vue单元测试环境的方法示例

选择浏览器

填写测试脚本存放位置,支持通用匹配。我们放在test/unit目录下,并以.spec.js结尾。

karma+webpack搭建vue单元测试环境的方法示例

脚本文件

这时会提示没有匹配的文件,因为我们还没开始写测试用例,所以先忽略。

karma+webpack搭建vue单元测试环境的方法示例

提示没匹配到文件

是否有需要排除的符合前面格式的问文件?直接跳过。

karma+webpack搭建vue单元测试环境的方法示例

排除文件

是否让karma监控所有文件,并在文件修改时自动执行测试。因为是搭环境阶段,我们先选no。

karma+webpack搭建vue单元测试环境的方法示例

是否开启watch

之后按回车,我们就能看到在项目根目录已经生成了karma的配置文件karma.conf.js。

 karma+webpack搭建vue单元测试环境的方法示例

目录

安装依赖

执行上面的操作可以看到karma为我们安装了如下依赖,karma-jasmine是karma的jasmine插件,karma-phantomjs-launcher是打开phantomjs的插件

karma+webpack搭建vue单元测试环境的方法示例

karma自己安装的依赖

测试框架选择jasmine,安装jasmine-core

使用webpack打包vue组件,需要安装webpack、karma-webpack、vue-loader、vue-template-compiler、css-loader

使用bable处理ES6语法,安装babel-core、babel-loader、babel-preset-es2015

执行:npm install --save-dev jasmine-core webpack karma-webpack vue-loader vue-template-compiler css-loader babel-core babel-loader babel-preset-es2015

修改配置文件

先在karma.conf.js顶部引用webpack

karma+webpack搭建vue单元测试环境的方法示例

karma.conf.js

在配置项中加入webpack配置

karma+webpack搭建vue单元测试环境的方法示例

karma.conf.js

在预处理选项中添加webpack处理的文件。这里我们用webpack处理测试用例。

karma+webpack搭建vue单元测试环境的方法示例

karma.conf.js

编写第一个测试

编写一个测试用例来运行,我们先测试下app.vue文件加载后title值是否符合预期。新建test文件夹,test文件夹下建立unit文件夹,unit文件夹下建立app.spec.js文件。目录结构如下:

karma+webpack搭建vue单元测试环境的方法示例

目录

app.spec.js内容如下

karma+webpack搭建vue单元测试环境的方法示例

test/unit/app.spec.js

在当前目录打开命令行,输入karma start,这时karma会启动一个服务来监听测试。

karma+webpack搭建vue单元测试环境的方法示例

karma start

不要关闭当前命令窗口,再打开一个命令窗口,输入karma run,这时我们会看到测试通过的提示。

karma+webpack搭建vue单元测试环境的方法示例

karma run

查看测试覆盖率

单元测试属于白盒测试,测试覆盖率也是测试指标之一。karma提供了karma-coverage来查看测试覆盖率。

安装karma-coverage:npm install karma-coverage --save-dev

配置覆盖率,在预处理的文件上加coverage

karma+webpack搭建vue单元测试环境的方法示例

karma.conf.js

在报告中使用coverage

karma+webpack搭建vue单元测试环境的方法示例

karma.conf.js

配置覆盖率报告的查看方式

karma+webpack搭建vue单元测试环境的方法示例

karma.conf.js

再次执行karma start和karma run,我们能看到生成了覆盖率查看文件夹

karma+webpack搭建vue单元测试环境的方法示例

目录

在浏览器中打开上图中的index.html我们能看到覆盖率已经生成。

karma+webpack搭建vue单元测试环境的方法示例

index.html

点击「unit/」我们看到app.spec.js代码有3036行,测试覆盖率是打包之后文件的覆盖率,

karma+webpack搭建vue单元测试环境的方法示例

unit/index.html

点开文件,果然是打包之后的代码。这个覆盖率显然不是我们想要测试的源文件的覆盖率。

karma+webpack搭建vue单元测试环境的方法示例

unit/app.spec.js

怎么办呢?想想开发时浏览器打开的也是编译后的文件,我们怎么定位源码呢?

Bingo! sourcemap。

当然这里只用sourcemap是不够的,测试覆盖率神器isparta闪亮登场。

安装:npm install --save-dev isparta isparta-loader

修改vue的js loader

karma+webpack搭建vue单元测试环境的方法示例

karma.conf.js

再次执行karma start和karma run,我们能看到测试覆盖率文件已经能找到源文件了,并且覆盖率只有js代码,并不包括无关的template和style,简直太好用了有没有。

karma+webpack搭建vue单元测试环境的方法示例

index.html

karma+webpack搭建vue单元测试环境的方法示例

src/index.html

karma+webpack搭建vue单元测试环境的方法示例

src/app.vue.html

等等,怎么还有那个3000多行的文件,这个覆盖率没有用,能去掉吗?答案是肯定的。我们只需要把karma.conf.js中preprocessors的coverage去掉即可。

karma+webpack搭建vue单元测试环境的方法示例

karma.conf.js

再次执行karma start和karma run,我们能看到覆盖率的文件变成这样了。

karma+webpack搭建vue单元测试环境的方法示例

index.html

最后我们可以把karma的watch模式打开,之后只需要运行karma start就能监控文件变动并自动执行测试了。

karma+webpack搭建vue单元测试环境的方法示例

karma.conf.js

至此karma+webpack搭建的vue单元测试环境就已经ready了。

文章图片较多,略显拖沓,不妥之处欢迎吐槽,欢迎拍砖。

关于如何写测试脚本,请看这篇文章Vue单元测试case写法。

更新webpack2

以上内容基于webpack 1.x 版本,如果使用webpack 2以上版本的话,需要将isparta-loader换成istanbul-instrumenter-loader,并使用karma-coverage-istanbul-reporter 生成测试报告。配置方法:https://github.com/MarxJiao/vue-karma-test/blob/webpack2/karma.conf.js

相关链接

Karma官网

Vue Unit Testing

isparta loader

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
什么是JavaScript
Aug 13 Javascript
五个jQuery图片画廊插件 推荐
May 12 Javascript
EditPlus注册码生成器(js代码实现)
Mar 25 Javascript
js跑步算法的实现代码
Dec 04 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
Apr 17 Javascript
jQuery提示效果代码分享
Nov 20 Javascript
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
EasyUI的TreeGrid的过滤功能的解决思路
Aug 08 Javascript
vue监听对象及对象属性问题
Aug 20 Javascript
详谈Object.defineProperty 及实现数据双向绑定
Jul 18 Javascript
vue路由结构可设一层方便动态添加路由操作
Aug 31 Javascript
Node.js文本文件BOM头的去除方法
Nov 22 Javascript
react实现点击选中的li高亮的示例代码
May 24 #Javascript
浅谈Webpack 是如何加载模块的
May 24 #Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
May 24 #jQuery
详解javascript中的变量提升和函数提升
May 24 #Javascript
JavaScript轮播停留效果的实现思路
May 24 #Javascript
vue2单元测试环境搭建
May 24 #Javascript
Vue+mui实现图片的本地缓存示例代码
May 24 #Javascript
You might like
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
2017/06/09 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
python发送HTTP请求的方法小结
2015/07/08 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
介绍一下grep命令的使用
2012/06/28 面试题
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
四种会话跟踪技术
2015/05/20 面试题
企业理念标语
2014/06/09 职场文书
酒店餐厅2014重阳节活动策划方案
2014/09/16 职场文书
协议书格式模板
2016/03/24 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书
python基础入门之字典和集合
2021/06/13 Python