前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【架构师(第四十三篇)】 服务端开发之单元测试和接口测试

【架构师(第四十三篇)】 服务端开发之单元测试和接口测试

作者头像
一尾流莺
发布2022-12-10 13:52:06
6720
发布2022-12-10 13:52:06
举报

Jest

安装

代码语言:javascript
复制
npm i jest --save-dev

测试 demo

代码语言:javascript
复制
// __test__\demo.test.js

describe('test demo', () => {
  test('1 + 1 = 2', () => {
    expect(1 + 1).toBe(2)
  })
})

控制台执行 npm run test:local

添加测试命令

代码语言:javascript
复制
// package.json

  "scripts": {
    "test:local": "cross-env NODE_ENV=test_local jest --runInBand  --passWithNoTests --colors --forceExit",
  },
image.png
image.png

supertest 接口测试

有接口测试的保护,让所有接口稳如老狗,哈哈。

安装

代码语言:javascript
复制

本地测试

jest + supertest

远程测试

jest + axios

和单元测试的关系

接口测试和单元测试,代码都放在 __test__ 目录下,但两者概念要区分开。

代码演示

  • 安装 supertestaxios
  • package.json 添加 test:remote 命令
  • 接口测试代码目录 __test__/apis/

安装插件

代码语言:javascript
复制
npm i  axios supertest -S

添加测试命令

代码语言:javascript
复制
// package.json

  "scripts": {
    "test:local": "cross-env NODE_ENV=test_local jest --runInBand  --passWithNoTests --colors --forceExit",
    "test:remote": "cross-env NODE_ENV=test_remote jest --runInBand  --passWithNoTests --colors --forceExit"
  },

封装请求

代码语言:javascript
复制
// __test__\apis\_server.js

const axios = require('axios')
const supertest = require('supertest')
const { isTestRemote, isTestLocal } = require('../../src/utils/env')

let request
if (isTestLocal) {
  // 本地测试才使用 supertest 。src/app 也要在此时引用,否则在 github actions 中初始化时,会报数据库连接错误。
  const server = require('../../src/app').callback() // eslint-disable-line
  request = supertest(server)
}

// 存储登录 token ,统一拼接 headers.Authorization
let TOKEN = ''

// 测试机 host
const REMOTE_HOST = 'http://182.92.xxx.xxx:8081'

/**
 * 发送请求
 * @param {string} method method
 * @param {string} url url
 * @param {object} bodyOrParams body / query
 * @param {object} headers headers
 */
async function ajax(method = 'get', url = '', bodyOrParams = {}, headers = {}) {
  // headers 加 token
  if (headers.Authorization == null) {
    Object.assign(headers, {
      Authorization: `Bearer ${TOKEN}`,
    })
  }

  let result

  // 本地测试,使用 supertest
  if (isTestLocal) {
    let res
    if (method === 'get') {
      res = await request[method](url).query(bodyOrParams).set(headers)
    } else {
      res = await request[method](url).send(bodyOrParams).set(headers)
    }
    result = res.body
  }

  // 远程测试,使用 axios ,访问测试机
  if (isTestRemote) {
    const remoteUrl = `${REMOTE_HOST}${url}`
    const conf = {
      method,
      url: remoteUrl,
      headers,
    }
    if (method === 'get') {
      conf.params = bodyOrParams
    } else {
      conf.data = bodyOrParams
    }
    const res = await axios(conf)
    result = res.data
  }

  // 返回结果
  return result // { data, errno }
}

module.exports = {
  setToken(token) {
    console.log('setToken...', token)
    TOKEN = token
  },
  async get(url, params) {
    const res = await ajax('get', url, params)
    return res
  },
  async post(url, body) {
    const res = await ajax('post', url, body)
    return res
  },
  async patch(url, body) {
    const res = await ajax('patch', url, body)
    return res
  },
  async del(url, body) {
    const res = await ajax('delete', url, body)
    return res
  },
}

写接口测试用例

代码语言:javascript
复制
// __test__\apis\db-check.js

// 获取 get 请求
const { get } = require('./_server')

test('数据库连接', async () => {

  // 获取数据
  const { data, errno } = await get('/api/db-check')

  const { redisConn, mysqlConn, mongodbConn } = data

  expect(errno).toBe(0)
  expect(redisConn).toBe(true)
  expect(mysqlConn).toBe(true)
  expect(mongodbConn).toBe(true)
})

测试入口文件

这个文件就是把所有的接口测试都集成到这里了。

代码语言:javascript
复制
// __test__\apis\index.test.js

require('./db-check')

开始测试

控制台执行 npm run test:local,可以看到单元测试和接口测试全部都通过了。

image.png
image.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Jest
    • 安装
      • 测试 demo
        • 控制台执行 npm run test:local
        • supertest 接口测试
          • 安装
            • 本地测试
              • 远程测试
                • 和单元测试的关系
                  • 代码演示
                    • 安装插件
                    • 添加测试命令
                    • 封装请求
                    • 写接口测试用例
                    • 测试入口文件
                    • 开始测试
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档