当前位置: 首页 > 后端技术 > Node.js

NodeJsMocha下的测试框架

时间:2023-04-03 15:38:09 Node.js

我的博客http://www.wjs.photo/,有兴趣的可以看看。基于NodeJs框架ThinkJs的介绍和代码下载,Mocha于2011年发布,是目前最流行的javascript框架之一,本文重点介绍其在NodeJs上的使用。如果需要下载示例代码,可以使用这个链接gitClone或者下载zip压缩包来下载代码并安装依赖:$cdDemoOfMocha$npminstall代码目录结构如图所示:你可以新建一个根据代码目录结构和test文件夹在根目录下的lib文件夹,然后在test文件夹下创建一个lib文件夹,然后通过npminit命令生成package.json,也可以先下载代码,先运行test现在在lib目录下新建一个sum.jsFileexports.sum=function(a,b){returna+b}接下来测试这个脚本,在test目录下的lib文件夹新建一个测试脚本:sum.js//test/lib/sum.jsvarsum=require('../../lib/sum')varassert=require('assert')describe('testwithfunction',function(){it('1加1应该等于2',function(){varexpect=10;assert.equal(sum(1,1),expect);})})以上代码为测试脚本,可以执行独立地。测试脚本应包含一个或多个describe块,每个adescribe块还应包含一个或多个it块。describe块是一个“测试套件”,意思是一组相关的测试。一是函数,二是实际可以执行的函数。测试,最小的测试单元,也是一个函数。第一个参数是测试用例的名称或描述,第二个参数是实际可以执行的功能。断言包)来判断测试代码的执行结果是否与预期结果一致。如果不一致,将抛出错误。在我们的测试脚本sum(1,1)中,结果应该等于2。让我们在这里引入Assert。断言模块assert.fail(actual,expected,message,operator)的一些函数使用指定的运算符来测试实际(真实值)与预期(期望值)是否一致。assert.ok(value,[message])测试实际值是否为真,assert.equal(true,value,message);效果相同assert.equal(actual,expected,[message])使用等价比较运算符(==)测试实际值是否浅显地、强制地等于预期值。assert.notEqual(actual,expected,[message])使用不等式比较运算符(!=)来测试实际值是否浅薄、强制性与预期值不相等。assert.deepEqual(actual,expected,[message])测试实际值是否深度等于预期值。assert.notDeepEqual(actual,expected,[message])测试实际值是否与预期值深度不相等。assert.strictEqual(actual,expected,[message])使用严格相等运算符(===)来测试实际值是否严格等于预期值。assert.notStrictEqual(actual,expected,[message])使用严格不等运算符(!==)来测试实际值是否不严格等于预期值。assert.throws(block,[error],[message])当预期的块抛出错误(error)时,错误可以是构造函数、正则表达式或其他验证器。接下来,我们更新package.json中的脚本字段{"name":"DemoOfMocha","version":"1.0.0","description":"demoofmocha","main":"index.js","directories":{"test":"test"},"dependencies":{},"devDependencies":{},"scripts":{"test":"NODE_ENV=testmochatest/**/*.js"},"keywords":["deom","mocha"],"author":"wjszxli","license":"ISC"}我们使用npm命令安装MochaJS$npminstallmocha--save-dev我们添加了运行测试的命令,然后使用命令获取测试报告$npmtest测试报告如下:这样,我们的第一次测试就成功了为了让测试报告更漂亮我们可以使用mochawesome模块生成漂亮的HTML报告格式,如图:通过以下命令安装mochawesome$npminstall--save-devmochawesome然后更新package.json中的scripts字段"name":"DemoOfMocha","version":"1.0.0","description":"demoofmocha","main":"index.js","directories":{"test":"test"},"dependencies":{},"devDependencies":{"mocha":"^3.2.0","mochawesome":"^2.0.4"},"scripts":{"test":"NODE_ENV=testmochatest/**/*.js--reportermochawesome"},"keywords":["deom","mocha"],"author":"wjszxli","license":"ISC"}运行测试命令,mochawesome-reports中会生成测试报告,用浏览器打开html页面,我们会看到一个beautifultestReportasynchronoustestmocha默认每个测试用例最多执行2000毫秒,如果超过2000毫秒没有得到结果,会报错,如果涉及到异步操作的测试用例,2000毫秒是不够的。时间,我们需要使用-t或者--timeout参数指定超时阈值,我们可以修改package.json中的scripts字段(我们这里改成3000毫秒)"scripts":{"test":"NODE_ENV=testmocha-t3000timeouttest/**/*.js--reportermochawesome”},编写异步测试脚本//test/lib/timeout.jsvarassert=require('assert')describe('测试应该结束after3000毫秒',function(){it('测试应该在3000毫秒后结束',function(over){vara=false;varb=function(){a=true;断言.ok(a);超过();};设置超时(b,2500);})})this测试用例执行it块时,传入一个参数over。当测试结束时,必须显式调用此函数告诉Mocha测试结束,否则Mocha会一直等到超时结束,报错输入运行测试用例的命令。我们也可以测试异步请求内部地址或外部接口。这里我们以请求内部地址为例:在根目录新建一个:app.jsvarexpress=require('express')varapp=express();app.get('/api/test',function(req,res){res.send({})})varport=process.env.PORT||3000if(process.env.NODE_ENV!=='test'){app.listen(port);console.log('startfromhttp://localhost:'+port)}else{module.exports=app;}在测试目录test/lib/async.js下的lib文件夹中新建async.js//varhttp=require('http')varassert=require('assert')varrequest=require('superagent');describe("测试异步请求",function(){it("测试异步请求返回一个对象",function(next){request.get('http://localhost:3000/api/test').end(function(err,res){//expect(res).to.be.an('object');console.log(res.body);assert.deepEqual(res.body,Object)next();});})})测试结果Mocha支持Promist测试,允许直接返回Promise,等待他的状态改变,然后执行断言//test/lib/promise.jsvarfetch=require('node-fetch');varhttp=require('http')varassert=require('assert')describe('Promise异步测试',function(){it('异步Promise返回一个对象',function(){returnfetch('http://localhost:3000/api/test').then(function(res){returnres.json();}).then(function(json){console.log(json)assert.deepEqual(json,{});});})})执行测试测试钩子在描述块中,有四个测试用例钩子:before(),after(),beforeEach()和afterEach()它们会在指定的时间执行.describe('hooks',function(){before(function(){//在当前块中的所有测试用例之前执行});after(function(){//在当前块中的所有测试用例之后执行});beforeEach(function(){//在当前块中的每个测试用例之前执行});afterEach(function(){//在当前块中的每个测试用例之后执行});//测试用例});在test目录下lib文件夹新建hooks.js//test/lib/hooks.jsvarassert=require('assert')describe('hookexample',function(){varfoo=false;beforeEach(function(){foo=true;});it('修改foo成功',function(){assert.ok(foo)});});测试结果测试用例管理如果项目有很多测试用例,但有时您只想运行其中的几个。这时候就可以使用唯一的方法了。describe块和it块都允许only方法,也就是只有带only的测试用例才允许运行。在测试目录下的lib文件夹中新建only.js//test/lib/only.jsvarsum=require('../../lib/sum')varassert=require('assert')describe('用函数测试',function(){it('1加2应该等于3',function(){varexpect=3;assert.equal(sum(1,2),expect);})it.only('3加4应该等于7',function(){varexpect=7;assert.equal(sum(3,4),expect);})})test测试结果:还有一个skip方法,意思是跳过指定的测试用例。在test目录下lib文件夹新建skip.js//test/lib/only.jssum=require('../../lib/sum')varassert=require('assert')describe('sumfunctiontest',function(){it('5加6应该等于11',function(){varexpect=11;assert.equal(sum(5,6),expect);})it.skip('7加8应该等于15',function(){varexpect=15;assert.equal(sum(7,8),expect);})})测试结果如下,跳过的用-表示