自动化测试框架[基于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