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

【Express.js】软件测试

软件测试

本节介绍如何在 express.js 使用 Jest 进行单元测试

准备工作

  1. 准备一个基础的 express 项目,本文基于 evp-express-cli
  2. 安装 Jest
npm install jest --save-dev
  1. 生成 Jest 配置
npx jest --init

编写测试

创建测试文件,以 .test.js 后缀命名,Jest 在运行期间会自动查找并执行符合 *.test.js 命名的文件,为规范起见,新建一个 test 目录,存放所有的测试文件。

编写第一个测试

  1. 先准备一个要被测试的函数 sum(a, b),写在 src/uitls/index.js 中:
module.exports = {/*** Return the result of the sum of a and b.* @function* @param {number} a * @param {number} b * @returns {number}*/sum: (a, b) => {return a + b;}
}
  1. test 目录下创建 sum.test.js,引入 sum 并编写测试代码:
const { sum } = require('../src/utils');describe('test demo', () => {test('sum test', () => {expect(sum(1, 2)).toBe(3);})
})

toBe() 可以简单得判断相等,类似于 assertEqual,Jest 的具体语法本文不做介绍,自行查阅,其它测试框架如 mocha.js 的语法也是类似的。
3. 执行测试

npx jest

得到结果:

 PASS  test/sum.test.jstest demo√ sum test (2 ms)----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 | index.js |     100 |      100 |     100 |     100 | 
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.58 s, estimated 1 s

对路由进行测试

现在我们尝试对路由进行测试,先安装 supertest

npm install supertest --save-dev

test 目录创建 router.test.js,引入 express app 和 supertest:

const request = require('supertest');
const app = require('../src/app');

接着争对 src/router/index.js 中定义的 / 路由进行测试:

describe('router test', () => {it('GET /', () => {request(app).get('/').expect('Content-Type', /json/).expect(200).then(res => {expect(res.body).toStrictEqual({ok: true, msg: 'Hello World!', data: null, symbol: 1, type: 'Ok' });}).catch(err => console.error(err));})
})

toStrictEqual 用于判断对象的严格相等;对路由测试需要用到 supertest 传入 app,然后对其 / 路由发起 GET 请求,因为请求过程是异步的,所以对响应结果的测试写在 then 回调中,当然你也可以把测试函数写成 async-await 语法糖;这个路由不需要传递任何数据,如果你需要携带数据,可以使用 send (x-www-form-urlencoded), set (请求头), field (multipart-form)等,具体用法请自行查阅 supertest 文档。

接下来执行测试:

npx jest

得到结果:

 PASS  test/sum.test.js   PASS  test/router.test.js
---------------|---------|----------|---------|---------|------------------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
---------------|---------|----------|---------|---------|------------------------------
All files      |   62.93 |       60 |      30 |   62.93 |                              src           |   71.76 |    66.66 |     100 |   71.76 |                              app.js       |     100 |      100 |     100 |     100 |                              config.js    |   66.66 |    66.66 |     100 |   66.66 | 36-59                        src/midwares  |   30.18 |      100 |       0 |   30.18 | exhandler.js |   30.18 |      100 |       0 |   30.18 | 7-12,16-22,26-43,47-52      src/model     |      50 |        0 |       0 |      50 | resp.js      |      50 |        0 |       0 |      50 | 4-10,19-25,29-31,35-37,41-43src/router    |   83.33 |      100 |     100 |   83.33 | index.js     |   83.33 |      100 |     100 |   83.33 | 8-9src/utils     |     100 |      100 |     100 |     100 | index.js     |     100 |      100 |     100 |     100 | logger.js    |     100 |      100 |     100 |     100 | 
---------------|---------|----------|---------|---------|------------------------------Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        2.054 s
Ran all test suites.
[2023-08-06 18:43:20] INFO Hello World!

如果你只想执行 router.test.js,则在后边指定要执行的测试文件即可:

npx jest test/router.test.js

下一节-软件构建

相关文章:

【Express.js】软件测试

软件测试 本节介绍如何在 express.js 使用 Jest 进行单元测试 准备工作 准备一个基础的 express 项目,本文基于 evp-express-cli安装 Jest npm install jest --save-dev生成 Jest 配置 npx jest --init编写测试 创建测试文件,以 .test.js 后缀命名…...

TCP三次握手、四次握手过程,以及原因分析

TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。 四次挥手&…...

OceanBase X Flink 基于原生分布式数据库构建实时计算解决方案

摘要:本文整理自 OceanBase 架构师周跃跃,在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为四个部分: 分布式数据库 OceanBase 关键技术解读 生态对接以及典型应用场景 OceanBase X Flink 在游戏行业实践 未来展望 点击…...

600V EasyPIM™ IGBT模块FB30R06W1E3、FB20R06W1E3B11、FB20R06W1E3降低了系统成本和损耗,可满足高能效要求。

EasyPIM™ IGBT模块是一种三相输入整流器PIM IGBT模块,采用TRENCHSTOP™ IGBT7、发射器控制7二极管和NTC/PressFIT技术。该模块具有增强的dv/dt可控性、改进的FWD软度、优化的开关损耗以及8μs短路稳定性。EasyPIM(功率集成模块)外形非常小巧…...

form 表单恢复初始数据

写表单的时候&#xff0c;想做到&#xff0c;某个操作时&#xff0c;表单恢复初始数据 this.$options.data().form form 是表单的对象 <template><div><el-dialog title"提示" :visible.sync"dialogVisible"><el-form :model"…...

MySQL—索引

这里写目录标题 索引是什么? 索引优缺点?MySQL索引类型索引底层实现? 为什么使用B树, 而不是B树, BST, AVL, 红黑树等等?什么是聚簇索引和非聚簇索引?非聚簇索引一定会回表吗?什么是联合索引?为什么需要注意联合索引中的字段顺序?什么是最左前缀原则?什么是前缀索引?…...

Android图形-合成与显示-概论

目录 引言 概念与理解 SurfaceFlinger Surface HWC Fence&#xff1a; Gralloc&#xff1a; DisplayDevice 引言 Activity是Android的主要UI相关组件。通过View的相关类和接口实现&#xff0c;在WMS的管理下&#xff0c;进行窗口和控件的测量&#xff0c;布局和绘制&am…...

Swift 5 数组如何获取集合的索引和对应的元素值

Swift 5 数组如何获取集合的索引和对应的元素值 在Swift 5中&#xff0c;你可以使用enumerated()方法来获取集合的索引和对应的元素值。这个方法会返回一个包含索引和元素的元组数组。以下是使用enumerated()方法来获取一个数组的索引和元素的示例&#xff1a; let array [1…...

计算 Nginx 日志的PV和UV

计算 Nginx 日志的 PV&#xff08;页面浏览量&#xff09;和 UV&#xff08;独立访客数&#xff09;&#xff0c;你需要使用一些工具和技术。 PV&#xff08;页面浏览量&#xff09;是指网站的所有页面被访问的总次数&#xff0c;而 UV&#xff08;独立访客数&#xff09;则是指…...

Spring中常用的注解

1.声明Bean的注解(标注在类上) Component&#xff1a;表示普通的组件&#xff0c;也可泛指下面三种组件。Controller&#xff1a;控制层。Service&#xff1a;业务逻辑层。Repository&#xff1a;数据访问层。 2.Bean的生命周期的注解 Scope表示设置Spring是如何创建Bean的…...

Plugin 插件

Plugin 插件 插件是 webpack 的支柱功能。插件目的在于解决 loader 无法实现的其他事。Webpack 提供很多开箱即用的插件。 常用插件 clean-webpack-plugin 自动清理输出目录 html-webpack-plugin 自动生成使用 bundle.js 的 HTML copy-webpack-plugin 拷贝文件到输出目…...

Structure needs cleaning fsimage文件系统损坏修复

最近清除数据的时候发现有些文件无法rm [rootnode101 application_1691504014432_0002]# rm -rf ls:* [rootnode101 application_1691504014432_0002]# ls ls: 无法访问flink-dist-cache-8f72398e-9254-42d4-a14d-a0def99b493d: Structure needs cleaning以下操作可能会删除文件…...

MATLAB|信号处理的Simulink搭建与研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

LinuxC编程——线程

目录 一、概念二、进程与线程的区别⭐⭐⭐三、线程资源四、函数接口4.1 线程创建4.2 线程退出4.3 线程回收4.3.1 阻塞回收4.3.2 非阻塞回收 4.4 pthread_create之传参4.5 练习 一、概念 是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程。 进程与线程都参与cpu的统一…...

使用fetch调用fastapi接口(post)的实例

前端代码 //定义函数 async function sendRequest(data) {let myurl"http://127.0.0.1:8848/get_student_info"const response await fetch(myurl, {method: POST,mode: cors, // 执行跨域请求headers: {Content-Type: application/json, },body: JSON.st…...

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型&#xff0c;包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例&#xff0c;以…...

Django-------自定义命令

每次在启动Django服务之前&#xff0c;我们都会在终端运行python manage.py xxx的管理命令。其实我们还可以自定义管理命令&#xff0c;这对于执行独立的脚本或任务非常有用&#xff0c;比如清除缓存、导出用户邮件清单或发送邮件等等。 自定义的管理命令不仅可以通过manage.p…...

【Linux】在浏览器输入网址后发生了什么事情?

在浏览器输入网址后发生了什么事情&#xff1f; 1.域名解析2.建立TCP连接3.发出HTTP请求4.响应请求5.TCP断开连接6.解析资源和布局渲染 其实我们在浏览器输入网址后&#xff0c;发生了如下的事情 1.域名解析 由于计算机是无法识别我们输入的地址的&#xff0c;那么就需要将当前…...

推荐两本书《JavaRoadmap》、《JustCC》

《JavaRoadmap》 前言 本书的受众 如果你是一名有开发经验的程序员&#xff0c;对 Java 语言语法也有所了解&#xff0c;但是却一直觉得自己没有入门&#xff0c;那么希望这本书能帮你打通 Java 语言的任督二脉。 本书的定位 它不是一本大而全的书&#xff0c;而是一本打通、…...

使用基于jvm-sandbox的对三层嵌套类型的改造

使用基于jvm-sandbox的对三层嵌套类型的改造 问题背景 先简单介绍下基于jvm-sandbox的imock工具&#xff0c;是Java方法级别的mock&#xff0c;操作就是监听指定方法&#xff0c;返回指定的mock内容。 jvm-sandbox 利用字节码操作和自定义类加载器的技术&#xff0c;将原始方法…...

OpenClaw+Qwen3-14B数据安全方案:敏感文件本地自动化处理

OpenClawQwen3-14B数据安全方案&#xff1a;敏感文件本地自动化处理 1. 为什么需要本地化的数据安全方案 去年我在处理公司季度财报时遇到一个棘手问题&#xff1a;需要将几十份PDF报表中的关键数据提取出来做交叉分析&#xff0c;但内容涉及商业机密&#xff0c;不敢直接上传…...

化工园区智慧巡检平台

化工园区智慧巡检平台概述化工园区智慧巡检平台通过物联网、大数据、人工智能等技术&#xff0c;实现巡检流程数字化、智能化&#xff0c;提升安全性和效率。平台通常涵盖设备监控、隐患识别、数据分析、应急响应等功能&#xff0c;助力园区管理降本增效。核心功能模块实时监控…...

2026年AI标书工具哪个最好用?钛投标一周年感恩回馈

钛投标一周年感恩回馈&#xff1a;致敬20万老用户&#xff01;生成标书即抽天猫卡与23万份免单券2026年AI标书工具哪个最好用&#xff1f;感谢20万企业的信赖&#xff0c;行业标杆钛投标迎来一周年庆典&#xff01;为回馈老用户的一路相伴&#xff0c;4月3日起开启千万级宠粉狂…...

DeepMosaics完整教程:3步掌握AI智能马赛克处理技术

DeepMosaics完整教程&#xff1a;3步掌握AI智能马赛克处理技术 【免费下载链接】DeepMosaics Automatically remove the mosaics in images and videos, or add mosaics to them. 项目地址: https://gitcode.com/gh_mirrors/de/DeepMosaics 还在为图片视频中的隐私保护问…...

FanControl智能调控指南:从噪音优化到硬件保护的全方位解决方案

FanControl智能调控指南&#xff1a;从噪音优化到硬件保护的全方位解决方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…...

最新付费进群系统源码 V4.1全开源版本源码 附教程

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 最新付费进群系统源码 V4.1全开源版本源码 附教程 亲测可用 付费进群系统是一种基于互联网的社群管理工具&#xff0c;用户通过支付一定费用后获得加入特定群组的权限。这种系统通常用于知识分享、资源下…...

西门子SMART控制三伺服程序

西门子SMART控制三伺服程序最近在调试西门子SMART系列PLC控制三轴伺服的项目&#xff0c;发现运动控制这块儿藏着不少实用技巧。这次用的CPU是SR60&#xff0c;搭配三个V90伺服做同步搬运&#xff0c;现场调试完感觉可以和大家唠唠具体实现方法。先上段基础配置代码热热身&…...

手把手教你用Local SDXL-Turbo:从零到一的AI绘画实战

手把手教你用Local SDXL-Turbo&#xff1a;从零到一的AI绘画实战 【一键部署镜像】⚡ Local SDXL-Turbo 基于StabilityAI SDXL-Turbo的毫秒级实时绘画工具 支持流式提示词编辑、所见即所得构图、512512高清输出 想象一下&#xff1a;你刚输入"a futuristic city"&a…...

MySQL 8.0 新版专用参数优化实战:吃透新特性,榨干数据库极限性能

本文原创首发 CSDN&#xff0c;聚焦 MySQL 8.0 专属优化特性&#xff0c;拒绝照搬 5.7 通用配置&#xff0c;所有参数均经过生产环境验证&#xff0c;高并发场景实测 TPS 提升 30%&#xff0c;主从延迟降至毫秒级。摘要很多 DBA 和运维同学升级 MySQL 8.0 后&#xff0c;直接照…...

收银系统搭建难点解决方法

收银系统是现代零售、餐饮等行业的核心工具&#xff0c;能提升效率、减少错误。但搭建过程中常面临技术难点&#xff0c;如支付集成、安全合规等。本文基于实际实践&#xff0c;提供解决方法&#xff0c;帮助读者从零构建高效系统。需求分析难点及解决需求模糊或冲突是常见难点…...