JavaScript单元测试入门
首先要弄清楚什么是单元。单元就是一个相对独立的功能模块,可以是一个类,或是一个模块,或是一个方法。
单元测试的目的,就是首先保证一个系统的基本组成单元(类、模块或方法)能正常工作。打个比方,你想一台机器能正常工作,首先要保证它的每一个零件和组件能正常工作。而单元测试就是对这些零件和组件进行的测试。
所谓”测试框架”,就是运行测试的工具。通过它,可以为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单元测试入门相关推荐
- 初窥Javascript单元测试,附带掌握一门新技能的学习方式。
之前没感觉要学啥单元测试,项目中测试都是手动测的,但也没觉的啥,但最近看文章和招聘上也多多少少有这方面的需求,于是网上搜索了一下,只找到了一些文章,但介绍的都不是很详细或者说比较复杂,满满的伤,虽然看 ...
- JavaScript从入门到精通[文章列表联接]
·JavaScript从入门到精通:更复杂的交互 (1月30日10:7) ·JavaScript从入门到精通:Web页面信息交互 (1月30日10:3) ·JavaScript从入门到精通:窗口及输入 ...
- 如何进行高效JavaScript单元测试
JsTestDriver JsTestDriver library是最好的JavaScript单元测试框架之一,它为JavaScript代码提供了跨浏览器测试 转载于:https://www.cnbl ...
- JavaScript快速入门(四)——JavaScript函数
函数声明 之前说的三种函数声明中(参见JavaScript快速入门(二)--JavaScript变量),使用Function构造函数的声明方法比较少见,我们暂时不提.function func() { ...
- JavaScript从入门到放弃 -(七)ES6
目录 1. ES6相关概念 1.1 什么是 ES6 ? 1.2 为什么使用 ES6 ? 2 ES6新增语法 2.1 新增关键字 2.1.1 let 关键字 小结 2.1.2 const 关键字 小结 ...
- JavaScript从入门到放弃 -(六)正则表达式
正则表达式 1. 正则表达式概述 1.1 什么是正则表达式 1.2 正则表达式的特点 2. 正则表达式在JavaScript中的使用 2.1 创建正则表达式 2.1.1 通过调用 RegExp 对象的 ...
- JavaScript从入门到放弃 -(五)函数进阶(高级用法)
目录 1. 函数的定义和调用 1.1 函数定义的3种方式 1.2 函数调用方式(常见的6种) 1.2.1 普通函数的调用 1.2.2 对象中的函数调用 1.2.3 构造函数的调用 1.2.4 DOM元 ...
- 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 ...
- JavaScript从入门到放弃 -(三)ES5新增方法及商品查询案例
目录 1. ES5新增方法概述 2. 数组方法 2.1 forEach方法 2.2 filter 筛选数组方法 2.3 some方法 3. 查询商品案例 3.1 HTML结构和CSS样式 3.2 准备 ...
最新文章
- 网络安全系列之七 网站提权
- 用c++来开发php的底层模块|用c++来开发apache模块,Apache模块开发实例(2)
- 985程序员因迟到工资被扣,一怒之下破解钉钉打卡,要不你也试试?
- EL表达式处理字符串 是否 包含 某字符串 截取 拆分...............
- 巨人 index.php/user/login,dedecms实现首页顶部会员登陆框的方法
- 海军装备、舰船电子设备|环境可靠性试验|GJB150A\GJB4
- SWAT模型气象数据处理(一)
- 赛程安排 单循环赛 matlab程序
- 柏拉图式爱情 (精神爱情)
- 视频基本原理 -视频接口之 - MIPI接口(五)
- 另一个伊甸专武,国际服用(手机随便做的,有点粗糙,见谅
- 2022年自考专业(工商企业管理)生产与作业管理练习题
- 家装网线该如何选择?怎么区别好坏
- JSP程序-根据当前时间显示上午好、下午好、晚上好
- 如皋中学2021高考成绩查询,喜报!如皋八所高中高考成绩公布
- 机器人操作的“圣杯问题” -- Bin Picking
- oracle 11g第二版课后答案,oracle 11g(钱慎一)课后习题答案
- 一文搞懂 PEP8 代码风格
- Snaker技术文档整理
- Linux网络编程之System V消息队列
热门文章
- MySQL的存储引擎及常用数据类型介绍
- 2020-11-13第六题
- 长安渝北工厂机器人_面包车界的悲情品牌-「长安凯程欧尚」为何不敌通用五菱宝骏?...
- 关闭Adobe Acrobat Reader DC右侧的侧边栏
- 【每日1刷系列】软件测试常见面试题—深层概念
- 企业文档加密软件选择标准是什么
- 山东500分学计算机,2017山东500分左右的理科大学
- 3G? 2G? 2.5G? 4G? 与 WIFI, GPRS,CDMA 3G无线上网
- discuz 添加具有管理员权限的用户
- SSJ集成整合、声明式事务管理