> 文档中心 > 自动化测试框架[基于Cypress的Mock Server 最佳实践]

自动化测试框架[基于Cypress的Mock Server 最佳实践]


更改Mock Server端口

//将Mock Server的端口指定为3004json-server --watch db.json --port 3004

使用HTTPS

大部分的接口都是HTTPS的,json-server也支持HTTPS
首先,在项目根目录下新建js文件并命名为server.js,然后写入如下代码

var fs = require('fs'),  https = require('https'),  jsonServer = require('json-server'),  server = jsonServer.create(),  router = jsonServer.router('db.json'),  middlewares = jsonServer.defaults();var options = {  key: fs.readFileSync('./key.pem'),  cert: fs.readFileSync('./cert.pem')};server.use(middlewares);server.use(router);https.createServer(options, server).listen(3002, function() {  console.log("json-server started on port " + 3002);});

然后生成本地SSL Cert文件,前提是已经安装了openssl,下载地址为https://www.openssl.org/,安装后,在项目的根目录下,命令行执行如下命令

//生成certopenssl req-x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 120 -nodes

然后启动json-server

//将以https方式启动node server.js

然后便可以访问HTTPS的服务,用浏览器打开http://localhost:3002,自己生成的SSL Cert在用浏览器打开服务地址的时候会有个warning,忽略即可

使用自定义路由

通常情况下API的路由格式均为xxx.domain/api/xxx,但是需要做一下改造才能以这种格式访问,在项目的根目录下新建js文件并命名为testRoutes.js

var fs = require('fs'),  https = require('https'),  jsonServer = require('json-server'),  server = jsonServer.create(),  router = jsonServer.router('db.json'),  middlewares = jsonServer.defaults();var options = {  key: fs.readFileSync('./key.pem'),  cert: fs.readFileSync('./cert.pem')};//给路由起别名server.use(jsonServer.rewriter({    "/api/*": "/$1",    "/:resource/:id/show": "/:resource/:id",    "/posts/:category": "/posts?category=:category",    "/articles\\?id=:id": "/posts/:id"  }));server.use(middlewares);server.use(router);https.createServer(options, server).listen(3002, function() {  console.log("json-server started on port " + 3002);});

路由设置好后,启动json-server

//将Mock Server以https方式启动node testRoutes.js

然后,通过浏览器访问如下地址

https://localhost:3002/api/userhttps://localhost:3002/api/user/1https://localhost:3002/api/user/1/showhttps://localhost:3002/api/user?id=1https://localhost:3002/api/user?title=tony

模拟HTTP Status Code

在e2e测试中,往往请求返回的并非200,Mock Server也同样支持,在项目根目录下新建js文件,并命名为testMockHttpStatusCode.js,然后写入如下内容

var fs = require('fs'),  https = require('https'),  jsonServer = require('json-server'),  server = jsonServer.create(),  router = jsonServer.router('db.json'),  middlewares = jsonServer.defaults();var options = {  key: fs.readFileSync('./key.pem'),  cert: fs.readFileSync('./cert.pem')};//自定义 api/user 这个路由的 http status code。//本例简单判断, POST 请求返回 400, 其它请求返回 200server.post('/api/user', (req, res) => {    //这里写您希望的处理逻辑    if (req.method === 'POST') {   res.status(400).jsonp({     error: "Bad userId"   }); }else { res.status(200).jsonp(res.locals.data);      }    });server.use(middlewares);server.use(router);https.createServer(options, server).listen(3002, function() {  console.log("json-server started on port " + 3002);});

然后再integration文件夹下建立测试文件testMock.js,并写入如下内容

describe('测试POST API', () => {    const item = {"id":210, "title": "kevin", "name": "kevin" }      it('POST会新增一个用户', () => {      //检查user内容增加了.      cy.request('https://localhost:3002/user').then((res)=>{ expect(res.status).to.be.equal(200) expect(res.body.length).to.be.equal(5)      }) cy.request({ method: 'POST', //添加 user 信息 url: 'https://localhost:3002/api/user', headers: {'Content-Type': 'application/json'}, body: item      })    })  })

然后启动json-server

node testMockHttpStatusCode.js

然后在交互模式下运行testMock.js,能够发现GET请求正常返回,而POST请求返回的是400

自动生成Mock数据

Mock数据的生成,可以直接写入,也可以用程序生成,faker.js是用于生成伪造数据的JavaScript库,常常用来Mock各种数据,执行命令npm install faker --save-dev安装faker,然后新建js文件,并命名为testMockDataGen.js,然后写入如下内容

const faker = require('faker');const fs = require('fs')function generateUsers() {  let users = []  for (let id=1; id <= 100; id++) {    let name = faker.name.firstName() + faker.name.lastName();    let title = faker.name.jobTitle();    users.push({ "id": id, "name": name, "title": title    });  }  return { "data": users }}let dataObj = generateUsers();fs.writeFileSync('data1.json', JSON.stringify(dataObj, null, '\t'));

然后启动json-server

//以https方式启动node testMockDataGen.js