前端单元测试框架-Mocha

简介:

随着前端工程化这一概念的产生,项目开发中前端的代码量可谓是‘急剧上升’,所以在这种情况下,我们如何才能保证代码的质量呢,对于框架,比如React、Vue,因为有自己的语法规则,及时每个开发人员的编码风格规范各不相同,但最终的产出都大同小异,代码质量差距不是很大;但对于一些基础类库或方法的开发,我们就要谨慎又谨慎,代码质量一定要高,尽量避免出现Bug。

那我们如何做到产出高质量代码呢?单元测试才是正解,俗话说‘跳过单元测试和不仔细过冒烟就交由QA测试的,就是在耍流氓’(这句话是我自己编的);Mocha是针对Javascript的单元测试工具,下面我们就来看看如何使用它

 

概念

Mocha: Javascript测试框架

chai:断言库,需配合Mocha使用

 

最简单的用法

步骤一:安装

假设我们是在已有项目中进行单元测试

安装Mocha

/*全局安装*/
$ npm install --global mocha  

/*局部安装*/
$ npm install --save-dev mocha

安装chai

/*局部安装*/
$ npm install --save-dev chai

 

全局与局部的区别:若是局部安装,依赖就会写入package.json的dependencies或devDependencies中,这样当别人从你的Github上克隆代码时,就不需要注意‘依赖包全不全啊’?‘还需不要安装其他依赖啊?’等等这类的问题,因为'npm install'会将所有依赖下载到本地

 

步骤二:编写Js源文件与测试文件

源文件

复制代码

// add.js
1 function add(x, y) {2   return x + y;3 }4 5 module.exports = add;

复制代码

测试文件

复制代码

 // add.test.js
 1 var add = require('./add.js'); 2 var expect = require('chai').expect; 3  4 describe('加法函数的测试', function() { 5   it('1 加 1 应该等于 2', function() { 6     expect(add(1, 1)).to.be.equal(2); 7   }); 8   it('1 加 -1 应该等于 0', function() { 9     expect(add(1, -1)).to.be.equal(0);10   });11 });

复制代码

 

步骤三:运行测试文件

$ mocha add.test.js

运行截图:

以上就是Mocha最简单的使用方式,细不细很简单啊O(∩_∩)O哈哈~,下面我们再看点进阶的

 

进阶之路

进阶一:describe和it是什么?

describe:"测试组",也称测试块,表示我要进行一系列测试,相当于一个group

it:"测试项",也称测试用例,表示这是"一系列测试"中的一项,相当于item,如何测试?测试逻辑?都是在it的回调函数中实现的

 

进阶二:什么?describe也有"生命周期"?

每个测试块(describe)有4个周期,分别是:

复制代码

 1 describe('test', function() { 2   // 在本测试块的所有测试用例之前执行且仅执行一次 3   before(function() { 4      5   }); 6   // 在本测试块的所有测试用例之后执行且仅执行一次 7   after(function() { 8      9   });10 11   // 在测试块的每个测试用例之前执行(有几个测试用例it,就执行几次)12   beforeEach(function() {13     14   });15   // 在测试块的每个测试用例之后执行(同上)16   afterEach(function() {17     18   });19   20   // 测试用例21   it('test item1', function () {22 23   })24 });

复制代码

 

进阶三:在进阶二中周期代码是ES6风格,需要安装babel模块转码

这里分两种情况:1.全局安装   2.局部安装

如果是全局方式安装的babel,那么我们也要使用全局的Mocha来调用babel-core模块

$ npm install -g babel-core babel-preset-es2015
$ mocha --compilers js:babel-core/register

但如果是局部方式安装的babel,那么我们就要使用局部的Mocha来调用babel-core模块

$ npm install --save-dev babel-core babel-preset-es2015
$ ../node_modules/mocha/bin/mocha --compilers js:babel-core/register

为什么呢?因为Mocha是根据自身的路径来寻找babel模块的,所以要全局对应全局,局部对应局部

这里少了很重要的一步:在测试之前,需要配置babel转码规则,在项目根目录,记住‘一定要是根目录’,新建.babelrc文件,这个文件是供babel使用的

// .babelrc{  "presets": [ "es2015" ] //这里制定使用es2015规则转码}

 

进阶四:测试还可以是异步的?

异步测试与普通测试有什么不同:测试用例的回调函数中多了一个参数done

复制代码

 1 var add = require('../src/add.js'); 2 var expect = require('chai').expect; 3  4 describe('加法函数的测试', function() { 5   // 异步测试 6   it('1 加 1 应该等于 2', function(done) { 7     var clock = setTimeout(function () { 8       expect(add(1, 1)).to.be.equal(2); 9       done(); // 通知Mocha测试结束10     },1000);11   });12 13   // 同步测试14   it('1 加 0 应该等于 1', function() {15     expect(add(1, 0)).to.be.equal(1);16   });17 });

复制代码

异步测试需要注意一点:必须手动调用done,否则该异步测试就会失败,见下方代码与运行截图:

代码:

复制代码

 1 var add = require('../src/add.js'); 2 var expect = require('chai').expect; 3  4 describe('加法函数的测试', function() { 5   // 异步测试 6   it('1 加 1 应该等于 2', function(done) { 7     var clock = setTimeout(function () { 8       expect(add(1, 1)).to.be.equal(2); 9       //done();我们不主动调用done,看看会发生什么?10     },1000);11   });12 13   // 同步测试14   it('1 加 0 应该等于 1', function() {15     expect(add(1, 0)).to.be.equal(1);16   });17 });

复制代码

运行截图:

从运行结果不难看出,测试用例1失败了,而且Mocha提示我们:如果是异步测试或钩子,那么一定要确保done方法被调用,否则测试就会失败,但并不会影响其他用例

那么,异步测试有哪些应用场景呢?那就是测试数据接口,我们可以这样:

复制代码

1 it('异步请求测试', function() {2   return fetch('https://api.github.com')3     .then(function(res) {4       return res.json();5     }).then(function(json) {6       expect(json).to.be.an('object'); // 测试接口返回的是否为对象类型的数据,也就是json格式7     });8 });

复制代码

 

进阶五:如果我们想只执行某个测试用例呢?或者除了某个用例,其他的都执行

Mocha有两个用例管理api:only和skip

1.如果只想执行某个用例,我们就用only方式调用它:

复制代码

 1 var add = require('../src/add.js'); 2 var expect = require('chai').expect; 3  4 describe('加法函数的测试', function() { 5   // 一个测试组中不是只能有一个only,可以有多个only方式执行的用例 6   it.only('1 加 1 应该等于 2', function() { 7     expect(add(1, 1)).to.be.equal(2); 8   }); 9 10 11   it.only('1 加 0 应该等于 1', function() {12     expect(add(1, 0)).to.be.equal(1);13   });14 15   // 但如果组内已经有了only,那么非only方式执行的用例就一定不会被执行,切记16   it('1 加 -1 应该等于 0', function() {17     expect(add(1, -1)).to.be.equal(0);18   });19 20 });

复制代码

运行截图:

可以看出,第三个用例并没有被执行

2.如果想跳过某个用例,我们就用skip方式调用它:

复制代码

 1 var add = require('../src/add.js'); 2 var expect = require('chai').expect; 3  4 describe('加法函数的测试', function() { 5  6   it('1 加 1 应该等于 2', function() { 7     expect(add(1, 1)).to.be.equal(2); 8   }); 9 10   // 同理,skip方式执行的用例在同一组内也可以有多个11   it.skip('1 加 0 应该等于 1', function() {12     expect(add(1, 0)).to.be.equal(1);13   });14 15 16   it.skip('1 加 -1 应该等于 0', function() {17     expect(add(1, -1)).to.be.equal(0);18   });19 20 });

复制代码

运行截图:

第2,3个用例被跳过了

 

本文转自  zddnd  51CTO博客,原文链接:
http://blog.51cto.com/13013666/1940098
相关文章
|
1月前
|
移动开发 前端开发 Android开发
mPaaS 常见问题之移动开发平台 mpaas的H5 前端 Kylin 框架引入vant后包特别大如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
42 0
|
1天前
|
Web App开发 IDE 测试技术
深入理解自动化测试框架Selenium的设计与实践
【4月更文挑战第27天】在软件开发周期中,确保代码质量和功能正确性至关重要。随着敏捷开发的普及和持续集成/持续部署(CI/CD)的实践,自动化测试已成为现代开发工作流程的核心部分。本文将探讨一个广泛使用的开源自动化测试工具——Selenium,并剖析其设计原理、架构以及在实际中的应用。我们将通过具体案例分析,展示如何有效利用Selenium进行跨浏览器测试,并讨论在真实环境中可能遇到的挑战及解决方案。
|
2天前
|
机器学习/深度学习 前端开发 JavaScript
探寻前端巨变:从HTML到现代框架的发展历程
探寻前端巨变:从HTML到现代框架的发展历程
11 2
|
2天前
|
前端开发 JavaScript Linux
relectron框架——打包前端vue3、react为pc端exe可执行程序
relectron框架——打包前端vue3、react为pc端exe可执行程序
8 1
|
8天前
|
Web App开发 JavaScript 前端开发
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第20天】 在软件测试领域,自动化测试已成为提升测试效率和确保产品质量的关键手段。Selenium作为一款广泛使用的开源自动化测试框架,其设计精巧且功能强大,为Web应用提供了一种灵活、高效的测试解决方案。本文将深入探讨Selenium的核心架构与实现细节,解析其如何通过模拟用户操作来执行测试用例,以及它如何适应不断变化的Web技术标准。通过对Selenium内部机制的剖析,旨在帮助测试工程师更好地掌握该工具,并在测试实践中发挥其最大效能。
|
9天前
|
监控 测试技术 数据安全/隐私保护
如何将代理IP集成到自动化测试框架中?
如何将代理IP集成到自动化测试框架中?
|
12天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
|
12天前
|
自然语言处理 测试技术 API
深入理解自动化测试框架Selenium的设计理念与实践
【4月更文挑战第15天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加速迭代的关键手段。Selenium作为一种广泛使用的自动化测试框架,提供了对多种浏览器和平台的支持,极大地促进了Web应用的功能测试。本文旨在剖析Selenium的核心设计理念,探讨其在实际项目中的应用,并指出常见的误区及最佳实践,以期帮助测试工程师更高效地利用Selenium进行测试工作。
|
14天前
|
监控 测试技术 API
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第14天】在软件开发过程中,自动化测试是确保代码质量、减少人工重复劳动的关键步骤。Selenium作为一款广泛使用的自动化测试工具,提供了对多种浏览器和操作系统的支持。本文将探讨Selenium的核心组件及其架构设计,分析其如何通过WebDriver与浏览器交互,以及它如何支持多种编程语言进行脚本编写。同时,我们还将讨论Selenium Grid的作用以及它如何实现并行测试,以缩短测试周期并提高测试效率。
178 59
|
16天前
|
Web App开发 前端开发 Java
框架分析(11)-测试框架
框架分析(11)-测试框架