前端单元测试之Karma环境搭建

前言

在前端开发中,测试常常是被忽略的一环。因此最近在研究前端自动化测试框架Karma,把个人的学习过程分享出来,希望对大家有帮助。

什么是Karma?

Karma是由Google团队开发的一套前端测试运行框架。它不同于测试框架(例如jasmine,mocha等),运行在这些测试框架之上。主要完成一下工作:

Karma启动一个web服务器,生成包含js源代码和js测试脚本的页面;

运行浏览器加载页面,并显示测试的结果;

如果开启检测,则当文件有修改时,执行继续执行以上过程。

Karma的安装配置

初始项目结构


  1. karma-example 
  2.     ├── src 
  3.          ├── index.js 
  4.     ├── test 
  5.     ├── package.json  

index.js的内容如下


  1. function isNum(num) { 
  2.   if (typeof num === 'number') { 
  3.     return true 
  4.   } else { 
  5.     return false 
  6.   } 
  7. }  

安装Karma环境

为了方便搭建Karma环境,我们可以全局安装karma-cli来帮我们初始化测试环境:


  1. npm i -g karma-cli 

然后在项目中安装karma包


  1. npm i --save-dev karma 

接下来在工程目录中运行karma init来进行测试环境初始化,并按照指示一步步完成。

上图是选项的示例,这里使用jasmine测试框架,PhantomJS作为代码运行的环境(也可以选择其他浏览器作为运行环境,比如Chrome,IE等)。最后在项目中生成karma.conf.js文件。

至此就搭建好了基本的Karma运行环境。

运行Karma

在test目录里编写一个简单的测试脚本,我们使用的是jasmine测试框架,具体的api可以参考jasmine api,内容如下


  1. describe('index.js: ', function() { 
  2.   it('isNum() should work fine.', function() { 
  3.     expect(isNum(1)).toBe(true) 
  4.     expect(isNum('1')).toBe(false) 
  5.   }) 
  6. }) 

然后在项目根目录下运行karma start命令,我们可以看到运行的结果如下

可以看到,运行的结果显示测试成功。

同时,因为我们之前设置了监控文件的修改,所以当我们修改源文件或者测试脚本的时候,Karma会自动帮我们再次运行,无需我们手动操作。

Coverage

如何衡量测试脚本的质量呢?其中一个参考指标就是代码覆盖率(coverage)。

什么是代码覆盖率?简而言之就是测试中运行到的代码占所有代码的比率。其中又可以分为行数覆盖率,分支覆盖率等。具体的含义不再细说,有兴趣的可以自行查阅资料。

虽然并不是说代码覆盖率越高,测试的脚本写得越好(可以看看参考文献4),但是代码覆盖率对撰写测试脚本还是有一定的指导意义的。因此接下来我们在Karma环境中添加Coverage。

首先安装好Karma覆盖率工具


  1. npm i --save-dev karma-coverage 

然后修改配置文件karma.conf.js,


  1. module.exports = function(config) { 
  2.   config.set({ 
  3.     basePath: '', 
  4.     frameworks: ['jasmine'], 
  5.     files: [ 
  6.       'src/**/*.js', 
  7.       'test/**/*.js' 
  8.     ], 
  9.     exclude: [], 
  10.  
  11.     // modified 
  12.     preprocessors: { 
  13.         'src/**/*.js': ['coverage'] 
  14.     }, 
  15.  
  16.     //modified 
  17.     reporters: ['progress', 'coverage'], 
  18.  
  19.     // add 
  20.     coverageReporter: { 
  21.       type : 'html', 
  22.       dir : 'coverage/' 
  23.     }, 
  24.  
  25.     port: 9876, 
  26.     colors: true, 
  27.     logLevel: config.LOG_INFO, 
  28.     autoWatch: true, 
  29.     browsers: ['PhantomJS'], 
  30.     singleRun: false, 
  31.     concurrency: Infinity 
  32.   }) 
  33. }  

再运行karma start后,会在目录下生成coverage目录,里面有本次测试的覆盖报告。打开后的结果如下

使用Webpack+Babel

在实际项目中,有事会需要用到Webpack和ES6,所以接下来将Webpack和Babel集成进Karma环境中。

安装karma-webpack


  1. npm i --save-dev karma-webpack 

安装babel


  1. npm i --save-dev babel-loader babel-core babel-preset-es2015 

然后文件进行改造,src/index.js文件修改为


  1. function isNum(num) { 
  2.   if (typeof num === 'number') { 
  3.     return true 
  4.   } else { 
  5.     return false 
  6.   } 
  7.  
  8. exports.isNum = isNum  

text/index.js文件修改为


  1. const Util = require('../src/index') 
  2.  
  3. describe('index.js: ', () => { 
  4.   it('isNum() should work fine.', () => { 
  5.     expect(Util.isNum(1)).toBe(true) 
  6.     expect(Util.isNum('1')).toBe(false) 
  7.   }) 
  8. }) 

接下来修改配置文件karma.conf.js


  1. module.exports = function(config) { 
  2.   config.set({ 
  3.     basePath: '', 
  4.     frameworks: ['jasmine'], 
  5.     files: [ 
  6.       'test/**/*.js' 
  7.     ], 
  8.     exclude: [], 
  9.     preprocessors: { 
  10.       'test/**/*.js': ['webpack', 'coverage'] 
  11.     }, 
  12.     reporters: ['progress', 'coverage'], 
  13.     coverageReporter: { 
  14.       type: 'html', 
  15.       dir: 'coverage/' 
  16.     }, 
  17.     port: 9876, 
  18.     colors: true, 
  19.     logLevel: config.LOG_INFO, 
  20.     autoWatch: true, 
  21.     browsers: ['PhantomJS'], 
  22.     singleRun: false, 
  23.     concurrency: Infinity, 
  24.     webpack: { 
  25.       module: { 
  26.         loaders: [{ 
  27.           test: /\.js$/, 
  28.           loader: 'babel', 
  29.           exclude: /node_modules/, 
  30.           query: { 
  31.             presets: ['es2015'] 
  32.           } 
  33.         }] 
  34.       } 
  35.     } 
  36.   }) 
  37. }  

注意这里的修改:

  1. files只留下test文件。因为webpack会自动把需要的其它文件都打包进来,所以只需要留下入口文件。
  2. preprocessors也修改为test文件,并加入webpack域处理器
  3. 加入webpack配置选项。可以自己定制配置项,但是不需要entry和output。这里加上babel-loader来编译ES6代码

运行karma start,成功了~

再看看Coverage,卧槽。。居然不是百分之百了。。。

原因很简单,webpack会加入一些代码,影响了代码的Coverage。如果我们引入了一些其它的库,比如jquery之类的,将源代码和库代码打包在一起后,覆盖率会更难看。。这样的Coverage就没有了参考的价值。

还好有大神给我们提供了解决方案,需要安装插件


  1. npm i --save-dev babel-plugin-istanbul 

修改webpack中babel-loader的配置


  1.   test: /\.js$/, 
  2.   loader: 'babel', 
  3.   exclude: /node_modules/, 
  4.   query: { 
  5.     presets: ['es2015'], 
  6.     plugins: ['istanbul'] 
  7.   } 
  8. }  

因为这里引入了istanbul插件来检测Coverage,所以要把preprocessors里的coverage去掉。

搞定以后,运行karma start。当当当当~一切OK啦,尽情编写测试脚本把~

作者:没有角的牛

来源:51CTO

时间: 2024-08-01 09:07:40

前端单元测试之Karma环境搭建的相关文章

J2ee Servlet开发环境搭建全过程

环境:Windows sp3.Myeclipse 6.5 1.新建一个Web项目(New Web Porject),然后点"完成". 开发环境搭建全过程-j2ee开发环境搭建"> 2.在Cuzz项目下右击src>>new>>Servlet,创建一个Servlet,包名一定要写上."Name:"值以"Servlet"结尾,因为我们写一个登陆页面,为了更加安全选择doPost方法就行了,然后下一步. 3.下一步

windows下JAVA敏捷开发环境搭建步骤教程

  编程开发环境搭建还是挺重要的,第一步是先要搭建环境,有了环境才能开展工作.本文我们来看看windows下JAVA敏捷开发环境搭建步骤. 整个软件项目分为四个环境 开发本地环境.开发环境.测试环境.IDC环境.和传统C++开发不一样的模式是多了第一个开发本地环境.这是为什么呢,因为目前大部分开发人员还是比较熟悉windows下开发.对于mac和linux下直接使用软件并且开发的中国开发者还是少之又少,这套架构就这个现状做出来的.如下是环境搭建架构图: 从环境来说: 一.开发本地环境.开发集成服

node.js环境搭建教程

  Node.js是一个JavaScript运行环境,但是实际上他是多谷歌V8引擎进行封装,node对一些特殊的用例进行了优化,提供了API,让V8更加好的在非浏览器情况下运行,下面小编就为大家介绍一下node.js环境搭建教程 Node.js是一个事件驱动I/O服务端JavaScript环境.由于其拥有异步非阻塞.环境搭建简单.实践应用快等特性,使得其在新一代编程开发中更为流行.同时,由于Node.js 基于JavaScript语法,因此在学习Node.js时也可以了解和学习JavaScrip

Redux教程1:环境搭建,初写Redux

[序] 如果将React比喻成士兵的话,你的程序还需要一位将军,去管理士兵(的状态),而Redux恰好是一位好将军,简单高效: 相比起React的学习曲线,Redux的稍微平坦一些:本系列教程,将以"红绿灯"为示例贯穿整个demo,希望能让用户快速理解&学习Redux: 强烈推荐 Redux 中文文档,本redux教程所有的材料和思路都来源于此: 这个系列拆分成3篇文章,最后获得的效果图为: (这个是gif图,如果没动画请点击在新窗口打开) 红绿灯初始状态是 绿灯5s,继而循环

SSH框架总结(框架分析+环境搭建+实例源码下载)(转)

首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序.   集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据持久层和域模块层(实体层).   Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持.Spring一方面作为一个轻量级的IoC容器,负责查找.定位.创建和管

spring+springMVC+mybatis的框架项目基础环境搭建

上一个项目在后台用到spring+springMVC+mybatis的框架,先新项目初步需求也已经下来,不出意外的话,应该也是用这个框架组合. 虽然在之前activiti相关的学习中所用到的框架也是这个,但是当时重点在于实现activiti的功能,因此在环境搭建上也只是以能用为前提,与真实项目中所用的还是差了不少. 因此为了给接下来的项目做准备,今天便抽空练习了一下这个框架组合的搭建.虽然之前的框架都不是我来搭,接下来这个可能也不是让我搭,但记录下来说不定以后能用上,也或者对其他人有用. 那么进

交叉编译和交叉调试环境搭建及使用

交叉编译和交叉调试环境搭建及使用 1. 交叉编译器 1.1 交叉编译器介绍 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译.这个编译过程就叫交叉编译.简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(cross compiler). 1.2 搭建交叉编译环境  1.2.1 实验环境 交叉编译工具:arm-linux- 4.2.2 编译平台:ubuntu10.10 开发板类型:UT-S3C6410 1.2.2 搭

Java入门教程系列 – 开发环境搭建

原文http://go-learning.com/2012/05/23/java-gettingstart-1/ Java入门教程系列 – 开发环境搭建 Posted on 2012 年 5 月 23 日 by Johnny 在使用任何的计算机语言进行编程之前,你都需要搭建一个开发环境.简单的说,这个过程就是要安装一些开发 用的软件和进行相关的一些配置.每种计算机语言所需要的软件是不一样的,对于Java语言来说,你最少需要安装一个JDK (这是一个专有名称,要死记),JDK的全称叫 – Java

《C语言编程魔法书:基于C11标准》——第3章 C语言编程的环境搭建3.1 Windows操作系统下搭建C语言编程环境

第3章 C语言编程的环境搭建 我们在第2章讲述了学习C语言所必需的一些预备知识.本章将给大家介绍常用桌面操作系统下的C语言环境搭建.这里所讲述的C语言编译器以及集成开发环境(IDE)都是可合法免费下载的,本书不鼓励各位使用盗版或破解软件,所以下面会列出下载这些合法免费软件的官方链接,大家把编程环境搭建完之后即可上机实践编程. 3.1 Windows操作系统下搭建C语言编程环境 Windows操作系统下默认不自带任何C语言编译器,大家必须从网上下载自己所需要的C语言编译器.如果各位想通过C语言开发