当前位置: 首页 > news >正文

Mocha测试初探

Mocha简介:

一个具有丰富特性的javascript 测试框架,支持多种断言库,异步代码测试等,不仅可运行在node.js 环境中还可以运行在浏览器中。

一、安装

// 全局安装
npm install -global mocha
// 在项目中安装
npm install --save-dev mocha

二、写一个简单的测试

2.1 首先新建一个项目,src 下待测试代码,test 下写测试用例。目录如下
//mocha-to-go
|   package.json
|   
+---node_modules
|           
+---src
|       sum.js
|       
\---test
        sum.test.js
        
2.2 待测试文件 sum.js
// 求函数所有参数的和
module.exports = sum = function () {
  let args = Array.from(arguments);
  let sum = 0;
  sum = args.reduce((s, x) => {
    return s +=x
  });
  return sum;
}
2.3 新建测试脚本

mocha 支持多种断言库,比如should.js 、expect.js 、chai.js 等,这里以chai.js 为例。选择chai.js 的Expect风格的断言,它是行为驱动开发(BDD)断言的一种,接近于自然语言,容易理解。可运行在所有的浏览器中和node.js中

先安装断言库chai.js

npm install chai --save-dev
const sum = require('../src/sum.js');
const expect = require('chai').expect;

describe('测试 sum(1,2)', function () {
  it('sum(1+2) 应该等于 3', function () {
    expect(sum(1,2)).to.be.equal(3);
  });
});

测试脚本通常包含多个describe块,每个块都含有一个it块,
describe(testName, exceFunc)
describe 第一个参数是这个测试过程的名称,第二个参数应该是一个函数,它包含了我们要测试的内容,也就是我们要执行的过程。
it 是测试用例,表示一个单独的测试,是测试的最小单位。它是一个函数。第一个参数是测试用例的名称("1 加 1 应该等于 2")
,第二个参数是一个实际执行的函数。

2.4 运行测试脚本

这里我在package.json 中声明了执行脚本

"scripts": {
    "test": "mocha ./test/sum.test.js"
  }

也可以在项目目录直接执行

mocha ./test/sum.test.js

运行结果如图:

图片描述

三、对异步代码进行测试

3.1 对使用回调函数的异步请求进行测试

Mocha中测试异步代码比较简单,只需要在测试用例结束时调用一下回调函数即可,通常回调函数写作done(),这样、Mocha就能获知这时一个异步函数,回调时才认为测试结束。

新建async.js,这里GET一个存在的json文件,来作为一个异步过程。

const request = require('request');

module.exports = asyncProc = function (callback) {
  request('https://github.com/Will233/koa-template/blob/master/mock/data.json',function (err, res, body) {
    callback(err, res, body)
  });
}

测试脚本

const expect = require('chai').expect;
const request = require('request');

const asyncProc = require('../src/async.js');
describe('测试异步过程', function () {
  it('发送异步请求, response statusCode == 200', function (done){
    asyncProc(function (err, res, body) {
      expect(res.statusCode).to.be.equal(200)
      done()
    })
  });
});
mocha ./test/async.test.js

运行结果如下:

图片描述

发现报错了。这里对异步代码进行测试时需要注意一点,Mocha默认一个单元测试最多执行2000ms,超时会报错。可在执行的时候用-t--timeout 指定超时阈值。
提高超时时间:

mocha -t 5000 ./test/async.test.js

运行结果如下:
图片描述

3.2 对使用Promise的异步函数进行测试

Mocha 同样支持了对返回promise的异步代码进行测试。
我们改造一下上面请求的代码,使其返回promise。

// async.js
const asyncPromise = function () {
  return new Promise(function (resolve, reject) {
    request('https://github.com/Will233/koa-template/blob/master/mock/data.json',function (err, res, body) {
        if (err) {
          reject(err)
        } else {
          resolve(res)
        }
    });
  });
}

编写测试用例:

describe('测试异步过程 Promise', function () {
  it('发送异步请求, response statusCode == 200', function (){
    return asyncPromise().then(function (res) {
      expect(res.statusCode).to.be.equal(200);
    });
  });
});

运行结果如下:
图片描述

四、结语

Mocha 作为一个强大的测试框架,还有很多特性。以后慢慢了解咯。

相关文章:

  • 在线修改ha.proxy配置文件
  • BZOJ 4016: [FJOI2014]最短路径树问题
  • Flask的sqlalchemy SQL练习
  • js通过按钮直接把input或者textarea里的值复制到粘贴板里
  • SpringBoot基础篇配置信息之多环境配置信息
  • Horizon for NSX 服务安装包
  • bootstrap-带下拉菜单的标签页
  • 再下一城:Google 成为 Safari 默认搜索引擎
  • Centos 系统引导损坏修复、密码破解与加密
  • nodejs入门01——第一次给了nodejs
  • WPF C# 多屏情况下,实现窗体显示到指定的屏幕内
  • TCP三次握手和四次挥手以及11种状态
  • 导航栏的隐藏问题
  • PostgreSQL 数据库导入导出操作
  • 20181016提高测试
  • Apache Spark Streaming 使用实例
  • create-react-app做的留言板
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript 一些 DOM 的知识点
  • Java超时控制的实现
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • MySQL QA
  • mysql常用命令汇总
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python socket服务器端、客户端传送信息
  • React as a UI Runtime(五、列表)
  • React16时代,该用什么姿势写 React ?
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 对象引论
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 构造函数(constructor)与原型链(prototype)关系
  • 记一次用 NodeJs 实现模拟登录的思路
  • 两列自适应布局方案整理
  • 前端攻城师
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 微信公众号开发小记——5.python微信红包
  • 我看到的前端
  • Spring第一个helloWorld
  • 选择阿里云数据库HBase版十大理由
  • # C++之functional库用法整理
  • #NOIP 2014# day.2 T2 寻找道路
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (ZT)薛涌:谈贫说富
  • (二)WCF的Binding模型
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)树状数组
  • .bat批处理出现中文乱码的情况
  • .htaccess配置重写url引擎
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core使用NPOI导出复杂,美观的Excel详解