关于测试(mocha+karma)
断言
node assert
assert模块提供了一组简单的断言测试,可用于测试不变量。
断言库
should.js
测试框架(mocha)
mocha(摩卡)是运行测试的工具。就是运行测试脚本(测试源码的脚本)的工具。
一、mocha安装
npm install --global mocha
二、macha测试脚本写法
测试脚本:测试源码的脚本(测试脚本包含一个或多个describe块,每个describe块包括一个或多个it块)。测试脚本要与测试的源码脚本同名,但后缀名为.test.js(表示测试)或者.spec.js(表示规格)。
测试套件(describe):表示一组相关的测试,是一个函数。参数一是测试套件名称,参数二是实际执行函数。
eg:
`describe('测试套件名称',function() { //实际执行函数内容 })`
测试用例(it):表示一个单独的测试,是一个函数。参数一是测试用例名称,参数二是实际执行函数。
eg:
describe('测试套件名称', function() { it('测试用例名称', function() { //实际执行函数内容 } })
三、mocha使用
mocha,直接执行mocha命令即运行test目录下的测试脚本(默认运行test子目录里的测试脚本);mocha命令后面加上测试脚本的路径和文件名可以指定多个测试脚本。
eg:
mocha //默认运行test子目录下的测试脚本
eg: 测试多个脚本
mocha test/*.js //shell通配符指定test目录下的所有.js后缀测试脚本。 mocha test/test1/*.js //shell通配符指定test目录下test1目录下的所有.js后缀测试脚本。 mocha test/{,**/}*.{js,jsx} //shell通配符指定test目录下所有子目录中所有.js或.jsx后缀测试脚本 mocha 'test/**/*.@(js|jsx)' //node通配符指定test目录下所有子目录中所有.js或.jsx后缀测试脚本。
注意:test目录下存在子目录的情况下,若要每一层测试用例都执行则需要在mocha后面添加--recursive
mocha --recursive
除此之外mocha还有许多命令行参数运行mocha --help可以查看。
四、配置文件(mocha.opts)
将命令行参数写到配置文件中可以直接输入mocha实现参数功能。如果测试用例不放在test子目录可以在配置文件中加入以下参数:
test1-test --recursive //指定运行test1-test目录极其子目录中的测试脚本。
五、异步代码(ASYNCHRONOUS CODE) And 同步代码(SYNCHRONOUS CODE)
<1>异步代码(ASYNCHRONOUS CODE)
1、mocha测试异步代码在测试完成时调用回调函数即可(回调函数通常命名为done)。在it块中添加回调函数,mocha就会在这个函数被调用之后完成测试。
eg:
describe('User', function() { describe('#save()', function() { it('should save without error', function() { var user = new User('Luna') user.save(function(err) { if(err) done(err); else done() }) }) }) }) //done()函数接收一个err,以上可以简写为: describe('User', function() { describe('#save()', function() { it('should save without error', function(done) { var user = new User('Luna') user.save(done) }) }) })
2、使用Promise
除了使用done()回调函数,也可返回一个promise(对于返回promise的方法实用)
eg:
beforeEach(function() { return db.clear() .then(function() { return db.save([tobi, loki, jane]); }); });
3、async/await写法
eg:
beforeEach(async function() { await db.clear(); await db.save([tobi, loki, jane]); });
<2>同步代码(SYNCHRONOUS CODE)
测试同步代码mocha会自动测试,可省略参数中的回调函数。
eg:
describe('Array', function() { //在Array用例集下面嵌套的集合,只有#indexOf用例集合会被执行。 describe('#indexOf()', function() { it('should return -1 when the value is not present', function() { assert.equal(-1, [1, 2, 3],indexOf(4)) }) }) })
六、HOOKS(钩子函数)
钩子函数:设置测试先决条件或对测试进行清理。
before('描述信息',function(){函数内容}) //在该区块内所有测试之前运行 after(function(){}) //在该区块内的所有测试之后运行 beforeEach(function myName(){}) //在该区块内每个测试运行之前运行 afterEach(/*描述信息可有可无*/ function(){}) //在该区块内每个测试运行之后运行
//运行顺序(中间可以穿插it块) before()(只运行一次)->beforeEach()->afterEach()->after()(只运行一次)
注意:
- 钩子函数使用了命名,命名会作为该函数的描述信息。
- 所有的钩子函数可以是同步也可以是异步的。
- 根级别钩子(可理解为最顶级作用域中)添加在所有describe()外面,这会使得在每个测试用例之前调用该根级别钩子(不仅仅在该文件中,mocha有个暗藏的describe()叫做rootroot-suite)
七、浏览器测试
mocha init catalog //初始化,会在该目录下生成index.html和./mocha.js和./mocha.css文件
在浏览器中打开index.html,就可以在浏览器中查看测试脚本运行结果。
八、测试用例管理方法
pending test:被等待实现的测试用例。
1、.only()方法
.only()方法:让mocha只测试此用例集合(describe)或用例单元(it)。//可以被定义多次来 定义一系列的测试子集或多个测试集合或两种结合使用。
eg:
//定义多次测试集合 describe('Array', function () { describe.only('#indexOf()', function () {...}); //在Array用例集下面嵌套的集合,只有#indexOf用例集合会被执行。 describe.only('#concat()', function () {...}); describe('#slice()', function () {...}); }) //定义多次测试子集 describe('name', function () { it.only('should return -1 unless present', function () {...}); it.only('should return -1 unless present', function () {...}); it('should return -1 unless present', function () {...}); })
注意:有钩子函数,钩子函数会被执行。
2、.skip()方法
.skip用于跳过某些测试集合和测试用例(被跳过的用例会被标记为pending test)。 //测试用例在需要某些特定的环境或者一些特殊的配置但事先无法确定的时候可以使用 this.skip() (此时不能使用箭头函数),根据条件在运行的时候跳过某些测试用例。
注意:在skip()之后,不要在用例函数或after钩子中执行更多逻辑以避免逻辑混乱。
可以在before钩子中使用skip()来跳过多个测试用例或测试集合。
九、es6转码
es6转码安装babel
npm install --save-dev babel-register mocha --require babel-registe //若是指定了文件后缀名则需要加上 --compilers
mocha文档
中文翻译文档
测试环境(karma)
karma:是一个基于Node.js的JavaScript测试执行过程管理工具。主要作用是将项目运行到各种主流的浏览器中进行测试。
一、karma安装
npm install karma --save-dev
二、karma使用
karma init //初始化,会产生配置文件(karma.conf.js) 1. Which testing framework do you want to use ? (mocha) 2. Do you want to use Require.js ? (no) 3. Do you want to capture any browsers automatically ? (Chrome) 4. What is the location of your source and test files ? (test/ **.js) 5. Should any of the files included by the previous patterns be excluded ? () 6. Do you want Karma to watch all the files and run the tests on change ? (yes) karma start //启动测试(会打开浏览器,观察浏览器控制台输出信息)