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

Aest强大的NodeJSRestful接口测试工具

时间:2023-04-03 17:58:59 Node.js

1.Aest项目地址:https://github.com/wangduandu...强大的REST接口测试工具,PowerByJest,axios,superstruct,mustache,lodash2。特点很简单:大部分工作量在于编写配置文件请求模板:可以在配置文件中添加运行时变量,如/users/{{id}}响应体结构验证:支持字段的严格验证typeoftheresponsebody,Multiplefield,fewfields,字段类型不符合预期都会报错。非常详细的错误提示:见截图3.安装yarnaddaesternpmiaester-S4。使用4.1。编写测试用例//文件名必须以test.js结尾constAe=require('aester')vartestData=require('./test-data.js')//初始化配置文件testData=Ae.init(testData)describe('4XX5XX错误响应测试',()=>{test('不带sessionId获取用户信息',async()=>{awaitexpect(Ae.send(testData.getOneUser,{id:'1'})).rejects.toHaveProperty('status',403)})test('loginByEmailFailTest',async()=>{awaitexpect(Ae.send(testData.loginByEmail,{password:'111'})).rejects.toHaveProperty('status',401)})})describe('2XXsuccessresponsetest',()=>{test('loginByEmailSuccessTest',async()=>{//对于符合预期的正面测试,有不需要使用expect,如果响应状态码是400个以上,或者响应体结构不符合预期,//测试用例自动失败constdata=awaitAe.send(testData.loginByEmail,{password:'000'})Ae.share('sessionId',data.sessionId)})test('GetUserInfo',async()=>{awaitAe.send(testData.getOneUser,{id:'1'})})})describe('2XX成功响应错误正文struct',()=>{test('StructErrortest',async()=>{vardata=_.cloneDeep(testData.getOneUser)data.resBodyStruct.test='number'//设置错误structawaitexpect(Ae.send(data,{id:'1'})).rejects.toHaveProperty('type','StructError')})})4.2.接口配置文件//test-data.jsmodule.exports={$baseUrl:'http://localhost:3000',loginByEmail:{desc:'login',req:{method:'post',path:'/login',headers:{'content-type':'application/x-www-form-urlencoded'},data:'email=wdd@cc.tt&password={{password}}',params:{_test:1}},resBodyStruct:{sessionId:'string'}},getOneUser:{desc:'getuserinfo',req:{path:'/users/{{id}}',headers:{'sessionId':'{{sessionId}}'//如果分享中有sessionId,在请求发送时,会自动将{{sessionId}}替换为真实值,否则替换为空字符串}},resBodyStruct:{id:'string',email:'string',password:'string',userName:'string',likes:'array',isAdmin:'boolean'}},createOneUser:{desc:'createuser',req:{method:'post',path:'/users',headers:{'sessionId':'{{sessionId}}'}}},updateOneUser:{desc:'updateuser',req:{method:'put',path:'/users/{{id}}',headers:{'sessionId':'{{sessionId}}'}}},deleteOneUser:{desc:'获取用户信息接口',req:{method:'delete',path:'/users/{{id}}',headers:{'sessionId':'{{sessionId}}'}}}}4.3.运行测试用例将“scripts”添加到package.json:{“test”:“jest”}并运行npmtest4.4。生成html测试报告yarnaddjest-html-reporter-D4.4.1。方法一然后在package.json中添加以下字段“test:report”:“jest--reporters='jest-html-reporter'”并运行npmruntest:report4.4.2。方法二在项目根目录创建jest.config.jsmodule.exports={verbose:true,testEnvironment:'node',reporters:['default',['./node_modules/jest-html-reporter',{pageTitle:`operationapitest${process.env.testConfigEnv}`,includeFailureMsg:true//详细错误信息}]]}然后运行npmtest5。见测试结果5.1。正常测试结果PASStest/unit.test.jsPASStest/index.test.jsTestSuites:2passed,2totalTests:8passed,8totalSnapshots:0totalTime:1.864s5.2.接口错误测试结果"origin":"null","readyState":4,"requestBuffer":null,"requestCache":null,"responseBuffer":[Buffer],"responseCache":null,"responseHeaders":[Object],"responseTextCache":"Forbidden","responseURL":"http://localhost:3000/users/1","responseXMLCache":null,“send”:true,“status”:403,“statusText”:“禁止”,“timeoutFn”:null,“timeoutId”:0,“timeoutStart”:0,“totalReceivedChunkSize”:9,“uploadComplete”:true,"uploadListener":false,},},"status":403,"statusText":"Forbidden",}18|})19|>20|test('获取用户信息',async()=>{|^21|awaitAe.send(testData.getOneUser,{id:'1'})22|})23|在Env.it(node_modules/jest-jasmine2/build/jasmine_async.js:102:24)在Object.<匿名>(test/index.test.js:20:1)5.3。接口返回的响应体不符合预期的测试结果。例如,resBodyStruct将sessionId配置为数字格式,但返回格式为字符串,会报如下格式的TypeError:Expectedavalueoftype`number`for`sessionId`butreceived`"123456"`.60|如果(conf.resBodyStruct){61|让Scheme=struct(conf.resBodyStruct)>62|让结果=Scheme.validate(res.data)|^63|如果(结果。长度===1){64|拒绝(结果[0])65|}在Function.Struct.validate.value[作为验证](node_modules/superstruct/src/superstruct.js:78:17)在src/index.js:62:296。API6.1。aest.init(apiConfs)初始化配置文件constAe=require('aester')...varconf=Ae.init(apiConfs)6.2.Aest.send(apiConf,options)发送请求options会和share合并,然后相应的变量会被渲染到请求模板中。constAe=require('aester')...Ae.send(testData.getOneUser,{id:'1'}6.3.Aest.share(key,value)设置共享变量constAe=require('aester')。..varconf=Ae.share('token','123123')6.4.Aest.getShare()获取所有共享变量constAe=require('aester')...varconf=Ae.getShare()//{token:'123123'}7.配置文件中写明keyisrequired?表示$baseUrl为请求baseUrldesc|No|接口描述req|Yes|请求对象req.method|No|请求方法,默认getreq。path|req.headers|Yes|默认为空对象,默认设置为'content-type':'application/json;charset=UTF-8'resBodyStruct|No|响应体格式校验对象resBodyStruct字段描述{key:keyType}字段类型支持如下any:anynumber:numberarray:arraystring:stringboolean:布尔值null:nullundefined:undefinedobject:objecttype在字段类型后加?表示该字段是否可选,如:{sessionId:'string?'//sessionId是一个字符串,但是不需要这个字段}更多字段类型验证参考:https://github.com/ianstormta...8.测试Aesternpm测试