当前位置: 首页 > news >正文

NodeJs如何做API接口单元测试? --【elpis全栈项目】

NodeJs API接口单元测试

api单元测试需要用到的

  • assert:断言库 (还要一些断言库比如:Chai)
  • supertest: 模拟http请求

简单的例子:

const express = require('express');
const supertest = require('supertest');
const assert = require('assert');// 创建一个 Express 应用
const app = express();
app.get('/api/user', (req, res) => {res.status(200).json({ name: 'John Doe' });
});// 测试用例
describe('GET /api/user', () => {it('应该返回用户信息', async () => {const request = supertest(app)const res = await request().get('/api/user') // 发送 GET 请求.set('Accept', 'application/json') // 设置请求头.expect('Content-Type', /json/) // 验证响应头.expect(200); // 验证状态码// 验证响应体assert.strictEqual(res.body.name, 'John Doe');});
});

一、 断言


  1. Node.js 有内置的断言模块assert,用于在代码中验证某些条件是否为真。如果条件不满足,assert 会抛出一个 AssertionError,导致测试失败。

    简单介绍一些NodeJs内置的断言assert的一些属性方法:
    1. assert.ok(value[, message]) 可以直接简写为assert() 验证value 是否为真
      • assert.ok(1); // 通过
      • assert.ok(0, '值不能为 0'); // 抛出 AssertionError,错误信息为 “值不能为 0”
    2. assert.strictEqual(actual, expected[, message]) 验证是否 严格相等(===)
      • assert.strictEqual(1, 1); // 通过
    3. assert.notStrictEqual(actual, expected[, message]) 验证是否 不严格相等(!==)
    4. assert.deepStrictEqual(actual, expected[, message]) 验证是否 深度严格相等(适用于对象或数组)
      • assert.deepStrictEqual({ a: 1 }, { a: '1' }); // 抛出 AssertionError,因为类型不同
    5. assert.notDeepStrictEqual(actual, expected[, message]) 验证是否 深度不严格相等(上面的例子不会抛错)
    6. assert.equal(actual, expected[, message]) 验证是否 相等(==,非严格相等)
    7. assert.notEqual(actual, expected[, message]) 验证是否不相等(!=,非严格相等)
    8. assert.throws(block[, error][, message]) 验证 block 函数是否会 抛出错误
     assert.throws(() => {throw new Error('错误信息');},Error, // 验证错误类型'未抛出预期错误' // 自定义错误信息
    );
    
    1. assert.doesNotThrow(block[, error][, message]) 验证 block 函数是否 不会抛出错误
    2. assert.fail([message]) 强制抛出一个 AssertionError,标记测试失败assert.fail('测试失败')
    3. 总之: assert 是 Node.js 内置的断言模块,适合简单的测试场景。如果需要更丰富的功能和更友好的语法,可以考虑使用 chai 等第三方断言库。
  2. 还有一些第三方库,比如chai,它支持多种风格的断言。Chai是一个可以在node和浏览器环境运行的 BDD/TDD 断言库,可以和任何JavaScript测试框架结合。

按使用风格:

  • assert 风格:类似于 Node.js 内置的 assert,但功能更强大。
  • expect 风格:链式语法,可读性更高。
  • should 风格:基于原型链的语法,适合 BDD(行为驱动开发)。
// assert 风格
assert(res.body.success === true)// expect 风格
expect(1 + 1).to.equal(2);
expect({ a: 1 }).to.deep.equal({ a: 1 });// should 风格
chai.should();
(1 + 1).should.equal(2);

按测试风格:

  • BDD(Behavior Driven Development行为驱动开发):是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作(做正确的事)

  • TDD(Test-Driven Development测试驱动开发): 测试先于编写代码的思想用于指导软件开发(正确的做事)

    expect和should是BDD风格的。两者使用相同的语言链

    • expect使用构造函数来创建断言对象实例
    • should使用Object.prototype提供一个getter方法来实现,不兼容IE

    assert属于TDD

    • 除语法糖外,assert和node.js的非常相似,assert是三种断言风格唯一不支持链式调用的

chai详细介绍:学习Chai断言库

二、 supertest, 用于测试 HTTP 服务的库


supertest 是一个用于测试 HTTP 服务的 Node.js 库,特别适合测试 Express 或其他基于 Node.js 的 Web 服务器。它提供了简洁的 API 来构造和发送 HTTP 请求,并验证响应结果。supertest 通常与测试框架(如 Mocha、Jest 等)结合使用,用于编写端到端(E2E)测试或集成测试。

...
// 测试用例
describe('GET /api/user', () => {it('应该返回用户信息', async () => {const request = supertest(app)const res = await request().get('/api/user') // 发送 GET 请求.set('Accept', 'application/json') // 设置请求头.expect('Content-Type', /json/) // expect属于supertest内置断言,验证响应头.expect(200); // supertest内置断言,验证状态码});
});
...

下面列举一些supertest属性方法:

  1. 构造请求
    • .get(url):发送 GET 请求。
    • .post(url):发送 POST 请求。
    • .put(url):发送 PUT 请求。
    • .delete(url):发送 DELETE 请求。
    • .patch(url):发送 PATCH 请求。
    • .head(url):发送 HEAD 请求。
  2. 设置请求头, .set(field, value) 例如:
    • .set('Authorization', 'Bearer token') // 设置 Authorization 头
    • .set('Accept', 'application/json'); // 设置 Accept 头
  3. 发送请求体,使用.send(data)方法可以发送请求体,适用于 POST、PUT 等请求。
    • .send({ name: 'John', age: 30 })
  4. 设置查询参数, 使用.query(params)方法可以设置查询参数。
    • .query({ page: 1, limit: 10 }); // 设置查询参数 ?page=1&limit=10
  5. 设置请求类型, 使用.type(type)方法可以设置请求的 Content-Type
    • .type('json') // 设置 Content-Type 为 application/json
    • .type('form') // 设置 Content-Type 为 application/x-www-form-urlencoded
    • .type('text') // 设置 Content-Type 为 text/plain
  6. 文件上传, 使用 .attach(field, file) 方法可以上传文件。
    • .attach('file', 'path/to/file.txt'); // 上传文件
  7. 验证响应, 内置了.expect(...)方法,与第三方断言库库chai的expect作用类似,只是supertest的内置方法更专注于 HTTP 响应的验证, 而 chai 的 expect 是一个通用的断言库,适用于更广泛的场景。
    • .expect(status):验证状态码。
    • .expect(header, value):验证响应头。
    • .expect(body):验证响应体。
    • .expect(function(res) { ... }):自定义验证逻辑。
  8. 处理响应,使用 .end(callback) 方法可以处理响应结果。
    • .get('/api/data').end((err, res) => { if (err) throw err; ...})
  9. 超时设置, 使用.timeout(ms)方法可以设置请求的超时时间。
  10. 重定向, 使用 .redirects(n) 方法可以设置最大重定向次数。
    • .redirects(2) // 最多允许 2 次重定向
  11. Cookie, 使用 .set('Cookie', cookie) 方法可以设置请求的 Cookie。
  12. 自定义 Agent, 使用 .agent() 方法可以创建一个自定义的 superagent 实例,用于保持会话
const agent = request.agent(app);agent.post('/api/login').send({ username: 'john', password: '123456' }).end((err, res) => {if (err) throw err;agent.get('/api/data').end((err, res) => {if (err) throw err;console.log(res.body);});});
  1. 响应对象属性, 在 .end().expect() 的回调函数中,可以访问响应对象的属性。
 .end((err, res) => {if (err) throw err;console.log(res.status); // 状态码console.log(res.headers['content-type']); // 响应头console.log(res.body); // 响应体console.log( res.text); // 原始响应文本。});

三、完整配置


我在项目中的配置:(也不全,简单参考一下)

const assert = require('assert');
const supertest = require('supertest');
const md5 = require('md5');
const elpisCore = require('../../elpis-core')const signKey = '620b048b-8ac3-431b-845d-bcaf63ecc738'
const st = Date.now();describe('测试 project 相关接口', function () {this.timeout(60000);let request;it('启动服务', async () => {const app = await elpisCore.start();request = supertest(app.listen());});it('GET /api/project/model_list', async () => {let tmpRequest = request.get('/api/project/model_list');tmpRequest = tmpRequest.set('s_t', st);tmpRequest = tmpRequest.set('s_sign', md5(`${signKey}_${st}`))const res = await tmpRequest;assert(res.body.success === true)const resData = res.body.data;assert(resData.length > 0);for (let i = 0; i < resData.length; i++) {const item = resData[i];assert(item.model);assert(item.model.key);assert(item.model.name);assert(item.project);for (const projKey in item.project) {assert(item.project[projKey].key);assert(item.project[projKey].name);}}});})

相关文章:

NodeJs如何做API接口单元测试? --【elpis全栈项目】

NodeJs API接口单元测试 api单元测试需要用到的 assert&#xff1a;断言库 (还要一些断言库比如:Chai)supertest&#xff1a; 模拟http请求 简单的例子&#xff1a; const express require(express); const supertest require(supertest); const assert require(assert);…...

bundletool来特定设备规范的json安装aab包

1、获取自己设备的设备规范json java -jar ./bundletool.jar get-device-spec --outputj:/device-spec.json 2、根据设备规范生成apks包 java -jar ./bundletool.jar build-apks --device-specj:/device-spec.json --bundleapp-dev-release.aab --output随便的文件名.apks -…...

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数

快速分解质因数 完整题目和在线测评可点击下方链接前往&#xff1a; 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找&#xff0c;题…...

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…...

chrome游览器JSON Formatter插件无效问题排查,FastJsonHttpMessageConverter导致Content-Type返回不正确

问题描述 chrome游览器又一款JSON插件叫JSON Formatter&#xff0c;游览器GET请求调用接口时&#xff0c;如果返回的数据是json格式&#xff0c;则会自动格式化展示&#xff0c;类似这样&#xff1a; 但是今天突然发现怎么也格式化不了&#xff0c;打开一个json文件倒是可以格…...

[Qt]系统相关-网络编程-TCP、UDP、HTTP协议

目录 前言 一、UDP网络编程 1.Qt项目文件 2.UDP类 QUdpSocket QNetworkDatagram 3.UDP回显服务器案例 细节 服务器设计 客户端设计 二、TCP网络编程 1.TCP类 QTcpServer QTcpSocket 2.TCP回显服务器案例 细节 服务器设计 客户端设计 三、HTTP客户端 1.HTTP…...

docker 安装 nginx 详解

在平常的开发工作中&#xff0c;我们经常会用到 nginx&#xff0c;那么在 docker 中 如何安装 nginx呢&#xff1f;又有哪些需要注意的事项呢&#xff1f;简单来说&#xff0c;第一步&#xff1a;拉取 nginx 镜像&#xff1b;第二步&#xff1a;创建 挂载目录并设置 nginx.conf…...

2025年大模型气象预测架构与商业化影响

随着人工智能技术,尤其是大模型(如深度学习、大规模神经网络)的飞速发展,气象预测的传统方法正在经历深刻变革。2025年,气象预测将借助大模型技术进入一个新的阶段。本文将从架构角度详细探讨2025年大模型在气象预测中的应用,并分析其对商业化的潜在影响。 一、2025年大模…...

基于51单片机和ESP8266(01S)、八位数码管、独立按键的WiFi定时器时钟

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、延时函数2、定时器03、串口4、数码管扫描5、独立按键扫描 四、主函数总结 系列文章目录 前言 有三个版本&#xff1a; ①普中开发板版本1&#xff1a;28800bps11.0592MHz&#xff0c;12T ②普中开发板版本2&am…...

Androidstudio 中,project下的.gitignore和module下的.gitignore有什么区别,生效优先级是什么

在 Android Studio 项目中&#xff0c;project 根目录下的 .gitignore 文件和 module 目录下的 .gitignore 文件作用和生效优先级是不同的&#xff0c;理解它们之间的区别非常重要&#xff0c;可以避免不必要的提交和冲突。 1. project 根目录下的 .gitignore&#xff1a; 作…...

python学习笔记3-字符串常用的方法

一、判断&#xff08;9个&#xff09;&#xff1a; 二、查找和替换&#xff08;8个&#xff09; 三、⼤⼩写转换&#xff08;5个&#xff09; 四、⽂本对⻬&#xff08;3个&#xff09; 五、去除空⽩字符&#xff08;3个&#xff09; 六、拆分和连接 &#xff08;6个&#xff0…...

提示词工程(Prompt Engineering)

1. Prompt 是什么&#xff1f; Prompt&#xff1a;提示词&#xff0c;是描述 AI 需要执行的任务的自然语言文本。 如上图所示&#xff0c;Prompt就是用户的提问。其实我们大家都用过Prompt&#xff0c;比如我们使用的ChatGPT、文心一言、豆包等AI产品时的提问就是Prompt&…...

后端开发Web

Maven Maven是apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具 Maven的作用 依赖管理 方便快捷的管理项目依赖的资源&#xff08;jar包&#xff09;&#xff0c;避免版本冲突问题 统一项目结构 提供标准、统一的项目结构 项目构建 标准跨平台(…...

set和map(二)详解

文章目录 mapoperator[ ]的底层operator[ ]使用的实例 multimapequal_range 两道题目题目解析算法原理代码题目解析算法原理代码 map map和set大部分都相似&#xff0c;只有insert插入键值对不同&#xff0c;insert要插入pair,pair中有key和value。erase和find只与key有关&…...

第4章:Python TDD消除重复与降低依赖实践

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…...

vue3+uniapp开发鸿蒙初体验

去年7月20号&#xff0c;uniapp官网就已经开始支持鸿蒙应用开发了&#xff0c;话不多说&#xff0c;按照现有规则进行配置实现一下鸿蒙开发效果&#xff1b; 本文基于macOS Monterey 版本 12.6.5实现 开发鸿蒙的前置准备 这里就直接说我的版本&#xff1a; DevEco Studio 5.…...

Android四种方式刷新View

Android四种方式刷新View 1.前言&#xff1a; 最近在切换主题时有个TextView是Gone的状态&#xff0c;切换主题后内容没有显示&#xff0c;于是排查代码&#xff0c;刚开始以为是textView没有设置内容&#xff0c;但是打印日志和排查发现有setText. 2.View.VISIBLE与View.GO…...

【数学建模美赛速成系列】O奖论文绘图复现代码

文章目录 引言折线图 带误差棒得折线图单个带误差棒得折线图立体饼图完整复现代码 引言 美赛的绘图是非常重要得&#xff0c;这篇文章给大家分享我自己复现2024年美赛O奖优秀论文得代码&#xff0c;基于Matalab来实现&#xff0c;可以直接运行出图。 折线图 % MATLAB 官方整理…...

【27】Word:徐雅雯-艺术史文章❗

目录 题目​ NO1.2 NO3 NO4 NO5 NO6.7 NO8.9 NO10.11 注意&#xff1a;修改样式的字体颜色/字号&#xff0c;若中英文一致&#xff0c;选择所有脚本。格式相似的文本→检查多选/漏选格式刷F4重复上一步操作请❗每一步检查和保存 题目 NO1.2 F12另存为布局→行号布局…...

基于2D工程图几何特征与梯度提升模型的制造成本智能预测

1. 项目概述&#xff1a;从图纸到报价的智能革命在制造业&#xff0c;尤其是像汽车零部件这样的离散制造领域&#xff0c;报价速度直接决定了订单的生死。传统上&#xff0c;拿到一张新的2D工程图&#xff08;DWG格式&#xff09;&#xff0c;成本工程师需要花上几天甚至几周时…...

适合地产人用的中介房源管理系统

在房产经纪行业&#xff0c;房源管理与客源管理是经纪人日常工作的核心&#xff0c;直接影响业务效率与成交转化。选择一套适配行业需求的中介房源管理系统&#xff0c;能帮助中介团队规范流程、降低运营成本、大幅提升业绩。今天我们以客观视角&#xff0c;详细解析全房源系统…...

Taotoken平台快速获取APIKey并开始你的第一个Python调用示例

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken平台快速获取APIKey并开始你的第一个Python调用示例 1. 准备工作&#xff1a;注册与登录 要开始使用Taotoken&#xff0c…...

从零到上机:我的第一个Quest 3空间锚点应用是如何跑起来的(附完整Unity工程)

从零到上机&#xff1a;我的第一个Quest 3空间锚点应用是如何跑起来的&#xff08;附完整Unity工程&#xff09;第一次戴上Meta Quest 3时&#xff0c;那种虚拟与现实交织的震撼感至今难忘。但作为开发者&#xff0c;更让我着迷的是如何让虚拟物体在真实空间中"记住"…...

破解材料数据荒:合成数据与随机森林预测聚合物阻燃性能

1. 项目概述与核心挑战在材料研发领域&#xff0c;尤其是涉及公共安全的聚合物阻燃性研究&#xff0c;传统实验方法正面临巨大瓶颈。想象一下&#xff0c;你是一位材料工程师&#xff0c;需要设计一种用于高铁内饰或高层建筑电缆护套的新型聚合物&#xff0c;其阻燃性能必须满足…...

网飞成立 AI 动画工作室,开启流媒体“原生 AI 制片时代”,中外布局逻辑有何不同?

1. Netflix“偷跑”在影视巨头关于 AIGC 的军备竞赛中&#xff0c;Netflix 再次加速。据外媒 TheVerge 报道&#xff0c;网飞于今年 3 月成立了名为 "INKubator" 的工作室&#xff0c;这是全球流媒体巨头中首个以生成式人工智能为核心的动画制作部门。此动作引发全球…...

2026论文顶级降AI率工具大曝光:一键把AIGC率降至安全线!

步入2026年&#xff0c;学术圈的规则已经彻底变了味。过去那种只盯着查重率的“降重焦虑”早就被更可怕的“降AI焦虑”取代了。AI检测算法越来越聪明&#xff0c;高校审核标准也越来越严苛&#xff0c;光是把重复率压下去已经完全不够用了。现在摆在学生和科研人员面前的难题是…...

别再瞎拖拽了!Unity Prefab从创建到批量修改的保姆级工作流(含变体与嵌套实战)

Unity Prefab高效工作流&#xff1a;从创建到批量修改的实战指南在Unity项目开发中&#xff0c;Prefab&#xff08;预制体&#xff09;是最基础也最强大的工具之一。但很多开发者&#xff0c;尤其是初学者&#xff0c;往往停留在简单的"拖拽-修改"阶段&#xff0c;没…...

Python-for-Android 完整指南:5分钟将Python应用打包为Android APK

Python-for-Android 完整指南&#xff1a;5分钟将Python应用打包为Android APK 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android Python-for-Android&#xff0…...

如何用免费工具解锁QQ音乐、网易云音乐等加密格式:3分钟解决音乐播放限制

如何用免费工具解锁QQ音乐、网易云音乐等加密格式&#xff1a;3分钟解决音乐播放限制 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web…...