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

本文介绍了如何更改MockServer端口,并使用json-server创建HTTPS服务,包括配置本地SSL证书、自定义路由和HTTP状态码。此外,还展示了如何生成Mock数据,以及进行相关测试。

更改Mock Server端口

//将Mock Server的端口指定为3004
json-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/,安装后,在项目的根目录下,命令行执行如下命令

//生成cert
openssl 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/user
https://localhost:3002/api/user/1
https://localhost:3002/api/user/1/show
https://localhost:3002/api/user?id=1
https://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, 其它请求返回 200
server.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Davieyang.D.Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值