首先要弄清楚什么是单元。单元就是一个相对独立的功能模块,可以是一个类,或是一个模块,或是一个方法。

单元测试的目的,就是首先保证一个系统的基本组成单元(类、模块或方法)能正常工作。打个比方,你想一台机器能正常工作,首先要保证它的每一个零件和组件能正常工作。而单元测试就是对这些零件和组件进行的测试。

所谓”测试框架”,就是运行测试的工具。通过它,可以为JavaScript应用添加测试,从而保证代码的质量。

JavaScript的单元测试框架很多,这里我们介绍一下Mocha。Mocha(发音”摩卡”)诞生于2011年,是现在最流行的JavaScript测试框架之一,在浏览器和Node环境都可以使用。

下面就来介绍一下Mocha的使用方法(以下操作都假设你的电脑有Nodejs环境)。

安装Mocha

打开命令提示符工具,运行以下命令,全局安装Mocha:

npm install mocha -g

一个简单的例子

新建一个test目录,进到与test的同级目录,编写一个测试脚本。通常测试脚本与需要测试的源码脚本同名,但是后缀名改为.test.js或.spec.js(表示规格)。这里我们先新建一个测试文件命名为test1.test.js:

var expect = require('chai').expect;describe('expect',function(){it('4 + 5应该等于9',function(){expect(4 + 5).to.be.equal(9);});
});

上面这段代码就是测试脚本,它可以独立执行。脚本下包括一个或多个describe块,每个describe块包括一个或多个it块。

describe块称为“测试套件”,表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称,第二个参数是实际执行的函数。

it块称为“测试用例”,表示一个单独的测试,是测试的最小单位。它也是一个函数,第一个参数是测试用例的名称,第二个参数是实际执行的函数。

下面的“expect(4 + 5).to.be.equal(9);”语句叫做断言。所谓断言就是判断源码的实际执行结果与预期是否一致,如果不一致就抛出一个错误。

所有测试用例都应该含有一个或多个断言。断言功能由断言库来实现,Mocha本身并不带有断言库,所以必须先引入断言库

var expect = require('chai').expect;

断言库有很多种,Mocha并不限制使用哪一种。上面代码引入的断言库是chai,并且指定使用它的expect断言风格。expect断言的优点就是很接近自然语言。看,expect(4 + 5).to.be.equal(9),期望(4+5)等于9,多么简洁明了。。。

现在万事具备,切回命令提示符工具,运行mocha 命令,你会看到类似这样的输出:

如果expect断言不成立,则会抛出一个错误。只要不抛出错误,测试用例就算通过。

好了,现在你的第一个单元测试的例子已经运行成功了,好开心啊有没有!

expect还有一些其他的语句,如下所示:

// 相等或不相等
expect(4 + 5).to.be.equal(9);
expect(4 + 5).to.be.not.equal(10);
expect(foo).to.be.deep.equal({ bar: 'baz' });// 布尔值为true
expect('everthing').to.be.ok;
expect(false).to.not.be.ok;// typeof
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(foo).to.be.an.instanceof(Foo);// include
expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');// empty
expect([]).to.be.empty;
expect('').to.be.empty;
expect({}).to.be.empty;// match
expect('foobar').to.match(/^foo/);

测试项目中的方法

OK,简单例子说完了,接下来我们看看怎样在项目中测试自己写的方法。

先新建一个项目,文件目录结构如下图所示:

其中,calculate.js文件的代码为:

var calculate = {add: function(a, b){return a + b;},divide: function(a, b){return a / b;}
}module.exports = calculate;

calculate.test.js文件的代码为:

'use strict';
var calculate =  require('./../app/calculate');
var expect = require('chai').expect;describe('Caculate', function() {describe('#calculate', function() {it('return add result', function() {expect(calculate.add(1, 2)).to.be.equal(3);});it('return divide result', function() {expect(calculate.divide(2, 2)).equal(1);});});
});

用命令行工具进入test的同级目录,运行mocha 命令,看到以下运行结果:

测试通过!

JavaScript单元测试入门相关推荐

  1. 初窥Javascript单元测试,附带掌握一门新技能的学习方式。

    之前没感觉要学啥单元测试,项目中测试都是手动测的,但也没觉的啥,但最近看文章和招聘上也多多少少有这方面的需求,于是网上搜索了一下,只找到了一些文章,但介绍的都不是很详细或者说比较复杂,满满的伤,虽然看 ...

  2. JavaScript从入门到精通[文章列表联接]

    ·JavaScript从入门到精通:更复杂的交互 (1月30日10:7) ·JavaScript从入门到精通:Web页面信息交互 (1月30日10:3) ·JavaScript从入门到精通:窗口及输入 ...

  3. 如何进行高效JavaScript单元测试

    JsTestDriver JsTestDriver library是最好的JavaScript单元测试框架之一,它为JavaScript代码提供了跨浏览器测试 转载于:https://www.cnbl ...

  4. JavaScript快速入门(四)——JavaScript函数

    函数声明 之前说的三种函数声明中(参见JavaScript快速入门(二)--JavaScript变量),使用Function构造函数的声明方法比较少见,我们暂时不提.function func() { ...

  5. JavaScript从入门到放弃 -(七)ES6

    目录 1. ES6相关概念 1.1 什么是 ES6 ? 1.2 为什么使用 ES6 ? 2 ES6新增语法 2.1 新增关键字 2.1.1 let 关键字 小结 2.1.2 const 关键字 小结 ...

  6. JavaScript从入门到放弃 -(六)正则表达式

    正则表达式 1. 正则表达式概述 1.1 什么是正则表达式 1.2 正则表达式的特点 2. 正则表达式在JavaScript中的使用 2.1 创建正则表达式 2.1.1 通过调用 RegExp 对象的 ...

  7. JavaScript从入门到放弃 -(五)函数进阶(高级用法)

    目录 1. 函数的定义和调用 1.1 函数定义的3种方式 1.2 函数调用方式(常见的6种) 1.2.1 普通函数的调用 1.2.2 对象中的函数调用 1.2.3 构造函数的调用 1.2.4 DOM元 ...

  8. JavaScript从入门到放弃 -(四)E5 新增方法

    目录 5. trim方法 6. 对象方法 6.1 Object.keys() 6.1.1 作用 6.1.2 语法 6.2 Object.defineProperty() 6.2.1 作用 6.2.2 ...

  9. JavaScript从入门到放弃 -(三)ES5新增方法及商品查询案例

    目录 1. ES5新增方法概述 2. 数组方法 2.1 forEach方法 2.2 filter 筛选数组方法 2.3 some方法 3. 查询商品案例 3.1 HTML结构和CSS样式 3.2 准备 ...

最新文章

  1. 网络安全系列之七 网站提权
  2. 用c++来开发php的底层模块|用c++来开发apache模块,Apache模块开发实例(2)
  3. 985程序员因迟到工资被扣,一怒之下破解钉钉打卡,要不你也试试?
  4. EL表达式处理字符串 是否 包含 某字符串 截取 拆分...............
  5. 巨人 index.php/user/login,dedecms实现首页顶部会员登陆框的方法
  6. 海军装备、舰船电子设备|环境可靠性试验|GJB150A\GJB4
  7. SWAT模型气象数据处理(一)
  8. 赛程安排 单循环赛 matlab程序
  9. 柏拉图式爱情 (精神爱情)
  10. 视频基本原理 -视频接口之 - MIPI接口(五)
  11. 另一个伊甸专武,国际服用(手机随便做的,有点粗糙,见谅
  12. 2022年自考专业(工商企业管理)生产与作业管理练习题
  13. 家装网线该如何选择?怎么区别好坏
  14. JSP程序-根据当前时间显示上午好、下午好、晚上好
  15. 如皋中学2021高考成绩查询,喜报!如皋八所高中高考成绩公布
  16. 机器人操作的“圣杯问题” -- Bin Picking
  17. oracle 11g第二版课后答案,oracle 11g(钱慎一)课后习题答案
  18. 一文搞懂 PEP8 代码风格
  19. Snaker技术文档整理
  20. Linux网络编程之System V消息队列

热门文章

  1. MySQL的存储引擎及常用数据类型介绍
  2. 2020-11-13第六题
  3. 长安渝北工厂机器人_面包车界的悲情品牌-「长安凯程欧尚」为何不敌通用五菱宝骏?...
  4. 关闭Adobe Acrobat Reader DC右侧的侧边栏
  5. 【每日1刷系列】软件测试常见面试题—深层概念
  6. 企业文档加密软件选择标准是什么
  7. 山东500分学计算机,2017山东500分左右的理科大学
  8. 3G? 2G? 2.5G? 4G? 与 WIFI, GPRS,CDMA 3G无线上网
  9. discuz 添加具有管理员权限的用户
  10. SSJ集成整合、声明式事务管理